diff --git a/repository/src/main/java/org/alfresco/ibatis/IdsEntity.java b/repository/src/main/java/org/alfresco/ibatis/IdsEntity.java index 3212b16b2c..8178745189 100644 --- a/repository/src/main/java/org/alfresco/ibatis/IdsEntity.java +++ b/repository/src/main/java/org/alfresco/ibatis/IdsEntity.java @@ -40,6 +40,7 @@ public class IdsEntity private Long idThree; private Long idFour; private List ids; + private boolean ordered; public Long getIdOne() { return idOne; @@ -80,4 +81,12 @@ public class IdsEntity { this.ids = ids; } + public boolean isOrdered() + { + return ordered; + } + public void setOrdered(boolean ordered) + { + this.ordered = ordered; + } } diff --git a/repository/src/main/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java b/repository/src/main/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java index 375dc969cf..06f724cb1d 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java +++ b/repository/src/main/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java @@ -2756,6 +2756,22 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO selectNodesWithAspects(qnameIds, minNodeId, maxNodeId, resultsCallback); } + @Override + public void getNodesWithAspects( + Set aspectQNames, + Long minNodeId, Long maxNodeId, boolean ordered, + NodeRefQueryCallback resultsCallback) + { + Set qnameIdsSet = qnameDAO.convertQNamesToIds(aspectQNames, false); + if (qnameIdsSet.size() == 0) + { + // No point running a query + return; + } + List qnameIds = new ArrayList(qnameIdsSet); + selectNodesWithAspects(qnameIds, minNodeId, maxNodeId, ordered, resultsCallback); + } + /** * @return Returns a writable copy of the cached aspects set */ @@ -4927,6 +4943,10 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO List qnameIds, Long minNodeId, Long maxNodeId, NodeRefQueryCallback resultsCallback); + protected abstract void selectNodesWithAspects( + List qnameIds, + Long minNodeId, Long maxNodeId, boolean ordered, + NodeRefQueryCallback resultsCallback); protected abstract Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex); protected abstract int updateNodeAssoc(Long id, int assocIndex); protected abstract int deleteNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId); diff --git a/repository/src/main/java/org/alfresco/repo/domain/node/NodeDAO.java b/repository/src/main/java/org/alfresco/repo/domain/node/NodeDAO.java index 775d5baa9d..7992fd4ff8 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/node/NodeDAO.java +++ b/repository/src/main/java/org/alfresco/repo/domain/node/NodeDAO.java @@ -405,6 +405,20 @@ public interface NodeDAO extends NodeBulkLoader Long minNodeId, Long maxNodeId, NodeRefQueryCallback resultsCallback); + /** + * Get nodes with aspects between the given ranges, ordering the results optionally + * + * @param aspectQNames the aspects that must be on the nodes + * @param minNodeId the minimum node ID (inclusive) + * @param maxNodeId the maximum node ID (exclusive) + * @param ordered if the results are to be ordered by nodeID + * @param resultsCallback callback to process results + */ + public void getNodesWithAspects( + Set aspectQNames, + Long minNodeId, Long maxNodeId, boolean ordered, + NodeRefQueryCallback resultsCallback); + /* * Node Assocs */ diff --git a/repository/src/main/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java b/repository/src/main/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java index 20ca86524f..c7a04958ec 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java +++ b/repository/src/main/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java @@ -764,6 +764,31 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl template.select(SELECT_NODES_WITH_ASPECT_IDS, parameters, resultHandler); } + @Override + protected void selectNodesWithAspects( + List qnameIds, + Long minNodeId, Long maxNodeId, boolean ordered, + final NodeRefQueryCallback resultsCallback) + { + @SuppressWarnings("rawtypes") + ResultHandler resultHandler = new ResultHandler() + { + public void handleResult(ResultContext context) + { + NodeEntity entity = (NodeEntity) context.getResultObject(); + Pair nodePair = new Pair(entity.getId(), entity.getNodeRef()); + resultsCallback.handle(nodePair); + } + }; + + IdsEntity parameters = new IdsEntity(); + parameters.setIdOne(minNodeId); + parameters.setIdTwo(maxNodeId); + parameters.setIds(qnameIds); + parameters.setOrdered(ordered); + template.select(SELECT_NODES_WITH_ASPECT_IDS, parameters, resultHandler); + } + @Override protected Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex) { diff --git a/repository/src/main/java/org/alfresco/repo/domain/permissions/FixedAclUpdater.java b/repository/src/main/java/org/alfresco/repo/domain/permissions/FixedAclUpdater.java index 2aa3d8b691..5901108b44 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/permissions/FixedAclUpdater.java +++ b/repository/src/main/java/org/alfresco/repo/domain/permissions/FixedAclUpdater.java @@ -192,7 +192,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli public List execute() throws Throwable { getNodesCallback.init(); - nodeDAO.getNodesWithAspects(aspects, getNodesCallback.getMinNodeId(), null, getNodesCallback); + nodeDAO.getNodesWithAspects(aspects, getNodesCallback.getMinNodeId(), null, true, getNodesCallback); getNodesCallback.done(); return getNodesCallback.getNodes(); diff --git a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/node-common-SqlMap.xml b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/node-common-SqlMap.xml index 34bf1b583a..0c3e37bb39 100644 --- a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/node-common-SqlMap.xml +++ b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/node-common-SqlMap.xml @@ -779,6 +779,7 @@ and na.qname_id in #{item} + order by node.id ASC