diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-common-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-common-SqlMap.xml index 40535dec31..4bde2f1b60 100644 --- a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-common-SqlMap.xml +++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-common-SqlMap.xml @@ -35,6 +35,7 @@ where node.type_qname_id <> #{sysDeletedType} AND node.store_id = #{storeId} + AND node.transaction_id > #{sinceTxId} AND diff --git a/config/alfresco/subsystems/Search/common-opencmis-context.xml b/config/alfresco/subsystems/Search/common-opencmis-context.xml index b2a3b19b60..c1526d3df8 100644 --- a/config/alfresco/subsystems/Search/common-opencmis-context.xml +++ b/config/alfresco/subsystems/Search/common-opencmis-context.xml @@ -22,7 +22,8 @@ ${solr.query.cmis.queryConsistency} - + + @@ -44,7 +45,8 @@ ${solr.query.cmis.queryConsistency} - + + diff --git a/config/alfresco/subsystems/Search/common-search-context.xml b/config/alfresco/subsystems/Search/common-search-context.xml index bbb1bd4656..c15ab8bfa7 100644 --- a/config/alfresco/subsystems/Search/common-search-context.xml +++ b/config/alfresco/subsystems/Search/common-search-context.xml @@ -84,7 +84,7 @@ ${solr.query.fts.queryConsistency} - + diff --git a/source/java/org/alfresco/cmis/CMISQueryOptions.java b/source/java/org/alfresco/cmis/CMISQueryOptions.java index e3cc2e608a..3c409a0166 100644 --- a/source/java/org/alfresco/cmis/CMISQueryOptions.java +++ b/source/java/org/alfresco/cmis/CMISQueryOptions.java @@ -74,6 +74,7 @@ public class CMISQueryOptions extends QueryOptions options.setDefaultFieldName(searchParameters.getDefaultFieldName()); options.setBulkFetchEnabled(searchParameters.isBulkFetchEnabled()); options.setExcludeTenantFilter(searchParameters.getExcludeTenantFilter()); + options.setSinceTxId(searchParameters.getSinceTxId()); return options; } /** diff --git a/source/java/org/alfresco/repo/search/impl/lucene/SolrJSONResultSet.java b/source/java/org/alfresco/repo/search/impl/lucene/SolrJSONResultSet.java index cb10e61c7f..c2880b1397 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/SolrJSONResultSet.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/SolrJSONResultSet.java @@ -70,6 +70,8 @@ public class SolrJSONResultSet implements ResultSet private NodeDAO nodeDao; + private long lastIndexedTxId; + /** * Detached result set based on that provided * @param resultSet @@ -89,6 +91,7 @@ public class SolrJSONResultSet implements ResultSet numberFound = response.getLong("numFound"); start = response.getLong("start"); maxScore = Float.valueOf(response.getString("maxScore")); + lastIndexedTxId = json.getLong("lastIndexedTx"); JSONArray docs = response.getJSONArray("docs"); @@ -377,4 +380,9 @@ public class SolrJSONResultSet implements ResultSet return Collections.>emptyList(); } } + + public long getLastIndexedTxId() + { + return lastIndexedTxId; + } } diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQuery.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQuery.java index 66e988ad2f..8cf5a6e3f2 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQuery.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQuery.java @@ -63,6 +63,8 @@ public class DBQuery extends BaseQuery implements DBQueryBuilderComponent private Long sysDeletedType; + private Long sinceTxId; + Set selectorGroup; /** @@ -110,6 +112,22 @@ public class DBQuery extends BaseQuery implements DBQueryBuilderComponent this.sysDeletedType = sysDeletedType; } + /** + * @return the sinceTxId + */ + public Long getSinceTxId() + { + return this.sinceTxId; + } + + /** + * @param sinceTxId the sinceTxId to set + */ + public void setSinceTxId(Long sinceTxId) + { + this.sinceTxId = sinceTxId; + } + public List getJoins() { HashMap singleJoins = new HashMap(); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java index a37be894b5..701a051b74 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java @@ -170,6 +170,15 @@ public class DBQueryEngine implements QueryEngine { dbQuery.setSysDeletedType(sysDeletedType.getFirst()); } + + Long sinceTxId = options.getSinceTxId(); + if (sinceTxId == null) + { + // By default, return search results for all transactions. + sinceTxId = -1L; + } + dbQuery.setSinceTxId(sinceTxId); + dbQuery.prepare(namespaceService, dictionaryService, qnameDAO, nodeDAO, tenantService, selectorGroup, null, functionContext); List nodes = (List)template.selectList(SELECT_BY_DYNAMIC_QUERY, dbQuery); LinkedHashSet set = new LinkedHashSet(nodes.size()); diff --git a/source/java/org/alfresco/repo/search/impl/solr/DbOrIndexSwitchingQueryLanguage.java b/source/java/org/alfresco/repo/search/impl/solr/DbOrIndexSwitchingQueryLanguage.java index 4f4403e500..ecee24228c 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/DbOrIndexSwitchingQueryLanguage.java +++ b/source/java/org/alfresco/repo/search/impl/solr/DbOrIndexSwitchingQueryLanguage.java @@ -18,10 +18,23 @@ */ package org.alfresco.repo.search.impl.solr; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.alfresco.repo.domain.node.Node; +import org.alfresco.repo.domain.solr.SOLRDAO; import org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl; import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage; import org.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI; +import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet; import org.alfresco.repo.search.impl.querymodel.QueryModelException; +import org.alfresco.repo.search.results.ChildAssocRefResultSet; +import org.alfresco.repo.solr.NodeParameters; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.search.QueryConsistency; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; @@ -31,7 +44,7 @@ import org.springframework.util.StopWatch; /** * @author Andy - * + * @author Matt Ward */ public class DbOrIndexSwitchingQueryLanguage extends AbstractLuceneQueryLanguage { @@ -42,6 +55,7 @@ public class DbOrIndexSwitchingQueryLanguage extends AbstractLuceneQueryLanguage LuceneQueryLanguageSPI indexQueryLanguage; QueryConsistency queryConsistency = QueryConsistency.DEFAULT; + private NodeService nodeService; private SOLRDAO solrDao; @@ -76,6 +90,11 @@ public class DbOrIndexSwitchingQueryLanguage extends AbstractLuceneQueryLanguage this.queryConsistency = queryConsistency; } + + + /** + * @param nodeService the nodeService to set + */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; @@ -227,6 +246,8 @@ public class DbOrIndexSwitchingQueryLanguage extends AbstractLuceneQueryLanguage } + + private ResultSet executeHybridQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher) { @@ -249,6 +270,8 @@ public class DbOrIndexSwitchingQueryLanguage extends AbstractLuceneQueryLanguage logger.debug("SOLR query returned " + indexResults.length() + " results in " + stopWatch.getLastTaskTimeMillis() + "ms"); } + // TODO: if the results are up-to-date, then nothing more to do - return the results. + if (!(indexResults instanceof SolrJSONResultSet)) { if (logger.isWarnEnabled())