diff --git a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java index f110b4e183..d87add2e8b 100644 --- a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java +++ b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2016 Alfresco Software Limited. * * This file is part of Alfresco * @@ -67,7 +67,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.extensions.surf.util.I18NUtil; /** - * GetChidren canned query + * GetChildren canned query * * To get paged list of children of a parent node filtered by child type. * Also optionally filtered and/or sorted by one or more properties (up to three). @@ -85,7 +85,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions childNodeTypeQNameIds = qnameDAO.convertQNamesToIds(childNodeTypeQNames, false); - if (childNodeTypeQNameIds.size() > 0) - { - params.setChildNodeTypeQNameIds(new ArrayList(childNodeTypeQNameIds)); - } - } + List result = new ArrayList<>(0); - if(assocTypeQNames != null) + try { - Set assocTypeQNameIds = qnameDAO.convertQNamesToIds(assocTypeQNames, false); - if (assocTypeQNameIds.size() > 0) - { - params.setAssocTypeQNameIds(assocTypeQNameIds); - } + if ((childNodeTypeQNames != null) && (childNodeTypeQNames.size() > 0)) + { + // Set child node type qnames (additional filter - performed by DB query) + Set childNodeTypeQNameIds = qnameDAO.convertQNamesToIds(childNodeTypeQNames, false); + if (childNodeTypeQNameIds.size() > 0) + { + params.setChildNodeTypeQNameIds(new ArrayList(childNodeTypeQNameIds)); + } + else + { + // short-circuit - return no results - given node type qname(s) do not exist + return result; + } + } + + if ((assocTypeQNames != null) && (assocTypeQNames.size() > 0)) + { + // Set assoc type qnames (additional filter - performed by DB query) + Set assocTypeQNameIds = qnameDAO.convertQNamesToIds(assocTypeQNames, false); + if (assocTypeQNameIds.size() > 0) + { + params.setAssocTypeQNameIds(assocTypeQNameIds); + } + else + { + // short-circuit - return no results - given assoc type qname(s) do not exist + return result; + } + } + + if (pattern != null) + { + // TODO, check that we should be tied to the content model in this way. Perhaps a configurable property + // name against which compare the pattern? + Pair nameQName = qnameDAO.getQName(ContentModel.PROP_NAME); + if(nameQName == null) + { + throw new AlfrescoRuntimeException("Unable to determine qname id of name property"); + } + params.setNamePropertyQNameId(nameQName.getFirst()); + params.setPattern(pattern); + } + + if (filterSortPropCnt > 0) + { + // filtered and/or sorted - note: permissions will be applied post query + final List children = new ArrayList(100); + final FilterSortChildQueryCallback c = getFilterSortChildQuery(children, filterProps, paramBean); + FilterSortResultHandler resultHandler = new FilterSortResultHandler(c); + cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITH_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); + resultHandler.done(); + + if (sortPairs.size() > 0) + { + Long startSort = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); + + // sort + Collections.sort(children, new PropComparatorAsc(sortPairs)); + + if (startSort != null) + { + logger.debug("Post-query sort: "+children.size()+" in "+(System.currentTimeMillis()-startSort)+" msecs"); + } + } + + result = new ArrayList(children.size()); + for (FilterSortNode child : children) + { + result.add(tenantService.getBaseName(child.getNodeRef())); + } + } + else + { + // unsorted (apart from any implicit order) - note: permissions are applied during result handling to allow early cutoff + + final int requestedCount = parameters.getResultsRequired(); + + final List rawResult = new ArrayList(Math.min(1000, requestedCount)); + UnsortedChildQueryCallback callback = getUnsortedChildQueryCallback(rawResult, requestedCount, paramBean); + UnsortedResultHandler resultHandler = new UnsortedResultHandler(callback); + cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITHOUT_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); + resultHandler.done(); + + // permissions have been applied + result = PermissionCheckedValueMixin.create(rawResult); + } } - - if (pattern != null) + finally { - // TODO, check that we should be tied to the content model in this way. Perhaps a configurable property - // name against which compare the pattern? - Pair nameQName = qnameDAO.getQName(ContentModel.PROP_NAME); - if(nameQName == null) - { - throw new AlfrescoRuntimeException("Unable to determine qname id of name property"); - } - params.setNamePropertyQNameId(nameQName.getFirst()); - params.setPattern(pattern); - } - - final List result; - - if (filterSortPropCnt > 0) - { - // filtered and/or sorted - note: permissions will be applied post query - final List children = new ArrayList(100); - final FilterSortChildQueryCallback c = getFilterSortChildQuery(children, filterProps, paramBean); - FilterSortResultHandler resultHandler = new FilterSortResultHandler(c); - cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITH_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); - resultHandler.done(); - - if (sortPairs.size() > 0) - { - Long startSort = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); - - // sort - Collections.sort(children, new PropComparatorAsc(sortPairs)); - - if (startSort != null) - { - logger.debug("Post-query sort: "+children.size()+" in "+(System.currentTimeMillis()-startSort)+" msecs"); - } - } - - result = new ArrayList(children.size()); - for (FilterSortNode child : children) - { - result.add(tenantService.getBaseName(child.getNodeRef())); - } - } - else - { - // unsorted (apart from any implicit order) - note: permissions are applied during result handling to allow early cutoff - - final int requestedCount = parameters.getResultsRequired(); - - final List rawResult = new ArrayList(Math.min(1000, requestedCount)); - UnsortedChildQueryCallback callback = getUnsortedChildQueryCallback(rawResult, requestedCount, paramBean); - UnsortedResultHandler resultHandler = new UnsortedResultHandler(callback); - cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITHOUT_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); - resultHandler.done(); - - // permissions have been applied - result = PermissionCheckedValueMixin.create(rawResult); - } - - if (start != null) - { - logger.debug("Base query "+(filterSortPropCnt > 0 ? "(sort=y, perms=n)" : "(sort=n, perms=y)")+": "+result.size()+" in "+(System.currentTimeMillis()-start)+" msecs"); + if (start != null) + { + logger.debug("Base query "+(filterSortPropCnt > 0 ? "(sort=y, perms=n)" : "(sort=n, perms=y)")+": "+result.size()+" in "+(System.currentTimeMillis()-start)+" msecs"); + } } return result; diff --git a/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java b/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java index e22f2c7293..b91df6f9a8 100644 --- a/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java +++ b/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java @@ -433,6 +433,21 @@ public class GetChildrenCannedQueryTest extends TestCase antiChildTypeQNames.add(ContentModel.TYPE_FOLDER); filterByTypeAndCheck(parentNodeRef, childTypeQNames, antiChildTypeQNames); + + // Specific super-type (that likely does not exist in DB, at least yet - see ACE-5114 - alternatively could create custom type to ensure this) + // note: results should return 0 + + childTypeQNames.clear(); + childTypeQNames.add(ContentModel.TYPE_LINK); + + PagingResults results = list(parentNodeRef, -1, -1, 0, childTypeQNames, null, null); + assertEquals(0, results.getPage().size()); + + childTypeQNames.clear(); + childTypeQNames.add(ContentModel.TYPE_CMOBJECT); + + results = list(parentNodeRef, -1, -1, 0, childTypeQNames, null, null); + assertEquals(0, results.getPage().size()); } public void testPropertyStringFiltering() throws Exception