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"));