From 10439647770b8b6e6c0d51ef69dca5a0ceb469af Mon Sep 17 00:00:00 2001 From: agazzarini Date: Wed, 13 May 2020 17:35:14 +0200 Subject: [PATCH 01/15] [ SEARCH-2151 ] Tidy up RewriteFieldListComponent --- .../component/RewriteFieldListComponent.java | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java index 22240edee..a79f8c8b5 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java @@ -18,35 +18,30 @@ */ package org.alfresco.solr.component; +import static java.util.Optional.ofNullable; + import org.alfresco.solr.AlfrescoSolrDataModel; +import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.handler.component.ResponseBuilder; import org.apache.solr.handler.component.SearchComponent; import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.transform.DocTransformer; import org.apache.solr.search.SolrReturnFields; -import java.io.IOException; import java.util.HashSet; -import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import static java.util.Optional.ofNullable; -import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.FACET; -import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.FTS; -import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.ID; -import static org.alfresco.solr.AlfrescoSolrDataModel.FieldUse.SORT; - -/** - * @Author elia - */ - /** * Transform the fieldlist depending on the use of cached transformer: * [cached] -> add to the field list the translations of the fiels to the internal schema notation * otherwise -> modify the field list in order to contains a subset of the following fields: * id, DBID, _version_ and score + * + * @author eporciani */ public class RewriteFieldListComponent extends SearchComponent { @@ -67,7 +62,7 @@ public class RewriteFieldListComponent extends SearchComponent { String originalFieldList = req.getParams().get("fl"); boolean cacheTransformer = ofNullable(solrReturnFields.getTransformer()) - .map(t -> t.getName()) + .map(DocTransformer::getName) .map(name -> name.contains("fmap")) .orElse(false); @@ -81,7 +76,7 @@ public class RewriteFieldListComponent extends SearchComponent { { fieldListSet.addAll(solrReturnFields.getLuceneFieldNames() .stream() - .filter(field -> allowedNonCachedFields.contains(field)) + .filter(allowedNonCachedFields::contains) .collect(Collectors.toSet())); } @@ -90,7 +85,7 @@ public class RewriteFieldListComponent extends SearchComponent { fieldListSet.addAll(defaultNonCachedFields); } - params.set("fl", fieldListSet.stream().collect(Collectors.joining(","))); + params.set(CommonParams.FL, String.join(",", fieldListSet)); } else { @@ -101,9 +96,8 @@ public class RewriteFieldListComponent extends SearchComponent { else { fieldListSet.addAll(solrReturnFields.getLuceneFieldNames().stream() - .map( field -> AlfrescoSolrDataModel.getInstance() - .mapStoredProperty(field, req)) - .filter(schemaFieldName -> schemaFieldName != null) + .map( field -> AlfrescoSolrDataModel.getInstance().mapStoredProperty(field, req)) + .filter(Objects::nonNull) .map(schemaFieldName -> schemaFieldName.chars() .mapToObj(c -> (char) c) .map(c -> Character.isJavaIdentifierPart(c)? c : '?') @@ -112,7 +106,7 @@ public class RewriteFieldListComponent extends SearchComponent { .collect(Collectors.toSet())); } - params.add("fl", fieldListSet.stream().collect(Collectors.joining(","))); + params.add(CommonParams.FL, String.join(",", fieldListSet)); } // This is added for filtering the fields in the cached transformer. From 1d39e1ae48568f81bab6f8563bfa5cb254a6be40 Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Fri, 15 May 2020 11:39:47 +0200 Subject: [PATCH 02/15] [SEARCH-2166] changes for making work date derived fields in search and fl statement --- .../alfresco/solr/AlfrescoSolrDataModel.java | 46 +++++++++++++++---- .../component/RewriteFieldListComponent.java | 18 ++++---- .../alfresco/solr/query/Solr4QueryParser.java | 11 +++++ 3 files changed, 59 insertions(+), 16 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 b6c574b25..c7a2bfcab 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 @@ -108,6 +108,12 @@ import org.springframework.beans.BeansException; import org.springframework.context.support.FileSystemXmlApplicationContext; import static java.util.Optional.ofNullable; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_DAY_FIELD_SUFFIX; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_HOUR_FIELD_SUFFIX; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_MINUTE_FIELD_SUFFIX; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_MONTH_FIELD_SUFFIX; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_SECOND_FIELD_SUFFIX; +import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_YEAR_FIELD_SUFFIX; /** * @author Andy @@ -1027,6 +1033,12 @@ public class AlfrescoSolrDataModel implements QueryConstants } + public String getDateDerivedFIeld(QName propertyQName) + { + PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); + return "part@sd@" + propertyDefinition.getName().toString(); + } + /** * Get all the field names into which we must copy the source data @@ -1626,28 +1638,46 @@ public class AlfrescoSolrDataModel implements QueryConstants } } - if (propertyDef == null || propertyDef.getName() == null){ + if (propertyDef == null || propertyDef.getName() == null) + { return mapNonPropertyFields(luceneField); } - if (propertyDef.getName().equals(DataTypeDefinition.TEXT)) + if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) + || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE) && + !isDerivedDateField(fieldNameAndEnding.getSecond()))) { - return getStoredTextField(propertyDef.getName()); + return getDateDerivedFIeld(propertyDef.getName()) + fieldNameAndEnding.getSecond(); } - else if (propertyDef.getName().equals(DataTypeDefinition.MLTEXT)) + else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT)) { - return getStoredMLTextField(propertyDef.getName()); + return getStoredTextField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); } - else if (propertyDef.getName().equals(DataTypeDefinition.CONTENT)) + else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT)) { - return getStoredContentField(propertyDef.getName()); + return getStoredMLTextField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + } + else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)) + { + return getStoredContentField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); } else { - return mapAlfrescoField(FieldUse.FTS, 0, fieldNameAndEnding, luceneField, propertyDef); + return mapAlfrescoField(FieldUse.FTS, 0, fieldNameAndEnding, luceneField, propertyDef) + + fieldNameAndEnding.getSecond(); } } + public boolean isDerivedDateField(String suffix) { + return Set.of(UNIT_OF_TIME_YEAR_FIELD_SUFFIX, + UNIT_OF_TIME_MONTH_FIELD_SUFFIX, + UNIT_OF_TIME_DAY_FIELD_SUFFIX, + UNIT_OF_TIME_HOUR_FIELD_SUFFIX, + UNIT_OF_TIME_MINUTE_FIELD_SUFFIX, + UNIT_OF_TIME_SECOND_FIELD_SUFFIX).contains(suffix); + } + + public String mapProperty(String potentialProperty, FieldUse fieldUse, SolrQueryRequest req, int position) { if(potentialProperty.equals("asc") || potentialProperty.equals("desc") || potentialProperty.equals("_docid_")) diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java index a79f8c8b5..42e569e92 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFieldListComponent.java @@ -18,10 +18,7 @@ */ package org.alfresco.solr.component; -import static java.util.Optional.ofNullable; - import org.alfresco.solr.AlfrescoSolrDataModel; -import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.handler.component.ResponseBuilder; @@ -35,13 +32,17 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import static java.util.Optional.ofNullable; + +/** + * @Author elia + */ + /** * Transform the fieldlist depending on the use of cached transformer: * [cached] -> add to the field list the translations of the fiels to the internal schema notation * otherwise -> modify the field list in order to contains a subset of the following fields: * id, DBID, _version_ and score - * - * @author eporciani */ public class RewriteFieldListComponent extends SearchComponent { @@ -85,7 +86,7 @@ public class RewriteFieldListComponent extends SearchComponent { fieldListSet.addAll(defaultNonCachedFields); } - params.set(CommonParams.FL, String.join(",", fieldListSet)); + params.set("fl", String.join(",", fieldListSet)); } else { @@ -96,7 +97,8 @@ public class RewriteFieldListComponent extends SearchComponent { else { fieldListSet.addAll(solrReturnFields.getLuceneFieldNames().stream() - .map( field -> AlfrescoSolrDataModel.getInstance().mapStoredProperty(field, req)) + .map( field -> AlfrescoSolrDataModel.getInstance() + .mapStoredProperty(field, req)) .filter(Objects::nonNull) .map(schemaFieldName -> schemaFieldName.chars() .mapToObj(c -> (char) c) @@ -106,7 +108,7 @@ public class RewriteFieldListComponent extends SearchComponent { .collect(Collectors.toSet())); } - params.add(CommonParams.FL, String.join(",", fieldListSet)); + params.add("fl", String.join(",", fieldListSet)); } // This is added for filtering the fields in the cached transformer. 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 3d46c0d48..84d8dc9c0 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 @@ -4217,6 +4217,17 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants } } + 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); + } + } // Already in expanded form From ce77d56301933fc2c8ce45799df89cb532e37381 Mon Sep 17 00:00:00 2001 From: agazzarini Date: Mon, 18 May 2020 09:11:01 +0200 Subject: [PATCH 03/15] [ SEARCH-2151 ] Wrong boolean check on date fields --- .../java/org/alfresco/solr/AlfrescoSolrDataModel.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 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 c7a2bfcab..126c8a91d 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 @@ -1033,7 +1033,7 @@ public class AlfrescoSolrDataModel implements QueryConstants } - public String getDateDerivedFIeld(QName propertyQName) + public String getDateDerivedField(QName propertyQName) { PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); return "part@sd@" + propertyDefinition.getName().toString(); @@ -1644,10 +1644,10 @@ public class AlfrescoSolrDataModel implements QueryConstants } if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) - || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE) && - !isDerivedDateField(fieldNameAndEnding.getSecond()))) + || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && + isDerivedDateField(fieldNameAndEnding.getSecond())) { - return getDateDerivedFIeld(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + return getDateDerivedField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT)) { From f6a10e4ec331a203031aa3c369db7aef915c9079 Mon Sep 17 00:00:00 2001 From: agazzarini Date: Mon, 18 May 2020 09:11:38 +0200 Subject: [PATCH 04/15] [ SEARCH-2151 ] Wrong method name --- .../src/main/java/org/alfresco/solr/query/Solr4QueryParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 84d8dc9c0..22b198b52 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 @@ -4224,7 +4224,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants { return subQueryBuilder.getQuery( AlfrescoSolrDataModel.getInstance() - .getDateDerivedFIeld(propertyQName) + fieldNameAndEnding.getSecond(), + .getDateDerivedField(propertyQName) + fieldNameAndEnding.getSecond(), queryText, analysisMode, luceneFunction); } } From 548b7ec49069d955d77696f11cb36bf012c3a07f Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Mon, 18 May 2020 20:11:23 +0200 Subject: [PATCH 05/15] [SEARCH-2166] managed faceting with derived date fields --- .../alfresco/solr/AlfrescoSolrDataModel.java | 43 ++++++++++++++++--- .../alfresco/solr/query/Solr4QueryParser.java | 4 +- 2 files changed, 38 insertions(+), 9 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 798c28a5e..0c02553a3 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 @@ -954,8 +954,12 @@ public class AlfrescoSolrDataModel implements QueryConstants } } - public String getStoredTextField(QName propertyQName) + { + return getStoredTextField(propertyQName, null); + } + + public String getStoredTextField(QName propertyQName, String suffix) { PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); @@ -981,11 +985,21 @@ public class AlfrescoSolrDataModel implements QueryConstants sb.append("@"); sb.append(propertyDefinition.getName().toString()); + if (suffix != null) + { + sb.append(suffix); + } + return sb.toString(); } public String getStoredMLTextField(QName propertyQName) + { + return getStoredMLTextField(propertyQName, null); + } + + public String getStoredMLTextField(QName propertyQName, String suffix) { PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); @@ -1009,11 +1023,21 @@ public class AlfrescoSolrDataModel implements QueryConstants sb.append("@"); sb.append(propertyDefinition.getName().toString()); + if (suffix != null) + { + sb.append(suffix); + } + return sb.toString(); } public String getStoredContentField(QName propertyQName) + { + return getStoredContentField(propertyQName, null); + } + + public String getStoredContentField(QName propertyQName, String suffix) { PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); @@ -1037,14 +1061,19 @@ public class AlfrescoSolrDataModel implements QueryConstants sb.append("@"); sb.append(propertyDefinition.getName().toString()); + if (suffix != null) + { + sb.append(suffix); + } + return sb.toString(); } - public String getDateDerivedField(QName propertyQName) + public String getDateDerivedField(QName propertyQName, String suffix) { PropertyDefinition propertyDefinition = getPropertyDefinition(propertyQName); - return "part@sd@" + propertyDefinition.getName().toString(); + return "part@sd@" + propertyDefinition.getName().toString() + suffix; } @@ -1655,19 +1684,19 @@ public class AlfrescoSolrDataModel implements QueryConstants || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && isDerivedDateField(fieldNameAndEnding.getSecond())) { - return getDateDerivedField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + return getDateDerivedField(propertyDef.getName(), fieldNameAndEnding.getSecond()); } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.TEXT)) { - return getStoredTextField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + return getStoredTextField(propertyDef.getName(), fieldNameAndEnding.getSecond()); } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.MLTEXT)) { - return getStoredMLTextField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + return getStoredMLTextField(propertyDef.getName(), fieldNameAndEnding.getSecond()); } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT)) { - return getStoredContentField(propertyDef.getName()) + fieldNameAndEnding.getSecond(); + return getStoredContentField(propertyDef.getName(), fieldNameAndEnding.getSecond()); } else { 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 f89fd7a2b..c6765f5dd 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 @@ -4204,7 +4204,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants return subQueryBuilder .getQuery( AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_TIME, + .getQueryableFields(propertyQName, ContentFieldType.TRANSFORMATION_TIME, FieldUse.ID) .getFields().get(0).getField(), queryText, analysisMode, luceneFunction); @@ -4232,7 +4232,7 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants { return subQueryBuilder.getQuery( AlfrescoSolrDataModel.getInstance() - .getDateDerivedField(propertyQName) + fieldNameAndEnding.getSecond(), + .getDateDerivedField(propertyQName, fieldNameAndEnding.getSecond()), queryText, analysisMode, luceneFunction); } } From 72000a8c994690c739b24940eecbda0c1b6077da Mon Sep 17 00:00:00 2001 From: agazzarini Date: Tue, 19 May 2020 12:33:19 +0200 Subject: [PATCH 06/15] [ SEARCH-2222 ] E2E Tests (yellow) --- .../org/alfresco/solr/AlfrescoSolrDataModel.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 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 0c02553a3..1ce573f8b 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 @@ -170,7 +170,13 @@ public class AlfrescoSolrDataModel implements QueryConstants public static final String CONTENT_S_LOCALE_PREFIX = "content@s__locale@"; static final String PART_FIELDNAME_PREFIX = "part@sd@"; - + static final Set DATE_PART_SUFFIXES = + Set.of(UNIT_OF_TIME_YEAR_FIELD_SUFFIX, + UNIT_OF_TIME_MONTH_FIELD_SUFFIX, + UNIT_OF_TIME_DAY_FIELD_SUFFIX, + UNIT_OF_TIME_HOUR_FIELD_SUFFIX, + UNIT_OF_TIME_MINUTE_FIELD_SUFFIX, + UNIT_OF_TIME_SECOND_FIELD_SUFFIX); /** * Infix used for denoting a primitive single valued field with no doc values enabled * @@ -1706,12 +1712,7 @@ public class AlfrescoSolrDataModel implements QueryConstants } public boolean isDerivedDateField(String suffix) { - return Set.of(UNIT_OF_TIME_YEAR_FIELD_SUFFIX, - UNIT_OF_TIME_MONTH_FIELD_SUFFIX, - UNIT_OF_TIME_DAY_FIELD_SUFFIX, - UNIT_OF_TIME_HOUR_FIELD_SUFFIX, - UNIT_OF_TIME_MINUTE_FIELD_SUFFIX, - UNIT_OF_TIME_SECOND_FIELD_SUFFIX).contains(suffix); + return DATE_PART_SUFFIXES.contains(suffix); } From 61c1d3ddf675f1b1e18feaa128ef374401c927dd Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Wed, 20 May 2020 14:43:15 +0200 Subject: [PATCH 07/15] [SEARCH-2166] implemented range queries. --- .../alfresco/solr/query/Solr4QueryParser.java | 86 ++++++++++++------- .../alfresco/solr/DynamicCopyFieldsIT.java | 2 +- .../alfresco-solrclient-lib/pom.xml | 2 +- 3 files changed, 56 insertions(+), 34 deletions(-) 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 c6765f5dd..b04218d01 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 @@ -3115,43 +3115,65 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants { return buildTextMLTextOrContentRange(field, part1, part2, includeLower, includeUpper, analysisMode, expandedFieldName, propertyDef, tokenisationMode); - } else if (propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) - || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) + } else if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) + || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && + !AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) { - 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()) + if (AlfrescoSolrDataModel.getInstance().isDerivedDateField(fieldNameAndEnding.getSecond())) { - 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); - } } - return bQuery.build(); - } else + else + { + 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("*")) + { + 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); + } + } + return bQuery.build(); + } + + } + else { - String solrField = AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyDef.getName(), null, FieldUse.ID).getFields().get(0).getField(); + + 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 start = null; try diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java index 775006d6d..211dcc076 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java @@ -375,6 +375,7 @@ public class DynamicCopyFieldsIT extends AbstractAlfrescoDistributedIT { @Test public void textLOVWholeGeneratedFieldsTest() { + Assert.assertFalse(); HashSet fieldModifiers = fieldMap.get(TEXT_LOVWHOLE); assertAllSingleValue(fieldModifiers); Set dynamicFieldsTypes = fieldModifiers.stream() @@ -410,7 +411,6 @@ public class DynamicCopyFieldsIT extends AbstractAlfrescoDistributedIT { * index=disable */ @Test - @Ignore("index enable=false is ignored") public void textNoneGeneratedFieldsTest() { HashSet fieldModifiers = fieldMap.get(TEXT_NONE); diff --git a/search-services/alfresco-solrclient-lib/pom.xml b/search-services/alfresco-solrclient-lib/pom.xml index 93e7d0695..38d42ab33 100644 --- a/search-services/alfresco-solrclient-lib/pom.xml +++ b/search-services/alfresco-solrclient-lib/pom.xml @@ -22,7 +22,7 @@ - 8.112 + 8.-SNAPSHOT 2.10.3 From 62b7324b58c2c244fa9c0689c08362064de983bf Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Wed, 20 May 2020 15:00:00 +0200 Subject: [PATCH 08/15] [SEARCH-2166] restored test --- .../src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java index 211dcc076..775006d6d 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/DynamicCopyFieldsIT.java @@ -375,7 +375,6 @@ public class DynamicCopyFieldsIT extends AbstractAlfrescoDistributedIT { @Test public void textLOVWholeGeneratedFieldsTest() { - Assert.assertFalse(); HashSet fieldModifiers = fieldMap.get(TEXT_LOVWHOLE); assertAllSingleValue(fieldModifiers); Set dynamicFieldsTypes = fieldModifiers.stream() @@ -411,6 +410,7 @@ public class DynamicCopyFieldsIT extends AbstractAlfrescoDistributedIT { * index=disable */ @Test + @Ignore("index enable=false is ignored") public void textNoneGeneratedFieldsTest() { HashSet fieldModifiers = fieldMap.get(TEXT_NONE); From bac0ed28aa08646d0af20e6658835b501c39f005 Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Wed, 20 May 2020 22:56:22 +0200 Subject: [PATCH 09/15] [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; } - - } From 3d2b9fb026d5cc56634fe9773bb806bd940a88a9 Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Wed, 20 May 2020 22:57:31 +0200 Subject: [PATCH 10/15] [SEARCH-2166] updated alfresco-data-model dependency --- search-services/alfresco-solrclient-lib/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-services/alfresco-solrclient-lib/pom.xml b/search-services/alfresco-solrclient-lib/pom.xml index 38d42ab33..915d097b2 100644 --- a/search-services/alfresco-solrclient-lib/pom.xml +++ b/search-services/alfresco-solrclient-lib/pom.xml @@ -22,7 +22,7 @@ - 8.-SNAPSHOT + search-2166-2 2.10.3 From a7acb51d95a4991253bbce70604a13cc7ae6fdab Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Thu, 21 May 2020 08:25:37 +0200 Subject: [PATCH 11/15] [SEARCH-2166] restored solr4queryparser --- .../alfresco/solr/query/Solr4QueryParser.java | 97 +++++++++++++++++-- 1 file changed, 91 insertions(+), 6 deletions(-) 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 f681348e7..127040937 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 @@ -4148,13 +4148,98 @@ public class Solr4QueryParser extends QueryParser implements QueryConstants } } - if (fieldNameAndEnding.getSecond() != null && propertyDef != null) + // Mime type + if (fieldNameAndEnding.getSecond().equals(FIELD_MIMETYPE_SUFFIX)) { - return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() - .getQueryableFields(propertyQName, - AlfrescoSolrDataModel.getInstance().getTextField(fieldNameAndEnding.getSecond()), - FieldUse.ID).getFields().get(0) - .getField(), queryText, analysisMode, luceneFunction); + if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.CONTENT))) + { + return subQueryBuilder.getQuery(AlfrescoSolrDataModel.getInstance() + .getQueryableFields(propertyQName, SpecializedFieldType.CONTENT_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, SpecializedFieldType.CONTENT_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, SpecializedFieldType.CONTENT_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, SpecializedFieldType.CONTENT_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, SpecializedFieldType.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, SpecializedFieldType.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, SpecializedFieldType.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); + } } // Already in expanded form From fdf390c4f01533f049dca7467d3e6935f4112426 Mon Sep 17 00:00:00 2001 From: eliaporciani Date: Fri, 22 May 2020 11:43:04 +0200 Subject: [PATCH 12/15] [SEARCH-2166] updated alfresc-data-model version --- search-services/alfresco-solrclient-lib/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-services/alfresco-solrclient-lib/pom.xml b/search-services/alfresco-solrclient-lib/pom.xml index 915d097b2..5ed140a74 100644 --- a/search-services/alfresco-solrclient-lib/pom.xml +++ b/search-services/alfresco-solrclient-lib/pom.xml @@ -22,7 +22,7 @@ - search-2166-2 + 8.115 2.10.3 From 7863e0df8f0f25ef741f7643442e2a1efd0c6c97 Mon Sep 17 00:00:00 2001 From: agazzarini Date: Tue, 2 Jun 2020 14:41:44 +0200 Subject: [PATCH 13/15] [ SEARCH-2223 ] Tidy up after review comments --- .../alfresco/solr/AlfrescoSolrDataModel.java | 645 +++++++++--------- .../alfresco/solr/SolrInformationServer.java | 3 +- 2 files changed, 309 insertions(+), 339 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 00e91199f..7baf7c6e7 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 @@ -185,15 +185,11 @@ public class AlfrescoSolrDataModel implements QueryConstants UNIT_OF_TIME_SECOND_FIELD_SUFFIX); /** * Infix used for denoting a primitive single valued field with no doc values enabled - * - * @see #getFieldForText */ private static final String SINGLE_VALUE_WITHOUT_DOC_VALUES_MARKER = "@s_@"; /** * Infix used for denoting a primitive single valued field with no doc values enabled - * - * @see #getFieldForText */ private static final String SINGLE_VALUE_WITH_DOC_VALUES_MARKER = "@sd@"; @@ -209,26 +205,22 @@ public class AlfrescoSolrDataModel implements QueryConstants private final static AlfrescoSolrDataModel INSTANCE = new AlfrescoSolrDataModel(); - private TenantService tenantService; + private final TenantService tenantService; - private NamespaceDAO namespaceDAO; + private final NamespaceDAO namespaceDAO; - private DictionaryDAOImpl dictionaryDAO; + private final DictionaryDAOImpl dictionaryDAO; - private Map dictionaryServices; + private final Map dictionaryServices; - private Map cmisDictionaryServices; + private final Map cmisDictionaryServices; - private Map> modelErrors = new HashMap<>(); - - private Set suggestableProperties = new HashSet<>(); - - private Set crossLocaleSearchDataTypes = new HashSet<>(); - - private Set crossLocaleSearchProperties = new HashSet<>(); - - private Set identifierProperties = new HashSet<>(); - private ThreadPoolExecutor threadPool; + private final Map> modelErrors = new HashMap<>(); + private final Set suggestableProperties = new HashSet<>(); + private final Set crossLocaleSearchDataTypes = new HashSet<>(); + private final Set crossLocaleSearchProperties = new HashSet<>(); + private final Set identifierProperties = new HashSet<>(); + private final ThreadPoolExecutor threadPool; public void close() { threadPool.shutdown(); @@ -678,8 +670,7 @@ public class AlfrescoSolrDataModel implements QueryConstants builder.append(propertyQName); indexedField.addField(builder.toString(), false, false); } - else if (dataTypeDefinition.getName().equals(DataTypeDefinition.DATE) || - dataTypeDefinition.getName().equals(DataTypeDefinition.DATETIME)) + else if (isDateOrDatetime(dataTypeDefinition)) { String dateDerivedSuffix = getDateDerivedSuffix(type); if (dateDerivedSuffix != null) @@ -756,225 +747,6 @@ public class AlfrescoSolrDataModel implements QueryConstants return indexedField; } - /* - * Adds best completion fields in order of preference - */ - private void addCompletionFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE)) - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE)) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - - /* - * Adds best fts fields in order of preference - */ - - private void addFullTextSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - if (((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - && !isIdentifierTextProperty(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - } - else - { - indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - - private void addHighlightSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - QName propertyName = propertyDefinition.getName(); - QName propertyDataTypeQName = propertyDefinition.getDataType().getName(); - String fieldName; - - if(propertyDataTypeQName.equals(DataTypeDefinition.MLTEXT)) - { - fieldName = getStoredMLTextField(propertyName); - } - else if(propertyDataTypeQName.equals(DataTypeDefinition.CONTENT)) - { - fieldName = getStoredContentField(propertyName); - } - else - { - fieldName = getStoredTextField(propertyName); - } - - indexedField.addField(fieldName, false, false); - } - - /* - * Adds best identifier fields in order of preference - */ - private void addIdentifierSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - - indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - } - } - - /* - * Adds best identifier fields in order of preference - */ - private void addFacetSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if(propertyDefinition.getDataType().getName().equals(DataTypeDefinition.TEXT)) - { - if (!isIdentifierTextProperty(propertyDefinition.getName())) - { - if(propertyDefinition.getFacetable() == Facetable.TRUE) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - } - - - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) - || isIdentifierTextProperty(propertyDefinition.getName())) - { - - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - - private void addMultiSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) - || isIdentifierTextProperty(propertyDefinition.getName())) - { - - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - - private void addStatsSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - addFacetSearchFields(propertyDefinition, indexedField); - } - - private void addSortSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - // Can only order on single valued fields - DataTypeDefinition dataTypeDefinition = propertyDefinition.getDataType(); - if(dataTypeDefinition.getName().equals(DataTypeDefinition.TEXT)) - { - if(!propertyDefinition.isMultiValued()) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); - } - else if (isIdentifierTextProperty(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - } - - if(dataTypeDefinition.getName().equals(DataTypeDefinition.MLTEXT)) - { - if(!propertyDefinition.isMultiValued()) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - } - } - public String getStoredTextField(QName propertyQName) { return getStoredTextField(propertyQName, null); @@ -1265,43 +1037,6 @@ public class AlfrescoSolrDataModel implements QueryConstants } } - private boolean isPrimitive(DataTypeDefinition dataType) - { - if(dataType.getName().equals(DataTypeDefinition.INT)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.LONG)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.FLOAT)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.DOUBLE)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.DATE)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.DATETIME)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.BOOLEAN)) - { - return true; - } - else if(dataType.getName().equals(DataTypeDefinition.CATEGORY)) - { - return true; - } - else return dataType.getName().equals(DataTypeDefinition.NODE_REF); - } - public String getFieldForNonText(PropertyDefinition propertyDefinition) { StringBuilder builder = new StringBuilder(); @@ -1388,30 +1123,6 @@ public class AlfrescoSolrDataModel implements QueryConstants dictionaryDAO.removeModel(modelQName); } - private Set validateModel(M2Model model) - { - try - { - dictionaryDAO.getCompiledModel(QName.createQName(model.getName(), namespaceDAO)); - } - catch (DictionaryException | NamespaceException exception) - { - // No model to diff - return Collections.emptySet(); - } - - // namespace unknown - no model - List modelDiffs = dictionaryDAO.diffModelIgnoringConstraints(model); - return modelDiffs.stream() - .filter(diff -> diff.getDiffType().equals(M2ModelDiff.DIFF_UPDATED)) - .map(diff -> - String.format("Model not updated: %s Failed to validate model update - found non-incrementally updated %s '%s'", - model.getName(), - diff.getElementType(), - diff.getElementName())) - .collect(Collectors.toSet()); - } - M2Model getM2Model(QName modelQName) { return dictionaryDAO.getCompiledModel(modelQName).getM2Model(); @@ -1722,9 +1433,7 @@ public class AlfrescoSolrDataModel implements QueryConstants return mapNonPropertyFields(luceneField); } - if ((propertyDef.getDataType().getName().equals(DataTypeDefinition.DATETIME) - || propertyDef.getDataType().getName().equals(DataTypeDefinition.DATE)) && - isDerivedDateField(fieldNameAndEnding.getSecond())) + if (isDateOrDatetime(propertyDef.getDataType()) && isDerivedDateField(fieldNameAndEnding.getSecond())) { return getDateDerivedField(propertyDef.getName(), fieldNameAndEnding.getSecond()); } @@ -1747,11 +1456,11 @@ public class AlfrescoSolrDataModel implements QueryConstants } } - public boolean isDerivedDateField(String suffix) { + public boolean isDerivedDateField(String suffix) + { return DATE_PART_SUFFIXES.contains(suffix); } - public String mapProperty(String potentialProperty, FieldUse fieldUse, SolrQueryRequest req, int position) { if(potentialProperty.equals("asc") || potentialProperty.equals("desc") || potentialProperty.equals("_docid_")) @@ -1794,35 +1503,6 @@ public class AlfrescoSolrDataModel implements QueryConstants return solrSortField; } - private String mapAlfrescoField(FieldUse fieldUse, int position, Pair fieldNameAndEnding, String luceneField, PropertyDefinition propertyDef) { - String solrSortField; - if(propertyDef != null) - { - - IndexedField fields = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), getTextField(fieldNameAndEnding.getSecond()), fieldUse); - if(fields.getFields().size() > 0) - { - if(fields.getFields().size() > position) - { - solrSortField = fields.getFields().get(position).getField(); - } - else - { - solrSortField = fields.getFields().get(0).getField(); - } - } - else - { - solrSortField = mapNonPropertyFields(luceneField); - } - } - else - { - solrSortField = mapNonPropertyFields(luceneField); - } - return solrSortField; - } - public String mapNonPropertyFields(String queryField) { switch(queryField) @@ -1886,10 +1566,9 @@ public class AlfrescoSolrDataModel implements QueryConstants * date or datetime (e.g. year, month, second, minute). * * @param sourceFieldName the date/datetime source field name. - * @param sourceDataTypeDefinition the datatype of the source field name (date or datetime) * @return the prefix that can be used for denoting a date or datetime part */ - public String destructuredDateTimePartFieldNamePrefix(String sourceFieldName, DataTypeDefinition sourceDataTypeDefinition) { + public String destructuredDateTimePartFieldNamePrefix(String sourceFieldName) { // source field name example: datetime@sd@{http://www.alfresco.org/model/content/1.0}created // prefix: datetime String prefix = sourceFieldName.substring(0, sourceFieldName.indexOf("@")); @@ -1903,4 +1582,296 @@ public class AlfrescoSolrDataModel implements QueryConstants return sourceFieldName.replace(sourceFieldNamePrefixWithoutDocValues, PART_FIELDNAME_PREFIX) .replace(sourceFieldNamePrefixWithDocValues, PART_FIELDNAME_PREFIX); } + + private boolean isDateOrDatetime(DataTypeDefinition dataType) + { + return dataType.getName().equals(DataTypeDefinition.DATE) || + dataType.getName().equals(DataTypeDefinition.DATETIME); + } + + private boolean isPrimitive(DataTypeDefinition dataType) + { + QName name = dataType.getName(); + return name.equals(DataTypeDefinition.INT) + || name.equals(DataTypeDefinition.LONG) + || name.equals(DataTypeDefinition.FLOAT) + || name.equals(DataTypeDefinition.DOUBLE) + || isDateOrDatetime(dataType) + || name.equals(DataTypeDefinition.BOOLEAN) + || name.equals(DataTypeDefinition.CATEGORY) + || name.equals(DataTypeDefinition.NODE_REF); + } + + private String mapAlfrescoField(FieldUse fieldUse, int position, Pair fieldNameAndEnding, String luceneField, PropertyDefinition propertyDef) + { + String solrSortField; + if(propertyDef != null) + { + + IndexedField fields = AlfrescoSolrDataModel.getInstance().getQueryableFields(propertyDef.getName(), getTextField(fieldNameAndEnding.getSecond()), fieldUse); + if(fields.getFields().size() > 0) + { + if(fields.getFields().size() > position) + { + solrSortField = fields.getFields().get(position).getField(); + } + else + { + solrSortField = fields.getFields().get(0).getField(); + } + } + else + { + solrSortField = mapNonPropertyFields(luceneField); + } + } + else + { + solrSortField = mapNonPropertyFields(luceneField); + } + return solrSortField; + } + + private Set validateModel(M2Model model) + { + try + { + dictionaryDAO.getCompiledModel(QName.createQName(model.getName(), namespaceDAO)); + } + catch (DictionaryException | NamespaceException exception) + { + // No model to diff + return Collections.emptySet(); + } + + // namespace unknown - no model + List modelDiffs = dictionaryDAO.diffModelIgnoringConstraints(model); + return modelDiffs.stream() + .filter(diff -> diff.getDiffType().equals(M2ModelDiff.DIFF_UPDATED)) + .map(diff -> + String.format("Model not updated: %s Failed to validate model update - found non-incrementally updated %s '%s'", + model.getName(), + diff.getElementType(), + diff.getElementName())) + .collect(Collectors.toSet()); + } + + /* + * Adds best completion fields in order of preference + */ + private void addCompletionFields(PropertyDefinition propertyDefinition, IndexedField indexedField) + { + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE)) + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE)) + { + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + } + + /* + * Adds best fts fields in order of preference + */ + + private void addFullTextSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) + { + if (((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) + && !isIdentifierTextProperty(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + } + else + { + indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + } + + private void addHighlightSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) + { + QName propertyName = propertyDefinition.getName(); + QName propertyDataTypeQName = propertyDefinition.getDataType().getName(); + String fieldName; + + if(propertyDataTypeQName.equals(DataTypeDefinition.MLTEXT)) + { + fieldName = getStoredMLTextField(propertyName); + } + else if(propertyDataTypeQName.equals(DataTypeDefinition.CONTENT)) + { + fieldName = getStoredContentField(propertyName); + } + else + { + fieldName = getStoredTextField(propertyName); + } + + indexedField.addField(fieldName, false, false); + } + + /* + * Adds best identifier fields in order of preference + */ + private void addIdentifierSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) + { + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) + { + + indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + } + } + + /* + * Adds best identifier fields in order of preference + */ + private void addFacetSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) + { + if(propertyDefinition.getDataType().getName().equals(DataTypeDefinition.TEXT)) + { + if (!isIdentifierTextProperty(propertyDefinition.getName())) + { + if(propertyDefinition.getFacetable() == Facetable.TRUE) + { + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + } + } + + + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) + || isIdentifierTextProperty(propertyDefinition.getName())) + { + + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + else + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + } + + private void addMultiSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) + { + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) + || isIdentifierTextProperty(propertyDefinition.getName())) + { + + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + else + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + } + + private void addStatsSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) + { + addFacetSearchFields(propertyDefinition, indexedField); + } + + private void addSortSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) + { + // Can only order on single valued fields + DataTypeDefinition dataTypeDefinition = propertyDefinition.getDataType(); + if(dataTypeDefinition.getName().equals(DataTypeDefinition.TEXT)) + { + if(!propertyDefinition.isMultiValued()) + { + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) + { + indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); + } + else if (isIdentifierTextProperty(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); + } + else + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + } + } + + if(dataTypeDefinition.getName().equals(DataTypeDefinition.MLTEXT)) + { + if(!propertyDefinition.isMultiValued()) + { + if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) + || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) + { + indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); + } + else + { + if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) + { + indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); + } + else + { + indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); + } + } + } + } + } } \ No newline at end of file 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 5eda8d6d8..f4341000d 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 @@ -3826,7 +3826,7 @@ public class SolrInformationServer implements InformationServer { try { - String fieldNamePrefix = dataModel.destructuredDateTimePartFieldNamePrefix(sourceFieldName, dataType); + String fieldNamePrefix = dataModel.destructuredDateTimePartFieldNamePrefix(sourceFieldName); ZonedDateTime dateTime = ZonedDateTime.parse(value, DateTimeFormatter.ISO_ZONED_DATE_TIME); consumer.accept(fieldNamePrefix + UNIT_OF_TIME_YEAR_FIELD_SUFFIX, dateTime.getYear()); consumer.accept(fieldNamePrefix + UNIT_OF_TIME_MONTH_FIELD_SUFFIX, dateTime.getMonth().getValue()); @@ -3953,7 +3953,6 @@ public class SolrInformationServer implements InformationServer */ private Optional> getNodesMetaDataFromRepository(NodeMetaDataParameters parameters) { - Collection nodeMetaDataCollection = null; try { return Optional.of(notNullOrEmpty(repositoryClient.getNodesMetaData(parameters))); From 2487dd2a1d0369429b0904b2d848ff9f1fdde10d Mon Sep 17 00:00:00 2001 From: agazzarini Date: Tue, 2 Jun 2020 14:59:02 +0200 Subject: [PATCH 14/15] [ SEARCH-2223 ] Minor refactoring (streams + flatmap) --- .../org/alfresco/solr/SolrInformationServer.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 f4341000d..9af248938 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 @@ -380,12 +380,12 @@ public class SolrInformationServer implements InformationServer public static final String CASCADE_TRACKER_ENABLED = "alfresco.cascade.tracker.enabled"; private static final String UNIT_OF_TIME_FIELD_INFIX = "_unit_of_time"; - static final String UNIT_OF_TIME_YEAR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_year"; - static final String UNIT_OF_TIME_MONTH_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_month"; - static final String UNIT_OF_TIME_DAY_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_day"; - static final String UNIT_OF_TIME_HOUR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_hour"; - static final String UNIT_OF_TIME_MINUTE_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_minute"; - static final String UNIT_OF_TIME_SECOND_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_second"; + public static final String UNIT_OF_TIME_YEAR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_year"; + public static final String UNIT_OF_TIME_MONTH_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_month"; + public static final String UNIT_OF_TIME_DAY_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_day"; + public static final String UNIT_OF_TIME_HOUR_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_hour"; + public static final String UNIT_OF_TIME_MINUTE_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_minute"; + public static final String UNIT_OF_TIME_SECOND_FIELD_SUFFIX = UNIT_OF_TIME_FIELD_INFIX + "_second"; private final static Function> LAZY_EMPTY_MUTABLE_LIST = key -> new ArrayList<>(); From f62dee499e9c5c5f1c4fc09d36b8fd7704b1a26d Mon Sep 17 00:00:00 2001 From: agazzarini Date: Mon, 8 Jun 2020 11:14:22 +0200 Subject: [PATCH 15/15] [ SEARCH-2166 ] Conflicts with master fixed --- .../alfresco/solr/AlfrescoSolrDataModel.java | 219 ------------------ 1 file changed, 219 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 a95a2d148..97f50d702 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 @@ -1904,223 +1904,4 @@ public class AlfrescoSolrDataModel implements QueryConstants diff.getElementName())) .collect(Collectors.toSet()); } - - /* - * Adds best completion fields in order of preference - */ - private void addCompletionFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE)) - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - else if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE)) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - - /* - * Adds best fts fields in order of preference - */ - - private void addFullTextSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - if (((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.TRUE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - && !isIdentifierTextProperty(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - } - else - { - indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - - private void addHighlightSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - QName propertyName = propertyDefinition.getName(); - QName propertyDataTypeQName = propertyDefinition.getDataType().getName(); - String fieldName; - - if(propertyDataTypeQName.equals(DataTypeDefinition.MLTEXT)) - { - fieldName = getStoredMLTextField(propertyName); - } - else if(propertyDataTypeQName.equals(DataTypeDefinition.CONTENT)) - { - fieldName = getStoredContentField(propertyName); - } - else - { - fieldName = getStoredTextField(propertyName); - } - - indexedField.addField(fieldName, false, false); - } - - /* - * Adds best identifier fields in order of preference - */ - private void addIdentifierSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - - indexedField.addField(getFieldForText(true, false, false, propertyDefinition), true, false); - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), true, false); - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - } - } - - /* - * Adds best identifier fields in order of preference - */ - private void addFacetSearchFields(PropertyDefinition propertyDefinition, IndexedField indexedField) - { - if(propertyDefinition.getDataType().getName().equals(DataTypeDefinition.TEXT)) - { - if (!isIdentifierTextProperty(propertyDefinition.getName())) - { - if(propertyDefinition.getFacetable() == Facetable.TRUE) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - } - } - - - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) - || isIdentifierTextProperty(propertyDefinition.getName())) - { - - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - - private void addMultiSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH) - || isIdentifierTextProperty(propertyDefinition.getName())) - { - - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - - private void addStatsSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - addFacetSearchFields(propertyDefinition, indexedField); - } - - private void addSortSearchFields( PropertyDefinition propertyDefinition , IndexedField indexedField) - { - // Can only order on single valued fields - DataTypeDefinition dataTypeDefinition = propertyDefinition.getDataType(); - if(dataTypeDefinition.getName().equals(DataTypeDefinition.TEXT)) - { - if(!propertyDefinition.isMultiValued()) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); - } - else if (isIdentifierTextProperty(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, false, false, propertyDefinition), false, false); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - } - - if(dataTypeDefinition.getName().equals(DataTypeDefinition.MLTEXT)) - { - if(!propertyDefinition.isMultiValued()) - { - if ((propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.FALSE) - || (propertyDefinition.getIndexTokenisationMode() == IndexTokenisationMode.BOTH)) - { - indexedField.addField(getFieldForText(false, false, true, propertyDefinition), false, true); - } - else - { - if(crossLocaleSearchDataTypes.contains(propertyDefinition.getDataType().getName()) || crossLocaleSearchProperties.contains(propertyDefinition.getName())) - { - indexedField.addField(getFieldForText(false, true, false, propertyDefinition), false, false); - } - else - { - indexedField.addField(getFieldForText(true, true, false, propertyDefinition), false, false); - } - } - } - } - } } \ No newline at end of file