CAY-2141 Skip repetitive query parameters
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/6818800a Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/6818800a Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/6818800a Branch: refs/heads/master Commit: 6818800aa84fbd2857cc15ca9ccf032cbb177442 Parents: a117694 Author: Nikita Timofeev <ntimof...@objectstyle.com> Authored: Mon Nov 21 11:12:58 2016 +0300 Committer: Nikita Timofeev <ntimof...@objectstyle.com> Committed: Mon Nov 21 11:12:58 2016 +0300 ---------------------------------------------------------------------- .../access/HierarchicalObjectResolver.java | 42 ++++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/6818800a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java index 9d1e5f6..e220f9c 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java @@ -173,37 +173,23 @@ class HierarchicalObjectResolver { .getParentDataDomain() .getMaxIdQualifierSize(); - List<PrefetchSelectQuery> queries = new ArrayList<PrefetchSelectQuery>(); + List<PrefetchSelectQuery> queries = new ArrayList<>(); int qualifiersCount = 0; PrefetchSelectQuery currentQuery = null; List<DbJoin> joins = lastDbRelationship.getJoins(); Set<List<Object>> values = new HashSet<>(); for (Object dataRow : parentDataRows) { - Expression allJoinsQualifier = null; - // handling too big qualifiers if (currentQuery == null || (maxIdQualifierSize > 0 && qualifiersCount + joins.size() > maxIdQualifierSize)) { - if(currentQuery != null) { - for(List<Object> joinValues : values) { - for(int i=0; i<joins.size(); i++) { - Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix - + joins.get(i).getTargetName(), joinValues.get(i)); - if (allJoinsQualifier == null) { - allJoinsQualifier = joinQualifier; - } else { - allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier); - } - } - currentQuery.orQualifier(allJoinsQualifier); - } - } + createDisjointByIdPrefetchQualifier(pathPrefix, currentQuery, joins, values); currentQuery = new PrefetchSelectQuery(node.getPath(), relationship); queries.add(currentQuery); qualifiersCount = 0; + values = new HashSet<>(); } List<Object> joinValues = new ArrayList<>(); @@ -216,6 +202,8 @@ class HierarchicalObjectResolver { qualifiersCount += joins.size(); } } + // add final part of values + createDisjointByIdPrefetchQualifier(pathPrefix, currentQuery, joins, values); PrefetchTreeNode jointSubtree = node.cloneJointSubtree(); @@ -240,6 +228,26 @@ class HierarchicalObjectResolver { return startDisjointPrefetch(node); } + private void createDisjointByIdPrefetchQualifier(String pathPrefix, PrefetchSelectQuery currentQuery, + List<DbJoin> joins, Set<List<Object>> values) { + Expression allJoinsQualifier; + if(currentQuery != null) { + for(List<Object> joinValues : values) { + allJoinsQualifier = null; + for(int i=0; i<joins.size(); i++) { + Expression joinQualifier = ExpressionFactory.matchDbExp(pathPrefix + + joins.get(i).getTargetName(), joinValues.get(i)); + if (allJoinsQualifier == null) { + allJoinsQualifier = joinQualifier; + } else { + allJoinsQualifier = allJoinsQualifier.andExp(joinQualifier); + } + } + currentQuery.orQualifier(allJoinsQualifier); + } + } + } + public boolean startJointPrefetch(PrefetchTreeNode node) { // delegate processing of the top level joint prefetch to a joint processor,