diff --git a/config/alfresco/ibatis/alfresco-SqlMapConfig.xml b/config/alfresco/ibatis/alfresco-SqlMapConfig.xml index 89c598ad66..f7d2b71ca8 100644 --- a/config/alfresco/ibatis/alfresco-SqlMapConfig.xml +++ b/config/alfresco/ibatis/alfresco-SqlMapConfig.xml @@ -224,6 +224,7 @@ Inbound settings from iBatis + diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-SqlMap.xml new file mode 100644 index 0000000000..afeb36cf4a --- /dev/null +++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/metadata-query-SqlMap.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file 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 0837e3cd8c..40535dec31 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 @@ -4,15 +4,11 @@ - + \ No newline at end of file diff --git a/config/alfresco/ibatis/org.hibernate.dialect.MySQLInnoDBDialect/metadata-query-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.MySQLInnoDBDialect/metadata-query-SqlMap.xml new file mode 100644 index 0000000000..511adb58ef --- /dev/null +++ b/config/alfresco/ibatis/org.hibernate.dialect.MySQLInnoDBDialect/metadata-query-SqlMap.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/search/AbstractResultSet.java b/source/java/org/alfresco/repo/search/AbstractResultSet.java index 764f1799d6..ea8ba380ec 100644 --- a/source/java/org/alfresco/repo/search/AbstractResultSet.java +++ b/source/java/org/alfresco/repo/search/AbstractResultSet.java @@ -27,7 +27,6 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSetRow; import org.alfresco.util.Pair; -import org.apache.lucene.search.HitCollector; /** * Common result set implementation. 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 b1acc15037..d906eb14b2 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 @@ -160,13 +160,13 @@ public class DBQueryEngine implements QueryEngine } dbQuery.prepare(namespaceService, dictionaryService, qnameDAO, nodeDAO, selectorGroup, null, functionContext); List nodes = (List)template.selectList(SELECT_BY_DYNAMIC_QUERY, dbQuery); - LinkedHashSet set = new LinkedHashSet(nodes.size()); + LinkedHashSet set = new LinkedHashSet(nodes.size()); for(Node node : nodes) { - set.add(node.getNodeRef()); + set.add(node.getId()); } - List nodeRefs = new ArrayList(set); - ResultSet rs = new DBResultSet(options.getAsSearchParmeters(), nodeRefs, nodeDAO, nodeService, Integer.MAX_VALUE); + List nodeIds = new ArrayList(set); + ResultSet rs = new DBResultSet(options.getAsSearchParmeters(), nodeIds, nodeDAO, nodeService, Integer.MAX_VALUE); ResultSet paged = new PagingLuceneResultSet(rs, options.getAsSearchParmeters(), nodeService); answer.put(key, paged); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBResultSet.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBResultSet.java index 2d6a8770ef..35864dde4a 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBResultSet.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBResultSet.java @@ -41,7 +41,9 @@ import org.alfresco.service.cmr.search.SearchParameters; */ public class DBResultSet extends AbstractResultSet { - private List nodeRefs; + private List dbids; + + private NodeRef[] nodeRefs; private NodeDAO nodeDao; @@ -51,12 +53,13 @@ public class DBResultSet extends AbstractResultSet private BitSet prefetch; - public DBResultSet(SearchParameters searchParameters, List nodeRefs, NodeDAO nodeDao, NodeService nodeService, int maximumResultsFromUnlimitedQuery) + public DBResultSet(SearchParameters searchParameters, List dbids, NodeDAO nodeDao, NodeService nodeService, int maximumResultsFromUnlimitedQuery) { this.nodeDao = nodeDao; - this.nodeRefs = nodeRefs; + this.dbids = dbids; this.nodeService = nodeService; - this.prefetch = new BitSet(nodeRefs.size()); + this.prefetch = new BitSet(dbids.size()); + nodeRefs= new NodeRef[(dbids.size())]; final LimitBy limitBy; int maxResults = -1; @@ -81,7 +84,7 @@ public class DBResultSet extends AbstractResultSet } this.resultSetMetaData = new SimpleResultSetMetaData( - maxResults > 0 && nodeRefs.size() < maxResults ? LimitBy.UNLIMITED : limitBy, + maxResults > 0 && dbids.size() < maxResults ? LimitBy.UNLIMITED : limitBy, PermissionEvaluationMode.EAGER, searchParameters); } @@ -91,7 +94,7 @@ public class DBResultSet extends AbstractResultSet @Override public int length() { - return nodeRefs.size(); + return dbids.size(); } /* (non-Javadoc) @@ -100,7 +103,7 @@ public class DBResultSet extends AbstractResultSet @Override public long getNumberFound() { - return nodeRefs.size(); + return dbids.size(); } /* (non-Javadoc) @@ -110,7 +113,7 @@ public class DBResultSet extends AbstractResultSet public NodeRef getNodeRef(int n) { prefetch(n); - return nodeRefs.get(n); + return nodeRefs[n]; } /* (non-Javadoc) @@ -185,8 +188,16 @@ public class DBResultSet extends AbstractResultSet } // Start at 'n' and process the the next bulk set int bulkFetchSize = getBulkFetchSize(); - List fetchList = new ArrayList(bulkFetchSize); - int totalHits = nodeRefs.size(); + if(bulkFetchSize < 1) + { + nodeRefs[n] = nodeDao.getNodePair(dbids.get(n)).getSecond(); + return; + } + + + List fetchList = new ArrayList(bulkFetchSize); + BitSet done = new BitSet(bulkFetchSize); + int totalHits = dbids.size(); for (int i = 0; i < bulkFetchSize; i++) { int next = n + i; @@ -203,12 +214,17 @@ public class DBResultSet extends AbstractResultSet // We store the node and mark it as prefetched prefetch.set(next); - fetchList.add(nodeRefs.get(next)); + fetchList.add(dbids.get(next)); + done.set(next); } // Now bulk fetch if (fetchList.size() > 1) { - nodeDao.cacheNodes(fetchList); + nodeDao.cacheNodesById(fetchList); + for (int i = done.nextSetBit(0); i >= 0; i = done.nextSetBit(i+1)) + { + nodeRefs[n+i] = nodeDao.getNodePair(fetchList.get(i)).getSecond(); + } } }