From 3c508b6ad69b8a913852004c092abed1ef072d0e Mon Sep 17 00:00:00 2001 From: Jurgen <5031427+Jugen@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:53:21 +0200 Subject: [PATCH] Moved hasToManyJoin to TableTree --- .../translator/select/DistinctStage.java | 23 +------------------ .../translator/select/OrderingStage.java | 7 +++++- .../access/translator/select/TableTree.java | 15 ++++++++++++ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java index 75cd6e3159..bdf9c90c38 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java @@ -20,7 +20,6 @@ package org.apache.cayenne.access.translator.select; import java.sql.Types; -import java.util.concurrent.atomic.AtomicBoolean; /** * @since 4.2 @@ -55,7 +54,7 @@ public void perform(TranslatorContext context) { } // query forcing distinct or query have joins (qualifier or prefetch) - if(!context.getQuery().isDistinct() && !hasToManyJoin(context)) { + if(!context.getQuery().isDistinct() && !context.getTableTree().hasToManyJoin()) { return; } @@ -69,24 +68,4 @@ public void perform(TranslatorContext context) { } context.getSelectBuilder().distinct(); } - - private static boolean hasToManyJoin(TranslatorContext context) { - if(context.getTableTree().getNodeCount() <= 1) { - return false; - } - - AtomicBoolean atomicBoolean = new AtomicBoolean(false); - context.getTableTree().visit(node -> { - if(node.getRelationship() != null && node.getRelationship().isToMany()) { - atomicBoolean.set(true); - } - }); - return atomicBoolean.get(); - } - - static boolean isDistinct(TranslatorContext context) { - return !context.isDistinctSuppression() - && (context.getQuery().isDistinct() - || hasToManyJoin(context)); - } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/OrderingStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/OrderingStage.java index 9e75c904cd..8d01f7cd33 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/OrderingStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/OrderingStage.java @@ -48,7 +48,7 @@ public void perform(TranslatorContext context) { return; } - isDistinctOrGroupByQuery = GroupByStage.hasAggregate(context) || DistinctStage.isDistinct(context); + isDistinctOrGroupByQuery = GroupByStage.hasAggregate(context) || isDistinct(context); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); for(Ordering ordering : context.getQuery().getOrderings()) { @@ -106,4 +106,9 @@ private String getSqlString(NodeBuilder nb) { return strBuilder.append(' ').toString(); } + private boolean isDistinct(TranslatorContext context) { + return !context.isDistinctSuppression() + && (context.getQuery().isDistinct() + || context.getTableTree().hasToManyJoin()); + } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TableTree.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TableTree.java index 0816ea8b3c..3523baba6f 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TableTree.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TableTree.java @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import org.apache.cayenne.CayenneRuntimeException; @@ -96,6 +97,20 @@ public int getNodeCount() { return tableNodes.size() + 1; } + boolean hasToManyJoin() { + if(getNodeCount() <= 1) { + return false; + } + + AtomicBoolean atomicBoolean = new AtomicBoolean(false); + visit(node -> { + if(node.getRelationship() != null && node.getRelationship().isToMany()) { + atomicBoolean.set(true); + } + }); + return atomicBoolean.get(); + } + public void visit(TableNodeVisitor visitor) { visitor.visit(rootNode);