From bac0ed28aa08646d0af20e6658835b501c39f005 Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Wed, 20 May 2020 22:56:22 +0200 Subject: [PATCH] [SEARCH-2166] added support for order by code refactoring --- .../alfresco/solr/AlfrescoSolrDataModel.java | 92 ++++++--- .../alfresco/solr/SolrInformationServer.java | 34 ++-- .../alfresco/solr/query/Solr4QueryParser.java | 186 ++++-------------- 3 files changed, 128 insertions(+), 184 deletions(-) diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java index 1ce573f8b..00e91199f 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java @@ -155,16 +155,22 @@ public class AlfrescoSolrDataModel implements QueryConstants HIGHLIGHT } - public enum ContentFieldType + public enum SpecializedFieldType { - DOCID, - SIZE, - LOCALE, - MIMETYPE, - ENCODING, + CONTENT_DOCID, + CONTENT_SIZE, + CONTENT_LOCALE, + CONTENT_MIMETYPE, + CONTENT_ENCODING, TRANSFORMATION_STATUS, TRANSFORMATION_TIME, - TRANSFORMATION_EXCEPTION + TRANSFORMATION_EXCEPTION, + UNIT_OF_TIME_SECOND, + UNIT_OF_TIME_MINUTE, + UNIT_OF_TIME_HOUR, + UNIT_OF_TIME_DAY, + UNIT_OF_TIME_MONTH, + UNIT_OF_TIME_YEAR } public static final String CONTENT_S_LOCALE_PREFIX = "content@s__locale@"; @@ -615,7 +621,7 @@ public class AlfrescoSolrDataModel implements QueryConstants return dictionaryComponent; } - public IndexedField getIndexedFieldForContentPropertyMetadata(QName propertyQName, ContentFieldType type) + public IndexedField getIndexedFieldForSpecializedPropertyMetadata(QName propertyQName, SpecializedFieldType type) { IndexedField indexedField = new IndexedField(); PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); @@ -640,19 +646,19 @@ public class AlfrescoSolrDataModel implements QueryConstants builder.append('_'); switch (type) { - case DOCID: + case CONTENT_DOCID: builder.append("docid"); break; - case ENCODING: + case CONTENT_ENCODING: builder.append("encoding"); break; - case LOCALE: + case CONTENT_LOCALE: builder.append("locale"); break; - case MIMETYPE: + case CONTENT_MIMETYPE: builder.append("mimetype"); break; - case SIZE: + case CONTENT_SIZE: builder.append("size"); break; case TRANSFORMATION_EXCEPTION: @@ -667,21 +673,30 @@ public class AlfrescoSolrDataModel implements QueryConstants default: break; } + builder.append('@'); builder.append(propertyQName); indexedField.addField(builder.toString(), false, false); - + } + else if (dataTypeDefinition.getName().equals(DataTypeDefinition.DATE) || + dataTypeDefinition.getName().equals(DataTypeDefinition.DATETIME)) + { + String dateDerivedSuffix = getDateDerivedSuffix(type); + if (dateDerivedSuffix != null) + { + indexedField.addField(getDateDerivedField(propertyQName, dateDerivedSuffix), false, true); + } } return indexedField; } - public IndexedField getQueryableFields(QName propertyQName, ContentFieldType type, FieldUse fieldUse) + public IndexedField getQueryableFields(QName propertyQName, SpecializedFieldType type, FieldUse fieldUse) { if(type != null) { - return getIndexedFieldForContentPropertyMetadata(propertyQName, type); + return getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type); } IndexedField indexedField = new IndexedField(); @@ -1082,6 +1097,27 @@ public class AlfrescoSolrDataModel implements QueryConstants return "part@sd@" + propertyDefinition.getName().toString() + suffix; } + public String getDateDerivedSuffix(SpecializedFieldType type) + { + switch (type) + { + case UNIT_OF_TIME_SECOND: + return UNIT_OF_TIME_SECOND_FIELD_SUFFIX; + case UNIT_OF_TIME_MINUTE: + return UNIT_OF_TIME_MINUTE_FIELD_SUFFIX; + case UNIT_OF_TIME_HOUR: + return UNIT_OF_TIME_HOUR_FIELD_SUFFIX; + case UNIT_OF_TIME_DAY: + return UNIT_OF_TIME_DAY_FIELD_SUFFIX; + case UNIT_OF_TIME_MONTH: + return UNIT_OF_TIME_MONTH_FIELD_SUFFIX; + case UNIT_OF_TIME_YEAR: + return UNIT_OF_TIME_YEAR_FIELD_SUFFIX; + default: + return null; + } + } + /** * Get all the field names into which we must copy the source data @@ -1803,20 +1839,32 @@ public class AlfrescoSolrDataModel implements QueryConstants /** * @param ending String - * @return ContentFieldType + * @return SpecializedFieldType */ - public ContentFieldType getTextField(String ending) + public SpecializedFieldType getTextField(String ending) { switch(ending) { case FIELD_MIMETYPE_SUFFIX: - return ContentFieldType.MIMETYPE; + return SpecializedFieldType.CONTENT_MIMETYPE; case FIELD_SIZE_SUFFIX: - return ContentFieldType.SIZE; + return SpecializedFieldType.CONTENT_SIZE; case FIELD_LOCALE_SUFFIX: - return ContentFieldType.LOCALE; + return SpecializedFieldType.CONTENT_LOCALE; case FIELD_ENCODING_SUFFIX: - return ContentFieldType.ENCODING; + return SpecializedFieldType.CONTENT_ENCODING; + case UNIT_OF_TIME_SECOND_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_SECOND; + case UNIT_OF_TIME_MINUTE_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_MINUTE; + case UNIT_OF_TIME_HOUR_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_HOUR; + case UNIT_OF_TIME_DAY_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_DAY; + case UNIT_OF_TIME_MONTH_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_MONTH; + case UNIT_OF_TIME_YEAR_FIELD_SUFFIX: + return SpecializedFieldType.UNIT_OF_TIME_YEAR; case FIELD_TRANSFORMATION_STATUS_SUFFIX: case FIELD_TRANSFORMATION_TIME_SUFFIX: case FIELD_TRANSFORMATION_EXCEPTION_SUFFIX: diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java index 165793132..e931c24aa 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java @@ -2412,10 +2412,10 @@ public class SolrInformationServer implements InformationServer private void addContentPropertyMetadata( SolrInputDocument doc, QName propertyQName, - AlfrescoSolrDataModel.ContentFieldType type, + AlfrescoSolrDataModel.SpecializedFieldType type, GetTextContentResponse textContentResponse) { - IndexedField indexedField = dataModel.getIndexedFieldForContentPropertyMetadata(propertyQName, type); + IndexedField indexedField = dataModel.getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type); for (FieldInstance fieldInstance : indexedField.getFields()) { switch(type) @@ -2440,27 +2440,27 @@ public class SolrInformationServer implements InformationServer BiConsumer consumer, QName propertyQName, ContentPropertyValue contentPropertyValue, - AlfrescoSolrDataModel.ContentFieldType type) + AlfrescoSolrDataModel.SpecializedFieldType type) { IndexedField indexedField = - AlfrescoSolrDataModel.getInstance().getIndexedFieldForContentPropertyMetadata(propertyQName, type); + AlfrescoSolrDataModel.getInstance().getIndexedFieldForSpecializedPropertyMetadata(propertyQName, type); for (FieldInstance fieldInstance : indexedField.getFields()) { switch(type) { - case DOCID: + case CONTENT_DOCID: consumer.accept(fieldInstance.getField(), contentPropertyValue.getId()); break; - case ENCODING: + case CONTENT_ENCODING: consumer.accept(fieldInstance.getField(), contentPropertyValue.getEncoding()); break; - case LOCALE: + case CONTENT_LOCALE: consumer.accept(fieldInstance.getField(), contentPropertyValue.getLocale().toString()); break; - case MIMETYPE: + case CONTENT_MIMETYPE: consumer.accept(fieldInstance.getField(), contentPropertyValue.getMimetype()); break; - case SIZE: + case CONTENT_SIZE: consumer.accept(fieldInstance.getField(), contentPropertyValue.getLength()); break; // Skips the ones that require the text content response @@ -2583,11 +2583,11 @@ public class SolrInformationServer implements InformationServer ContentPropertyValue propertyValue, boolean contentIndexingEnabled) { - addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.DOCID); - addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.SIZE); - addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.LOCALE); - addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.MIMETYPE); - addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.ContentFieldType.ENCODING); + addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_DOCID); + addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_SIZE); + addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_LOCALE); + addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_MIMETYPE); + addContentPropertyMetadata(consumer, propertyName, propertyValue, AlfrescoSolrDataModel.SpecializedFieldType.CONTENT_ENCODING); if (contentIndexingEnabled) { @@ -2639,9 +2639,9 @@ public class SolrInformationServer implements InformationServer // Expensive call to be done with ContentTracker try (GetTextContentResponse response = repositoryClient.getTextContent(dbId, propertyQName, null)) { - addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_STATUS, response); - addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_EXCEPTION, response); - addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.ContentFieldType.TRANSFORMATION_TIME, response); + addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_STATUS, response); + addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_EXCEPTION, response); + addContentPropertyMetadata(doc, propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_TIME, response); final String textContent = textContentFrom(response); diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java index b04218d01..f681348e7 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/Solr4QueryParser.java @@ -52,7 +52,7 @@ import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; import org.alfresco.solr.AlfrescoAnalyzerWrapper; import org.alfresco.solr.AlfrescoSolrDataModel; -import org.alfresco.solr.AlfrescoSolrDataModel.ContentFieldType; +import org.alfresco.solr.AlfrescoSolrDataModel.SpecializedFieldType; import org.alfresco.solr.AlfrescoSolrDataModel.FieldInstance; import org.alfresco.solr.AlfrescoSolrDataModel.FieldUse; import org.alfresco.solr.AlfrescoSolrDataModel.IndexedField; @@ -3064,22 +3064,22 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants { case FIELD_SIZE_SUFFIX: solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), ContentFieldType.SIZE, FieldUse.ID) + .getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_SIZE, FieldUse.ID) .getFields().get(0).getField(); break; case FIELD_MIMETYPE_SUFFIX: solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), ContentFieldType.MIMETYPE, FieldUse.ID) + .getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_MIMETYPE, FieldUse.ID) .getFields().get(0).getField(); break; case FIELD_ENCODING_SUFFIX: solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), ContentFieldType.ENCODING, FieldUse.ID) + .getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_ENCODING, FieldUse.ID) .getFields().get(0).getField(); break; case FIELD_LOCALE_SUFFIX: solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), ContentFieldType.LOCALE, FieldUse.ID) + .getQueryableFields(propertyDef.getName(), SpecializedFieldType.CONTENT_LOCALE, FieldUse.ID) .getFields().get(0).getField(); break; } @@ -3119,61 +3119,44 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && !AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) { - if (AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) - { + Pair dateAndResolution1 = parseDateString(part1); + Pair dateAndResolution2 = parseDateString(part2); - } - else + BooleanQuery.Builder bQuery = new BooleanQuery.Builder(); + IndexedField indexedField = AlfrescoSolrDataModel.getInstance() + .getQueryableFields(propertyDef.getName(), null, FieldUse.ID); + for (FieldInstance instance : indexedField.getFields()) { - Pair dateAndResolution1 = parseDateString(part1); - Pair dateAndResolution2 = parseDateString(part2); - - BooleanQuery.Builder bQuery = new BooleanQuery.Builder(); - IndexedField indexedField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), null, FieldUse.ID); - for (FieldInstance instance : indexedField.getFields()) + String start = dateAndResolution1 == null ? part1 + : (includeLower ? getDateStart(dateAndResolution1) : getDateEnd(dateAndResolution1)); + String end = dateAndResolution2 == null ? part2 + : (includeUpper ? getDateEnd(dateAndResolution2) : getDateStart(dateAndResolution2)); + if (start.equals("*")) { - String start = dateAndResolution1 == null ? part1 - : (includeLower ? getDateStart(dateAndResolution1) : getDateEnd(dateAndResolution1)); - String end = dateAndResolution2 == null ? part2 - : (includeUpper ? getDateEnd(dateAndResolution2) : getDateStart(dateAndResolution2)); - if (start.equals("*")) - { - start = null; - } - if (end.equals("*")) - { - end = null; - } - - SchemaField sf = schema.getField(instance.getField()); - - Query query = sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper); - if (query != null) - { - bQuery.add(query, Occur.SHOULD); - } + start = null; + } + if (end.equals("*")) + { + end = null; } - return bQuery.build(); - } + SchemaField sf = schema.getField(instance.getField()); + + Query query = sf.getType().getRangeQuery(null, sf, start, end, includeLower, includeUpper); + if (query != null) + { + bQuery.add(query, Occur.SHOULD); + } + } + return bQuery.build(); } else { - - String solrField; - - if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) - || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && - AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) - { - solrField = AlfrescoSolrDataModel.getInstance().getDateDerivedField(propertyDef.getName(), fieldNameAndEnding.getSecond()); - } - else - { - solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), null, FieldUse.ID).getFields().get(0).getField(); - } + String solrField = AlfrescoSolrDataModel.getInstance() + .getQueryableFields(propertyDef.getName(), + AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()), + FieldUse.ID) + .getFields().get(0).getField(); String start = null; try @@ -4165,98 +4148,13 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants } } - // Mime type - if (fieldNameAndEnding.getSecond().equals(FIELD_MIMETYPE_SUFFIX)) + if (fieldNameAndEnding.getSecond() != null && propertyDef != null) { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.MIMETYPE, FieldUse.ID).getFields().get(0) - .getField(), queryText, analysisMode, luceneFunction); - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_SIZE_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.SIZE, FieldUse.ID).getFields().get(0) - .getField(), queryText, analysisMode, luceneFunction); - - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_LOCALE_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.LOCALE, FieldUse.ID).getFields().get(0) - .getField(), queryText, analysisMode, luceneFunction); - - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_ENCODING_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.ENCODING, FieldUse.ID).getFields().get(0) - .getField(), queryText, analysisMode, luceneFunction); - - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_STATUS_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder - .getQuery( - AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_STATUS, - FieldUse.ID) - .getFields().get(0).getField(), - queryText, analysisMode, luceneFunction); - - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_TIME_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder - .getQuery( - AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_TIME, - FieldUse.ID) - .getFields().get(0).getField(), - queryText, analysisMode, luceneFunction); - - } - - } else if (fieldNameAndEnding.getSecond().equals(FIELD_TRANSFORMATION_EXCEPTION_SUFFIX)) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) - { - return subQueryBuilder.getQuery( - AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_EXCEPTION, - FieldUse.ID) - .getFields().get(0).getField(), - queryText, analysisMode, luceneFunction); - - } - - } - else if (AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) - { - if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE) - || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME ))) - { - return subQueryBuilder.getQuery( - AlfrescoSolrDataModel.getInstance() - .getDateDerivedField(propertyQName, fieldNameAndEnding.getSecond()), - queryText, analysisMode, luceneFunction); - } + return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() + .getQueryableFields(propertyQName, + AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()), + FieldUse.ID).getFields().get(0) + .getField(), queryText, analysisMode, luceneFunction); } // Already in expanded form @@ -5535,6 +5433,4 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants query.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_REWRITE); return query; } - - }