diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformer.java new file mode 100644 index 000000000..5977dc4db --- /dev/null +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformer.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2005-2020 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.solr.transformer; + +import org.alfresco.solr.AlfrescoSolrDataModel; +import org.apache.lucene.index.IndexableField; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.response.DocsStreamer; +import org.apache.solr.response.ResultContext; +import org.apache.solr.response.transform.DocTransformer; +import org.apache.solr.schema.SchemaField; +import org.apache.solr.search.SolrReturnFields; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * @author Andy, Elia + * + */ +public class AlfrescoFieldMapperTransformer extends DocTransformer +{ + protected final static Logger log = LoggerFactory.getLogger(AlfrescoFieldMapperTransformer.class); + + private ResultContext context; + private SolrReturnFields solrReturnFields; + + /* (non-Javadoc) + * @see org.apache.solr.response.transform.DocTransformer#getName() + */ + @Override + public String getName() + { + return "alfrescoMapper"; + } + + + public void setContext( ResultContext context ) + { + this.context = context; + } + + /* (non-Javadoc) + * @see org.apache.solr.response.transform.DocTransformer#transform(org.apache.solr.common.SolrDocument, int) + */ + @Override + public void transform(SolrDocument doc, int docid, float score) { + Collection fieldNames = new ArrayList<>(doc.getFieldNames()); + solrReturnFields = new SolrReturnFields(context.getRequest().getParams().get("originalFl"), context.getRequest()); + + for (String fieldName : fieldNames) + { + SchemaField schemaField = context.getSearcher().getSchema().getFieldOrNull(fieldName); + if(schemaField != null) + { + String alfrescoFieldName = AlfrescoSolrDataModel.getInstance().getAlfrescoPropertyFromSchemaField(fieldName); + if (isRequestedField(alfrescoFieldName) || alfrescoFieldName.equals("id")) + { + Object value = doc.getFieldValue(fieldName); + doc.removeFields(fieldName); + if (schemaField.multiValued()) + { + Object collectionValue = ((Collection) value).stream() + .map(elem -> getFieldValue(schemaField, elem)) + .collect(Collectors.toSet()); + doc.setField(alfrescoFieldName, collectionValue); + } + else + { + doc.setField(transformToUnderscoreNotation(alfrescoFieldName), + getFieldValue(schemaField, value)); + } + + } + else + { + doc.removeFields(alfrescoFieldName); + doc.removeFields(fieldName); + } + } + } + } + + private boolean isRequestedField(String fieldName) + { + return solrReturnFields.wantsField(transformToUnderscoreNotation(fieldName)); + } + + private static String transformToUnderscoreNotation(String value) + { + return value.contains(":") ? value.replace(":", "_") : value; + } + + private String removeLocale(String value) + { + int start = value.lastIndexOf('\u0000'); + if(start == -1){ + return value; + } else { + return value.substring(start + 1); + } + } + + private Object getFieldValue(SchemaField schemaField, Object value){ + Object indexedValue = DocsStreamer.getValue(schemaField, (IndexableField) value); + return indexedValue instanceof String? removeLocale((String) indexedValue) : indexedValue; + } +} diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformerFactory.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerFactory.java similarity index 89% rename from search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformerFactory.java rename to search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerFactory.java index f11954b97..fad9c154a 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformerFactory.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerFactory.java @@ -1,42 +1,42 @@ -/* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.solr.transformer; - -import org.apache.solr.common.params.SolrParams; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.transform.DocTransformer; -import org.apache.solr.response.transform.TransformerFactory; - -/** - * @author Andy - * - */ -public class CachedDocTransformerFactory extends TransformerFactory -{ - - /* (non-Javadoc) - * @see org.apache.solr.response.transform.TransformerFactory#create(java.lang.String, org.apache.solr.common.params.SolrParams, org.apache.solr.request.SolrQueryRequest) - */ - @Override - public DocTransformer create(String field, SolrParams params, SolrQueryRequest req) - { - return new CachedDocTransformer(); - } - -} +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.solr.transformer; + +import org.apache.solr.common.params.SolrParams; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.transform.DocTransformer; +import org.apache.solr.response.transform.TransformerFactory; + +/** + * @author Andy + * + */ +public class AlfrescoFieldMapperTransformerFactory extends TransformerFactory +{ + + /* (non-Javadoc) + * @see org.apache.solr.response.transform.TransformerFactory#create(java.lang.String, org.apache.solr.common.params.SolrParams, org.apache.solr.request.SolrQueryRequest) + */ + @Override + public DocTransformer create(String field, SolrParams params, SolrQueryRequest req) + { + return new AlfrescoFieldMapperTransformer(); + } + +} diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java deleted file mode 100644 index 5d6e230b6..000000000 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/transformer/CachedDocTransformer.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.solr.transformer; - -import static org.alfresco.repo.search.adaptor.lucene.QueryConstants.FIELD_SOLR4_ID; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; - -import org.alfresco.solr.AlfrescoCoreAdminHandler; -import org.alfresco.solr.AlfrescoSolrDataModel; -import org.alfresco.solr.AlfrescoSolrDataModel.TenantAclIdDbId; -import org.alfresco.solr.SolrInformationServer; -import org.alfresco.solr.content.SolrContentStore; -import org.apache.lucene.index.IndexableField; -import org.apache.solr.common.SolrDocument; -import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.core.CoreContainer; -import org.apache.solr.response.ResultContext; -import org.apache.solr.response.transform.DocTransformer; -import org.apache.solr.schema.SchemaField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author Andy - * - */ -public class CachedDocTransformer extends DocTransformer -{ - protected final static Logger log = LoggerFactory.getLogger(CachedDocTransformer.class); - - private ResultContext context; - - /* (non-Javadoc) - * @see org.apache.solr.response.transform.DocTransformer#getName() - */ - @Override - public String getName() - { - return "Alfresco cached document transformer"; - } - - - public void setContext( ResultContext context ) - { - this.context = context; - } - - /* (non-Javadoc) - * @see org.apache.solr.response.transform.DocTransformer#transform(org.apache.solr.common.SolrDocument, int) - */ - @Override - public void transform(SolrDocument doc, int docid, float score) throws IOException - { - SolrInputDocument cachedDoc = null; - try - { - String id = getFieldValueString(doc, FIELD_SOLR4_ID); - TenantAclIdDbId tenantAndDbId = AlfrescoSolrDataModel.decodeNodeDocumentId(id); - CoreContainer coreContainer = context.getSearcher().getCore().getCoreContainer(); - AlfrescoCoreAdminHandler coreAdminHandler = (AlfrescoCoreAdminHandler) coreContainer.getMultiCoreHandler(); - SolrInformationServer srv = (SolrInformationServer) coreAdminHandler.getInformationServers().get(context.getSearcher().getCore().getName()); - SolrContentStore solrContentStore = srv.getSolrContentStore(); - cachedDoc = solrContentStore.retrieveDocFromSolrContentStore(tenantAndDbId.tenant, tenantAndDbId.dbId); - } - catch(StringIndexOutOfBoundsException e) - { - // ignore invalid forms .... - } - - if(cachedDoc != null) - { - Collection fieldNames = cachedDoc.getFieldNames(); - for (String fieldName : fieldNames) - { - SchemaField schemaField = context.getSearcher().getSchema().getFieldOrNull(fieldName); - if(schemaField != null) - { - doc.removeFields(fieldName); - if(schemaField.multiValued()) - { - int index = fieldName.lastIndexOf("@{"); - if(index == -1) - { - doc.addField(fieldName, cachedDoc.getFieldValues(fieldName)); - } - else - { - String alfrescoFieldName = AlfrescoSolrDataModel.getInstance().getAlfrescoPropertyFromSchemaField(fieldName); - Collection values = cachedDoc.getFieldValues(fieldName); - - //Guard against null pointer in case data model field name does not match up with cachedDoc field name. - if(values != null) { - ArrayList newValues = new ArrayList(values.size()); - for (Object value : values) { - if (value instanceof String) { - String stringValue = (String) value; - int start = stringValue.lastIndexOf('\u0000'); - if (start == -1) { - newValues.add(stringValue); - } else { - newValues.add(stringValue.substring(start + 1)); - } - } else { - newValues.add(value); - } - - } - doc.removeFields(alfrescoFieldName); - doc.addField(alfrescoFieldName, newValues); - } - } - } - else - { - int index = fieldName.lastIndexOf("@{"); - if(index == -1) - { - doc.addField(fieldName, cachedDoc.getFieldValue(fieldName)); - } - else - { - String alfrescoFieldName = AlfrescoSolrDataModel.getInstance().getAlfrescoPropertyFromSchemaField(fieldName); - alfrescoFieldName = alfrescoFieldName.contains(":") ? alfrescoFieldName.replace(":", "_") : alfrescoFieldName; - Object value = cachedDoc.getFieldValue(fieldName); - if(value instanceof String) - { - String stringValue = (String) value; - int start = stringValue.lastIndexOf('\u0000'); - if(start == -1) - { - doc.removeFields(alfrescoFieldName); - doc.addField(alfrescoFieldName, stringValue); - } - else - { - doc.removeFields(alfrescoFieldName); - doc.addField(alfrescoFieldName, stringValue.substring(start+1)); - } - } - else - { - doc.removeFields(alfrescoFieldName); - doc.addField(alfrescoFieldName, value); - } - } - } - } - } - } - - } - - - private String getFieldValueString(SolrDocument doc, String fieldName) - { - Object o = doc.getFieldValue(fieldName); - if(o != null) - { - if(o instanceof IndexableField) - { - IndexableField field = (IndexableField)o; - return field.stringValue(); - } - else if(o instanceof String) - { - return (String)o; - } - else - { - return o.toString(); - } - } - else - { - return null; - } - } -} diff --git a/search-services/alfresco-search/src/main/java/org/apache/solr/handler/component/AlfrescoSearchHandler.java b/search-services/alfresco-search/src/main/java/org/apache/solr/handler/component/AlfrescoSearchHandler.java index d2c21dc39..b544cd1de 100644 --- a/search-services/alfresco-search/src/main/java/org/apache/solr/handler/component/AlfrescoSearchHandler.java +++ b/search-services/alfresco-search/src/main/java/org/apache/solr/handler/component/AlfrescoSearchHandler.java @@ -18,6 +18,12 @@ */ package org.apache.solr.handler.component; +import static java.util.Optional.of; +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; import static org.apache.solr.common.params.CommonParams.PATH; import java.io.BufferedReader; @@ -28,9 +34,13 @@ import java.io.Reader; import java.io.StringWriter; import java.lang.invoke.MethodHandles; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.solr.AlfrescoSolrDataModel; import org.alfresco.solr.query.AbstractQParser; +import org.apache.cxf.transport.http.auth.HttpAuthHeader; import org.apache.lucene.document.Document; import org.apache.lucene.index.ExitableDirectoryReader; import org.apache.lucene.index.IndexableField; @@ -58,6 +68,7 @@ import org.apache.solr.schema.SchemaField; import org.apache.solr.search.DocIterator; import org.apache.solr.search.DocList; import org.apache.solr.search.SolrQueryTimeoutImpl; +import org.apache.solr.search.SolrReturnFields; import org.apache.solr.search.facet.FacetModule; import org.apache.solr.util.RTimerTree; import org.apache.solr.util.SolrPluginUtils; @@ -287,11 +298,91 @@ public class AlfrescoSearchHandler extends RequestHandlerBase implements return shardHandler; } + + /** + * 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 + * @param req + */ + private void transformFieldList(SolrQueryRequest req) + { + if (req.getParams().get("originalFl") != null) + return; + + Set fieldListSet = new HashSet<>(); + + Set defaultNonCachedFields = Set.of("id","DBID", "_version_"); + Set allowedNonCachedFields = new HashSet<>(defaultNonCachedFields); + allowedNonCachedFields.add("score"); + + SolrReturnFields solrReturnFields = new SolrReturnFields(req); + String originalFieldList = req.getParams().get("fl"); + + boolean cacheTransformer = ofNullable(solrReturnFields.getTransformer()) + .map(t -> t.getName()) + .map(name -> name.contains("alfrescoMapper")) + .orElse(false); + + ModifiableSolrParams params = new ModifiableSolrParams(req.getParams()); + + + // In case cache transformer is no set, we need to modify the field list in order return + // only id, DBID and _version_ fields + if (!cacheTransformer){ + if (solrReturnFields.wantsAllFields()) + { + fieldListSet.addAll(defaultNonCachedFields); + } + else + { + fieldListSet.addAll(solrReturnFields.getLuceneFieldNames() + .stream() + .filter(field -> allowedNonCachedFields.contains(field)) + .collect(Collectors.toSet())); + } + + params.set("fl", fieldListSet.stream().collect(Collectors.joining(","))); + } + else + { + if (solrReturnFields.wantsAllFields() || solrReturnFields.hasPatternMatching()) + { + fieldListSet.add("*"); + } + else + { + List fieldUsed = List.of(FTS, FACET, ID, SORT); + fieldListSet.addAll(solrReturnFields.getLuceneFieldNames().stream() + .flatMap(field -> + fieldUsed.stream() + .map( fieldUse -> AlfrescoSolrDataModel.getInstance() + .mapProperty(field, fieldUse, req))) + .filter(schemaFieldName -> schemaFieldName != null) + .map(schemaFieldName -> schemaFieldName.chars() + .mapToObj(c -> (char) c) + .map(c -> Character.isJavaIdentifierPart(c)? c : '?') + .map(Object::toString) + .collect(Collectors.joining())) + .collect(Collectors.toSet())); + } + + params.add("fl", fieldListSet.stream().collect(Collectors.joining(","))); + } + + // This is added for filtering the fields in the cached transformer. + params.set("originalFl", originalFieldList); + req.setParams(params); + } + @Override public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { readJsonIntoContent(req); + transformFieldList(req); + List components = getComponents(); ResponseBuilder rb = new ResponseBuilder(req, rsp, components); if (rb.requestInfo != null) { diff --git a/search-services/alfresco-search/src/main/resources/solr/instance/templates/noRerank/conf/solrconfig.xml b/search-services/alfresco-search/src/main/resources/solr/instance/templates/noRerank/conf/solrconfig.xml index 331a4de85..ef42a2ca8 100644 --- a/search-services/alfresco-search/src/main/resources/solr/instance/templates/noRerank/conf/solrconfig.xml +++ b/search-services/alfresco-search/src/main/resources/solr/instance/templates/noRerank/conf/solrconfig.xml @@ -1782,13 +1782,10 @@ EditorialMarkerFactory will do exactly that: --> - - - - - + + diff --git a/search-services/alfresco-search/src/main/resources/solr/instance/templates/rerank/conf/solrconfig.xml b/search-services/alfresco-search/src/main/resources/solr/instance/templates/rerank/conf/solrconfig.xml index 60a2dfdae..3d4477288 100644 --- a/search-services/alfresco-search/src/main/resources/solr/instance/templates/rerank/conf/solrconfig.xml +++ b/search-services/alfresco-search/src/main/resources/solr/instance/templates/rerank/conf/solrconfig.xml @@ -1785,11 +1785,11 @@ --> - - + - - + + + diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/CachedDocTransformerIT.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerIT.java similarity index 86% rename from search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/CachedDocTransformerIT.java rename to search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerIT.java index f5d60d098..24c3ddc29 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/CachedDocTransformerIT.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/transformer/AlfrescoFieldMapperTransformerIT.java @@ -56,7 +56,7 @@ import static org.alfresco.solr.AlfrescoSolrUtils.getTransaction; import static org.alfresco.solr.AlfrescoSolrUtils.indexAclChangeSet; @SolrTestCaseJ4.SuppressSSL -public class CachedDocTransformerIT extends AbstractAlfrescoDistributedIT +public class AlfrescoFieldMapperTransformerIT extends AbstractAlfrescoDistributedIT { public static final String ALFRESCO_JSON = "{\"locales\":[\"en\"], \"templates\": [{\"name\":\"t1\", \"template\":\"%cm:content\"}]}"; @@ -64,7 +64,7 @@ public class CachedDocTransformerIT extends AbstractAlfrescoDistributedIT public static void initData() throws Throwable { // FIXME: 1 shard?? - initSolrServers(1, CachedDocTransformerIT.getSimpleClassName(), null); + initSolrServers(1, AlfrescoFieldMapperTransformerIT.getSimpleClassName(), null); populateAlfrescoData(); } @@ -183,6 +183,35 @@ public class CachedDocTransformerIT extends AbstractAlfrescoDistributedIT assertNotNull(docWithAllFields.get("DBID")); } + @Test + public void transformDocument_docTransformerGlobsFieldRequested_shouldReturnMatchedFields() throws Exception + { + putHandleDefaults(); + + QueryResponse resp = query(getDefaultTestClient(), true, ALFRESCO_JSON, params("q", "*", "qt", "/afts", "shards.qt", "/afts","fl","cm?title, *name, [cached]")); + assertNotNull(resp); + SolrDocumentList results = resp.getResults(); + SolrDocument docWithAllFields = results.get(0); + assertEquals(4, docWithAllFields.size()); + assertNotNull(docWithAllFields.get("cm_title")); + assertNotNull(docWithAllFields.get("cm:title")); + assertNotNull(docWithAllFields.get("cm_name")); + } + + @Test + public void transformDocument_docTransformerIsUsedWithOtherTransformer_shouldExecuteBothTranformers() throws Exception + { + putHandleDefaults(); + + QueryResponse resp = query(getDefaultTestClient(), true, ALFRESCO_JSON, params("q", "*", "qt", "/afts", "shards.qt", "/afts","fl","cm_title, [explain], [cached]")); + assertNotNull(resp); + SolrDocumentList results = resp.getResults(); + SolrDocument docWithAllFields = results.get(0); + assertEquals(2, docWithAllFields.size()); + assertNotNull(docWithAllFields.get("cm_title")); + assertNotNull(docWithAllFields.get("[explain]")); + } + private static void populateAlfrescoData() throws Exception { AclChangeSet aclChangeSet = getAclChangeSet(1); diff --git a/search-services/alfresco-search/src/test/resources/test-files/collection1/conf/solrconfig.xml b/search-services/alfresco-search/src/test/resources/test-files/collection1/conf/solrconfig.xml index 55917d17c..a84413271 100644 --- a/search-services/alfresco-search/src/test/resources/test-files/collection1/conf/solrconfig.xml +++ b/search-services/alfresco-search/src/test/resources/test-files/collection1/conf/solrconfig.xml @@ -553,7 +553,7 @@ - + diff --git a/search-services/alfresco-search/src/test/resources/test-files/master/conf/solrconfig.xml b/search-services/alfresco-search/src/test/resources/test-files/master/conf/solrconfig.xml index c05053d6e..a62f2cb9a 100644 --- a/search-services/alfresco-search/src/test/resources/test-files/master/conf/solrconfig.xml +++ b/search-services/alfresco-search/src/test/resources/test-files/master/conf/solrconfig.xml @@ -559,7 +559,7 @@ - + diff --git a/search-services/alfresco-search/src/test/resources/test-files/slave/conf/solrconfig.xml b/search-services/alfresco-search/src/test/resources/test-files/slave/conf/solrconfig.xml index 8d92bca34..edb360b9f 100644 --- a/search-services/alfresco-search/src/test/resources/test-files/slave/conf/solrconfig.xml +++ b/search-services/alfresco-search/src/test/resources/test-files/slave/conf/solrconfig.xml @@ -558,7 +558,7 @@ - +