diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java index ef688acfd700a53bd671f26a9c39d3f830908f04..b588e7dd75fab751d58697ed81688ed72ef611f9 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java @@ -210,39 +210,76 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD */ public QueryBuilder setOrNot(String set, String from, String until) { + QueryBuilder query; QueryBuilder rangeQuery = QueryBuilders.rangeQuery(this.rangeField).from(from).to(until); + // TODO Make format configurable in OAI-PMH config! QueryBuilder formatQuery = QueryBuilders.matchPhrasePrefixQuery("format", this.formatToFilter); - QueryBuilder query; + QueryBuilder setQuery = null; if (set != null) { String queryField = ""; String valueField = ""; - if (this.dariah == true) { - queryField = "descriptiveMetadata.dc:relation"; + // ** + // DARIAH + // ** + + if (this.dariah) { + // TODO Make format configurable in OAI-PMH config (add relationField as in + // SetListDeliverer class?)! + queryField = "administrativeMetadata.dcterms:relation"; valueField = set; + + // Add record with set metadata in it (to also find root collection metadata in Repository + // Search!) + // FIXME Put query field into config! + if (!set.isEmpty()) { + setQuery = QueryBuilders.matchQuery("administrativeMetadata.dcterms:identifier", + this.specFieldPrefix + set); + + log.fine("set query: " + setQuery.getName() + " -> " + setQuery.toString()); + } } - if (this.textgrid == true) { + // ** + // TEXTGRID + // ** + + else if (this.textgrid) { String[] setParts = set.split(":"); if (setParts[0].equals("project")) { + // FIXME Put query field into config! queryField = "project.id"; valueField = setParts[1]; } } QueryBuilder matchQuery = QueryBuilders.matchPhraseQuery(queryField, valueField); + if (this.dariah) { query = matchQuery; + + // "should" means OR here, "must" means AND! So we get: setQuery OR ( rangeQuery AND + // matchQuery )! The order of should's do matter here! + if (setQuery != null) { + QueryBuilder boolQuery = QueryBuilders.boolQuery().must(rangeQuery).must(matchQuery); + query = QueryBuilders.boolQuery().should(setQuery).should(boolQuery); + + log.fine("query: " + boolQuery.getName() + " -> " + boolQuery.toString()); + } } else { query = QueryBuilders.boolQuery().must(matchQuery).must(formatQuery).must(rangeQuery); } - } else { - if (this.dariah == true) + } + + // Set == null! + else { + if (this.dariah) { query = rangeQuery; - else + } else { query = QueryBuilders.boolQuery().must(rangeQuery).must(formatQuery); + } } return query; diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java index 3467e0d7a83162d8c8184d824a52c31a7e51a482..c513a91e59c0f9cd1b893d3eb2930c9efac2e444 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHUtilities.java @@ -609,7 +609,7 @@ public class OAIPMHUtilities { result.setIdentifier(identifier); result.setDatestamp(dateOfCreation); - log.info( + log.finer( "Header (DoC / ID / setSpec): " + dateOfCreation + " / " + identifier + " / " + setSpec); if (setSpec != null && !setSpec.isEmpty()) { diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java index 2c0793b4b47d3fc66078e6733db9df4c5fdca071..6b0e149b865213836734a1f7884f10edb2063e24 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java @@ -275,8 +275,6 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { recordList.setResumptionToken(resTokenForResponse); - // } - } else { @@ -297,6 +295,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { ListRecordsType recordList = new ListRecordsType(); QueryBuilder query; QueryBuilder rangeQuery = QueryBuilders.rangeQuery(this.rangeField).from(from).to(to); + QueryBuilder setQuery = null; if (set != null) { String queryField = ""; @@ -306,29 +305,27 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { // DARIAH // ** - if (this.dariah == true) { + if (this.dariah) { // FIXME Put query field into config! queryField = "administrativeMetadata.dcterms:relation"; valueField = set; - // Add record with set metadata in it (to also find collection metadata in Repository + // Add record with set metadata in it (to also find root collection metadata in Repository // Search!) - // FIXME Must be done WITH THE QUERY. We must add it here, since it results in 101 records - // if we do add it below! - // FIXME Put query field into config! - // if (!set.isEmpty()) { - // QueryBuilder setQuery = QueryBuilders - // .matchQuery("administrativeMetadata.dcterms:identifier", this.specFieldPrefix + set); - // fetchFields(QueryBuilders.boolQuery().must(setQuery), recordList, resumptionToken, set); - // } + if (!set.isEmpty()) { + setQuery = QueryBuilders.matchQuery("administrativeMetadata.dcterms:identifier", + this.specFieldPrefix + set); + + log.fine("set query: " + setQuery.getName() + " -> " + setQuery.toString()); + } } // ** // TEXTGRID // ** - if (this.textgrid == true) { + else if (this.textgrid) { String[] setParts = set.split(":"); if (setParts[0].equals("project")) { // FIXME Put query field into config! @@ -339,9 +336,17 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { QueryBuilder matchQuery = QueryBuilders.matchPhraseQuery(queryField, valueField); QueryBuilder boolQuery = QueryBuilders.boolQuery().must(rangeQuery).must(matchQuery); + // "should" means OR here, "must" means AND! So we get: setQuery OR ( rangeQuery AND + // matchQuery )! The order of should's do matter here! + if (setQuery != null) { + boolQuery = QueryBuilders.boolQuery().should(setQuery).should(boolQuery); + + log.fine("bool query: " + boolQuery.getName() + " -> " + boolQuery.toString()); + } query = boolQuery; } + // Set == null! else { query = rangeQuery;