From 14ca5bb726db2be3cecb732e19625bbb6e6d7ce1 Mon Sep 17 00:00:00 2001 From: Alexandru-Eusebiu Epure Date: Wed, 27 Jan 2021 17:15:34 +0200 Subject: [PATCH] MNT-20775 : deleted-nodes with maxitems parameter take longer (#255) * MNT-20775 : rest api /deleted-nodes with maxitems parameter take longer when there are more items in the trash can Based on offset and limit, returns only the required results from database Added count query for ArchivedNodes --- .../alfresco/query/AbstractCannedQuery.java | 2 +- .../archive/GetArchivedNodesCannedQuery.java | 44 +++++++++++++++++-- .../query-archived-nodes-common-SqlMap.xml | 4 ++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/alfresco/query/AbstractCannedQuery.java b/core/src/main/java/org/alfresco/query/AbstractCannedQuery.java index a8effe90fc..6e83b4c490 100644 --- a/core/src/main/java/org/alfresco/query/AbstractCannedQuery.java +++ b/core/src/main/java/org/alfresco/query/AbstractCannedQuery.java @@ -113,7 +113,7 @@ public abstract class AbstractCannedQuery implements CannedQuery final List> finalPages = pages; // Has more items beyond requested pages ? ... ie. at least one more page (with at least one result) - final boolean hasMoreItems = (rawResults.size() > pagingDetails.getResultsRequiredForPaging()); + final boolean hasMoreItems = (rawResults.size() > pagingDetails.getResultsRequiredForPaging()) || (totalCount.getFirst() > pagingDetails.getResultsRequiredForPaging()); results = new CannedQueryResults() { diff --git a/repository/src/main/java/org/alfresco/repo/node/archive/GetArchivedNodesCannedQuery.java b/repository/src/main/java/org/alfresco/repo/node/archive/GetArchivedNodesCannedQuery.java index 7ca1d9b2c3..a358f6377d 100644 --- a/repository/src/main/java/org/alfresco/repo/node/archive/GetArchivedNodesCannedQuery.java +++ b/repository/src/main/java/org/alfresco/repo/node/archive/GetArchivedNodesCannedQuery.java @@ -36,6 +36,7 @@ import org.alfresco.repo.domain.query.CannedQueryDAO; import org.alfresco.repo.security.permissions.impl.acegi.AbstractCannedQueryPermissions; import org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityBean; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -51,6 +52,7 @@ public class GetArchivedNodesCannedQuery extends AbstractCannedQueryPermissions< private static final String QUERY_NAMESPACE = "alfresco.query.archivednodes"; private static final String QUERY_SELECT_GET_ARCHIVED_NODES = "select_GetArchivedNodesCannedQuery"; + private static final String QUERY_SELECT_COUNT_ARCHIVED_NODES = "select_CountAllArchivedNodes"; private CannedQueryDAO cannedQueryDAO; private NodeDAO nodeDAO; @@ -75,18 +77,18 @@ public class GetArchivedNodesCannedQuery extends AbstractCannedQueryPermissions< // Get parameters GetArchivedNodesCannedQueryParams paramBean = (GetArchivedNodesCannedQueryParams) paramBeanObj; - + if (paramBean.getParentNodeId() == null || paramBean.getParentNodeId() < 0) { return Collections.emptyList(); } - int resultsRequired = parameters.getResultsRequired(); - paramBean.setLimit(resultsRequired); + int offset = parameters.getPageDetails().getSkipResults(); + int limit = parameters.getPageDetails().getPageSize(); // note: refer to SQL for specific DB filtering and sorting List results = cannedQueryDAO.executeQuery(QUERY_NAMESPACE, - QUERY_SELECT_GET_ARCHIVED_NODES, paramBean, 0, Integer.MAX_VALUE); + QUERY_SELECT_GET_ARCHIVED_NODES, paramBean, offset, limit); List nodeRefs = new ArrayList(results.size()); for (ArchivedNodeEntity entity : results) @@ -119,4 +121,38 @@ public class GetArchivedNodesCannedQuery extends AbstractCannedQueryPermissions< + (System.currentTimeMillis() - start) + " msecs"); } } + + @Override + protected Pair getTotalResultCount(List results) + { + Object paramBeanObj = super.getParameters().getParameterBean(); + if (paramBeanObj == null) + { + throw new NullPointerException( + "Required parameters not provided for GetArchivedNodes canned query, unexpected null value for query params"); + } + + GetArchivedNodesCannedQueryParams paramBean = (GetArchivedNodesCannedQueryParams) paramBeanObj; + if (paramBean.getParentNodeId() == null) + { + throw new NullPointerException( + "Required parameters not provided for GetArchivedNodes canned queryUnexpected null value for parentNodeId"); + } + + Long totalResultCountLongValue = cannedQueryDAO.executeCountQuery(QUERY_NAMESPACE, QUERY_SELECT_COUNT_ARCHIVED_NODES, paramBean); + + int totalResultCount = totalResultCountLongValue.intValue(); + if (totalResultCount < 0) + { + totalResultCount = Integer.MAX_VALUE; + } + + return new Pair<>(totalResultCount, totalResultCount); + } + + @Override + protected boolean isApplyPostQueryPaging() + { + return false; + } } diff --git a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/query-archived-nodes-common-SqlMap.xml b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/query-archived-nodes-common-SqlMap.xml index eece3944fa..1d9e55280f 100644 --- a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/query-archived-nodes-common-SqlMap.xml +++ b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/query-archived-nodes-common-SqlMap.xml @@ -10,4 +10,8 @@ limit ${limit} + + \ No newline at end of file