From ad80eb267fd01a4a88fbf5ab78850bade42befd0 Mon Sep 17 00:00:00 2001 From: trojo Date: Wed, 20 Jan 2021 09:57:25 +0100 Subject: [PATCH 1/2] ADD: multiple to many outer joins cause wrong count in distinct count queries --- .../query/other/TestQuerySingleAttribute.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index 73b80fb00..8ecaae8a9 100644 --- a/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -3,6 +3,7 @@ package org.tests.query.other; import io.ebean.BaseTestCase; import io.ebean.CountDistinctOrder; import io.ebean.CountedValue; +import io.ebean.DB; import io.ebean.Ebean; import io.ebean.Query; import org.junit.Ignore; @@ -23,6 +24,32 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class TestQuerySingleAttribute extends BaseTestCase { + + @Test + public void findSingleAttributesTwoToMany() { + ResetBasicData.reset(); + Query query = DB.find(Customer.class) + .select("name") + //.apply(toFetchPath("name")) + .setCountDistinct(CountDistinctOrder.COUNT_DESC_ATTR_ASC) + .where() + .eq("name", "Rob") + .or() + .eq("orders.status", Order.Status.NEW) + .eq("contacts.firstName", "Fred1") + .query(); + + List counted = query.findSingleAttributeList(); + CountedValue robs = (CountedValue)counted.get(0); + assertThat(robs.getValue()).isEqualTo("Rob"); + assertThat(robs.getCount()).isEqualTo(1); + + // TODO check correct future query + assertThat(sqlOf(query)).contains("select r1.attribute_1, count(*) cnt" + + " from (select t1.id attribute_1 from main_entity_relation t0 left join main_entity t1 on t1.id = t0.id1 ) r1" + + " group by r1.attribute_1" + + " order by count(*) desc, r1.attribute_1"); + } @Test public void exampleUsage() { From 38016773d4e25c80daaf2ec92b0d9ccdc377e410 Mon Sep 17 00:00:00 2001 From: trojo Date: Wed, 20 Jan 2021 10:47:53 +0100 Subject: [PATCH 2/2] added comments --- .../query/other/TestQuerySingleAttribute.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index 8ecaae8a9..a5cd5d481 100644 --- a/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/ebean-core/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -28,20 +28,33 @@ public class TestQuerySingleAttribute extends BaseTestCase { @Test public void findSingleAttributesTwoToMany() { ResetBasicData.reset(); + // Query without ors with equals causing joins, only one Customer with name Rob exists + Query query0 = DB.find(Customer.class) + .select("name") + .setCountDistinct(CountDistinctOrder.COUNT_DESC_ATTR_ASC) + .where() + .eq("name", "Rob") + .query(); + + CountedValue robs0 = (CountedValue) query0.findSingleAttributeList().get(0); + assertThat(robs0.getValue()).isEqualTo("Rob"); + assertThat(robs0.getCount()).isEqualTo(1); + + // Query with or with equals causing joins Query query = DB.find(Customer.class) .select("name") - //.apply(toFetchPath("name")) .setCountDistinct(CountDistinctOrder.COUNT_DESC_ATTR_ASC) .where() .eq("name", "Rob") .or() .eq("orders.status", Order.Status.NEW) .eq("contacts.firstName", "Fred1") + .endOr() .query(); - List counted = query.findSingleAttributeList(); - CountedValue robs = (CountedValue)counted.get(0); + CountedValue robs = (CountedValue) query.findSingleAttributeList().get(0); assertThat(robs.getValue()).isEqualTo("Rob"); + // only one Customer named rob exists, but 7 is returned for the amount of Customers named Rob assertThat(robs.getCount()).isEqualTo(1); // TODO check correct future query