From f05c23763a8c3f2457e52101e2843d70c17d22e8 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 29 Mar 2019 23:03:21 +0100 Subject: [PATCH 1/2] Fix paging issue in resource accounts (MID-4784) A similar fix should be perhaps applied at other places where we introduce default strict sequentiality of true. --- .../midpoint/provisioning/impl/ShadowManager.java | 13 +++++++------ .../midpoint/repo/api/RepositoryService.java | 10 ++++++++++ .../midpoint/repo/sql/SqlRepositoryServiceImpl.java | 11 +---------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 0a10b56edc9..2cca0ca51b9 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -24,6 +24,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.*; import org.apache.commons.lang.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -58,10 +59,6 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.Visitor; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; @@ -717,8 +714,12 @@ public SearchResultMetadata searchObjectsIterativeRepository( ObjectQuery repoQuery = query.clone(); processQueryMatchingRules(repoQuery, ctx.getObjectClassDefinition()); - - return repositoryService.searchObjectsIterative(ShadowType.class, repoQuery, repoHandler, options, true, parentResult); + + boolean strictlySequential = RepositoryService.isCustomPagingOkWithPagedSeqIteration(query); + if (!strictlySequential) { + LOGGER.debug("Avoiding strictly sequential paged iteration default because custom paging is used"); + } + return repositoryService.searchObjectsIterative(ShadowType.class, repoQuery, repoHandler, options, strictlySequential, parentResult); } /** diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java index 4ea2e9aa82f..66d91d7a093 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; import com.evolveum.midpoint.schema.*; @@ -636,4 +637,13 @@ boolean selectorMatches(ObjectSelectorType objectSelector void unregisterConflictWatcher(ConflictWatcher watcher); boolean hasConflict(ConflictWatcher watcher, OperationResult result); + + // TODO move to some util class + static boolean isCustomPagingOkWithPagedSeqIteration(ObjectQuery query) { + if (query == null || query.getPaging() == null) { + return true; + } + ObjectPaging paging = query.getPaging(); + return !paging.hasOrdering() && !paging.hasGrouping() && paging.getOffset() == null; + } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index 2ae9d9391ac..2d63b66c6a1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -52,7 +52,6 @@ import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.SystemConfigurationTypeUtil; -import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -818,7 +817,7 @@ public SearchResultMetadata searchObjectsIterative(Class< if (explicitIterationMethod == null || explicitIterationMethod == IterationMethodType.DEFAULT) { if (getConfiguration().isIterativeSearchByPaging()) { if (strictlySequential) { - if (isCustomPagingOkWithPagedSeqIteration(query)) { + if (RepositoryService.isCustomPagingOkWithPagedSeqIteration(query)) { iterationMethod = IterationMethodType.STRICTLY_SEQUENTIAL_PAGING; } else { // TODO switch to LOGGER.error @@ -856,14 +855,6 @@ public SearchResultMetadata searchObjectsIterative(Class< return null; } - public static boolean isCustomPagingOkWithPagedSeqIteration(ObjectQuery query) { - if (query == null || query.getPaging() == null) { - return true; - } - ObjectPaging paging = query.getPaging(); - return !paging.hasOrdering() && !paging.hasGrouping() && paging.getOffset() == null; - } - @Nullable private SearchResultMetadata searchObjectsIterativeBySingleTransaction(Class type, ObjectQuery query, ResultHandler handler, Collection> options, OperationResult subResult) From 8b741e5a10776b329c09794451308d75178e27a0 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 29 Mar 2019 23:13:28 +0100 Subject: [PATCH 2/2] Compilation fix --- .../com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index 735f458fc4a..3f0090c5740 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -801,7 +801,7 @@ public void searchObjectsIterativeByPagingStrictlySequent throws SchemaException { try { - if (!SqlRepositoryServiceImpl.isCustomPagingOkWithPagedSeqIteration(query)) { + if (!RepositoryService.isCustomPagingOkWithPagedSeqIteration(query)) { throw new IllegalArgumentException("Externally specified paging is not supported on strictly sequential " + "iterative search. Query = " + query); }