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 71809ad60..6f89c6fd5 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 @@ -121,7 +121,6 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; import com.carrotsearch.hppc.IntArrayList; @@ -1767,7 +1766,7 @@ public class SolrInformationServer implements InformationServer .map(StringPropertyValue::getValue) .map(Boolean::parseBoolean) .orElse(true); - + addDocCmd.solrDoc = isIndexed ? populateWithMetadata( basicDocument(nodeMetaData, DOC_TYPE_NODE, PartialSolrInputDocument::new), @@ -2175,7 +2174,12 @@ public class SolrInformationServer implements InformationServer document, contentIndexingHasBeenEnabledOnThisInstance); - keepContentFields(document); + if( isContentIndexedForNode( metadata.getProperties()) ) + { + keepContentFields(document); + } else { + deleteContentField(document); + } LOGGER.debug("Document size (fields) after getting properties from node {} metadata: {}", metadata.getId(), document.size()); @@ -2407,11 +2411,6 @@ public class SolrInformationServer implements InformationServer contentIndexingHasBeenEnabledOnThisInstance && contentIndexingHasBeenRequestedForThisNode; - if (!contentIndexingIsEnabled) - { - markAsContentInSynch(document); - } - final BiConsumer setValue = document::setField; final BiConsumer addValue = document::addField; final BiConsumer collectName = (name, value) -> addFieldIfNotSet(document, name); @@ -2817,7 +2816,7 @@ public class SolrInformationServer implements InformationServer } } - private void keepContentFields(PartialSolrInputDocument doc) + private void applyContentFields(PartialSolrInputDocument doc, BiConsumer consumer) { String qNamePart = CONTENT_LOCALE_FIELD.substring(AlfrescoSolrDataModel.CONTENT_S_LOCALE_PREFIX.length()); QName propertyQName = QName.createQName(qNamePart); @@ -2825,20 +2824,28 @@ public class SolrInformationServer implements InformationServer dataModel.getIndexedFieldForSpecializedPropertyMetadata(propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_STATUS) .getFields() .stream() - .forEach(field -> doc.keepField(field.getField())); + .forEach(field -> consumer.accept(doc, field.getField())); dataModel.getIndexedFieldForSpecializedPropertyMetadata(propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_EXCEPTION) .getFields() .stream() - .forEach(field -> doc.keepField(field.getField())); + .forEach(field -> consumer.accept(doc, field.getField())); dataModel.getIndexedFieldForSpecializedPropertyMetadata(propertyQName, AlfrescoSolrDataModel.SpecializedFieldType.TRANSFORMATION_TIME) .getFields() .stream() - .forEach(field -> doc.keepField(field.getField())); + .forEach(field -> consumer.accept(doc, field.getField())); - doc.keepField(FINGERPRINT_FIELD); - doc.keepField(dataModel.getStoredContentField(propertyQName)); + consumer.accept(doc, FINGERPRINT_FIELD); + consumer.accept(doc, dataModel.getStoredContentField(propertyQName)); + } + + private void deleteContentField(PartialSolrInputDocument doc) { + applyContentFields( doc, (doc2, field) -> doc2.removeField(field) ); + } + private void keepContentFields(PartialSolrInputDocument doc) + { + applyContentFields(doc, (doc2, field) -> doc2.keepField(field)); } private String languageFrom(String locale) diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/AlfrescoSolrTrackerIT.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/AlfrescoSolrTrackerIT.java index 3e0d935be..7734a8337 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/AlfrescoSolrTrackerIT.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/tracker/AlfrescoSolrTrackerIT.java @@ -254,23 +254,7 @@ public class AlfrescoSolrTrackerIT extends AbstractAlfrescoSolrIT logger.info("#################### Passed Eighth Test ##############################"); - - //Add document with isContentIndexed=false - - Transaction txnNoContent = getTransaction(0, 1); - Node noContentNode = getNode(txnNoContent, acl, Node.SolrApiNodeStatus.UPDATED); - NodeMetaData noContentMetaData = getNodeMetaData(noContentNode, txnNoContent, acl, "mike", null, false); - noContentMetaData.getProperties().put(ContentModel.PROP_IS_CONTENT_INDEXED, new StringPropertyValue("false")); - noContentMetaData.getProperties().put(ContentModel.PROP_CONTENT, new ContentPropertyValue(Locale.UK, 298L, "UTF-8", "text/json", null)); - indexTransaction(txnNoContent, list(noContentNode), list(noContentMetaData)); - - //This tests that the mime type has been added for this document. It is the only document with text/json in the index. - waitForDocCount(new TermQuery(new Term("content@s__mimetype@{http://www.alfresco.org/model/content/1.0}content", "text/json")), 1, MAX_WAIT_TIME); - //Many of the tests beyond this point rely on a specific count of documents in the index that have content. - //This document should not have had the content indexed so the tests following will pass. - //If the content had been indexed the tests following this one would have failed. - //This proves that the ContentModel.PROP_IS_CONTENT_INDEXED property is being followed by the tracker - + testIsContentIndexed(acl); //Try bulk loading @@ -435,4 +419,48 @@ public class AlfrescoSolrTrackerIT extends AbstractAlfrescoSolrIT waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", Long.toString(errorNode.getId()))), 1, MAX_WAIT_TIME); logger.info("#################### Passed Nineteenth Test ##############################"); } + + // test cm:isContentIndexed property + private void testIsContentIndexed(Acl acl) throws Exception + { + // number of existing documents before running this test + final int previousNumberOfDocuments = 2; + + waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", "world")), previousNumberOfDocuments, MAX_WAIT_TIME); + + // adds a document with cm:indexControl aspect with "cm:isIndexed" as true and "cm:isContentIndexed" is false + Transaction txnWithAspect = getTransaction(0, 1); + Node aspectNode = getNode(txnWithAspect, acl, Node.SolrApiNodeStatus.UPDATED); + NodeMetaData aspectNodeMetaData = getNodeMetaData(aspectNode, txnWithAspect, acl, "mike", null, false); + aspectNodeMetaData.getAspects().add(ContentModel.ASPECT_INDEX_CONTROL); + aspectNodeMetaData.getProperties().put(ContentModel.PROP_IS_INDEXED, new StringPropertyValue("true")); + aspectNodeMetaData.getProperties().put(ContentModel.PROP_IS_CONTENT_INDEXED, new StringPropertyValue("false")); + indexTransaction(txnWithAspect, list(aspectNode), list(aspectNodeMetaData)); + + // the new document is not supposed to be indexed + waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", "world")), previousNumberOfDocuments, MAX_WAIT_TIME); + + // switch "cm:isContentIndexed" from false to true + Transaction txnContentIndexedFromTrueToFalse = getTransaction(0, 1); + aspectNodeMetaData.getProperties().put(ContentModel.PROP_IS_CONTENT_INDEXED, new StringPropertyValue("true")); + indexTransaction(txnContentIndexedFromTrueToFalse, list(aspectNode), list(aspectNodeMetaData)); + + // it's supposed the new document to be indexed + waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", "world")), previousNumberOfDocuments+1, MAX_WAIT_TIME); + + // switch "cm:isContentIndexed" from true to false + Transaction txnContentIndexedFromFalseToTrue = getTransaction(0, 1); + aspectNodeMetaData.getProperties().put(ContentModel.PROP_IS_CONTENT_INDEXED, new StringPropertyValue("false")); + indexTransaction(txnContentIndexedFromFalseToTrue, list(aspectNode), list(aspectNodeMetaData)); + + // it's supposed the new document not to be indexed again + waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", "world")), previousNumberOfDocuments, MAX_WAIT_TIME); + + // delete document + Transaction txnDeleteContentIndexed = getTransaction(1, 0); + indexTransaction(txnDeleteContentIndexed, list(aspectNode), list(aspectNodeMetaData)); + + // it's supposed to the new document disappear + waitForDocCount(new TermQuery(new Term("content@s___t@{http://www.alfresco.org/model/content/1.0}content", "world")), previousNumberOfDocuments, MAX_WAIT_TIME); + } }