From 63def00626fcc697a8d0485779a0961c785df811 Mon Sep 17 00:00:00 2001 From: OndrejPacay Date: Sun, 30 Apr 2017 12:33:02 +0200 Subject: [PATCH] #1012 - Filtering on embedded values in a joined table does not produce a sql join (#1013) --- .../server/deploy/BeanPropertyAssocOne.java | 2 + .../server/el/ElPropertyChainBuilder.java | 9 ++- .../TestFilteringByEmbeddedInJoinedTable.java | 73 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/tests/query/embedded/TestFilteringByEmbeddedInJoinedTable.java diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index 08ae836cf..c1154baa0 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -181,6 +181,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { chain = new ElPropertyChainBuilder(true, propName); } chain.add(this); + chain.setEmbedded(true); + return chain.add(embProp).build(); } diff --git a/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java b/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java index cb4e7d55e..271af5c47 100644 --- a/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java +++ b/src/main/java/io/ebeaninternal/server/el/ElPropertyChainBuilder.java @@ -19,7 +19,7 @@ public class ElPropertyChainBuilder { private final List chain = new ArrayList<>(); - private final boolean embedded; + private boolean embedded; private boolean containsMany; @@ -61,4 +61,11 @@ public class ElPropertyChainBuilder { return new ElPropertyChain(containsMany, embedded, expression, chain.toArray(new ElPropertyValue[chain.size()])); } + /** + * Permits to set whole chain as embedded when the leaf is embedded + * @param embedded + */ + public void setEmbedded(boolean embedded) { + this.embedded = embedded; + } } diff --git a/src/test/java/org/tests/query/embedded/TestFilteringByEmbeddedInJoinedTable.java b/src/test/java/org/tests/query/embedded/TestFilteringByEmbeddedInJoinedTable.java new file mode 100644 index 000000000..10062a1a3 --- /dev/null +++ b/src/test/java/org/tests/query/embedded/TestFilteringByEmbeddedInJoinedTable.java @@ -0,0 +1,73 @@ +package org.tests.query.embedded; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.ExpressionList; +import org.hamcrest.core.Is; +import org.junit.Assert; +import org.junit.Test; +import org.tests.model.embedded.EEmbDatePeriod; +import org.tests.model.embedded.EEmbInner; +import org.tests.model.embedded.EEmbOuter; + +import java.util.Date; +import java.util.List; + +/** + * Test that selecting A and filtering on 'B.C=some_value' will correctly create join on table for B. + * Model: + * - Bean A has relation to bean B + * - Bean B has an embedded property C + */ +public class TestFilteringByEmbeddedInJoinedTable extends BaseTestCase { + + private EEmbOuter createOuter(String nomeOuter, Date date1, Date date2) { + EEmbOuter outer1 = new EEmbOuter(); + outer1.setNomeOuter(nomeOuter); + + EEmbDatePeriod eEmbDatePeriod = new EEmbDatePeriod(); + eEmbDatePeriod.setDate1(date1); + eEmbDatePeriod.setDate2(date2); + outer1.setDatePeriod(eEmbDatePeriod); + + Ebean.save(outer1); + return outer1; + } + + @Test + public void testOuterTableJoined() { + + EEmbOuter outer1 = createOuter("outer1", new Date(11111), new Date(12222)); + // Unused outer2 just to populate the DB + EEmbOuter outer2 = createOuter("outer2", new Date(21111), new Date(22222)); + EEmbOuter outer3 = createOuter("outer3", new Date(31111), new Date(32222)); + + + EEmbInner inner1 = new EEmbInner(); + inner1.setOuter(outer1); + inner1.setNomeInner("inner1-1"); + Ebean.save(inner1); + + EEmbInner inner2 = new EEmbInner(); + // Setting outer1 also here + inner2.setOuter(outer1); + inner2.setNomeInner("inner2-1"); + Ebean.save(inner2); + + EEmbInner inner3 = new EEmbInner(); + inner3.setOuter(outer3); + inner3.setNomeInner("inner3-3"); + Ebean.save(inner3); + + ExpressionList el = Ebean.find(EEmbInner.class).where() + .eq("outer.datePeriod.date1", new Date(11111)); + List list = el.findList(); + + Assert.assertThat(list.size(), Is.is(2)); + + } +} + + + +