You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2020/10/09 13:58:37 UTC

[cayenne] branch master updated: CAY-2683 Don't use DISTINCT for joins on to-one related tables

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 <st...@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"));