This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push: new d5dde6a CAY-2683 Don't use DISTINCT for joins on to-one related tables d5dde6a is described below commit d5dde6af44489ce8de7fca136eba1db358e073db Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Fri Oct 9 16:58:15 2020 +0300 CAY-2683 Don't use DISTINCT for joins on to-one related tables --- RELEASE-NOTES.txt | 10 ++++++++++ .../cayenne/access/translator/select/DistinctStage.java | 17 ++++++++++++++++- .../select/DefaultObjectSelectTranslatorIT.java | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 13c2e3c..f8d051c 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -8,6 +8,16 @@ To browse individual bug reports check out project issue tracker: https://issues.apache.org/jira/browse/CAY ---------------------------------- +Release: 4.2.M3 +Date: +---------------------------------- +Changes/New Features: + +Bug Fixes: + +CAY-2683 Don't use DISTINCT for joins on to-one related tables + +---------------------------------- Release: 4.2.M2 Date: October 6, 2020 ---------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java index 5e4f492..8c18612 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DistinctStage.java @@ -20,6 +20,7 @@ package org.apache.cayenne.access.translator.select; import java.sql.Types; +import java.util.concurrent.atomic.AtomicBoolean; /** * @since 4.2 @@ -54,7 +55,7 @@ class DistinctStage implements TranslationStage { } // query forcing distinct or query have joins (qualifier or prefetch) - if(!context.getQuery().isDistinct() && context.getTableTree().getNodeCount() <= 1) { + if(!context.getQuery().isDistinct() && !hasToManyJoin(context)) { return; } @@ -68,4 +69,18 @@ class DistinctStage implements TranslationStage { } context.getSelectBuilder().distinct(); } + + private 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(); + } } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java index da440fe..80f06a6 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultObjectSelectTranslatorIT.java @@ -102,7 +102,7 @@ public class DefaultObjectSelectTranslatorIT extends ServerCase { String sql = translator.getSql(); - assertTrue(sql.startsWith("SELECT DISTINCT")); + assertTrue(sql.startsWith("SELECT ")); assertTrue(sql.contains("t0.ESTIMATED_PRICE")); assertTrue(sql.contains("t0.PAINTING_DESCRIPTION")); assertTrue(sql.contains("t0.PAINTING_TITLE"));