diff --git a/src/test/java/org/tests/m2m/softdelete/MsManyA.java b/src/test/java/org/tests/m2m/softdelete/MsManyA.java new file mode 100644 index 000000000..193eb5b0c --- /dev/null +++ b/src/test/java/org/tests/m2m/softdelete/MsManyA.java @@ -0,0 +1,51 @@ +package org.tests.m2m.softdelete; + +import io.ebean.annotation.SoftDelete; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.List; + +@Entity +public class MsManyA { + + @Id + Long aid; + + String name; + + @SoftDelete + boolean deleted; + + @ManyToMany + List manybs; + + public MsManyA(String name) { + this.name = name; + } + + public Long getAid() { + return aid; + } + + public void setAid(Long aid) { + this.aid = aid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getManybs() { + return manybs; + } + + public void setManybs(List manybs) { + this.manybs = manybs; + } +} diff --git a/src/test/java/org/tests/m2m/softdelete/MsManyB.java b/src/test/java/org/tests/m2m/softdelete/MsManyB.java new file mode 100644 index 000000000..2ae3f9340 --- /dev/null +++ b/src/test/java/org/tests/m2m/softdelete/MsManyB.java @@ -0,0 +1,27 @@ +package org.tests.m2m.softdelete; + +import io.ebean.annotation.SoftDelete; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.List; + +@Entity +public class MsManyB { + + @Id + Long bid; + + String name; + + @SoftDelete + boolean deleted; + + @ManyToMany + List manyas; + + public MsManyB(String name) { + this.name = name; + } +} diff --git a/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java b/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java new file mode 100644 index 000000000..3b70d92a6 --- /dev/null +++ b/src/test/java/org/tests/m2m/softdelete/TestM2MSoftDeleteExists.java @@ -0,0 +1,110 @@ +package org.tests.m2m.softdelete; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.Query; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; + +public class TestM2MSoftDeleteExists extends BaseTestCase { + + private List as = new ArrayList<>(); + private List bs = new ArrayList<>(); + + @Test + public void test() { + + setup(); + + Query query = Ebean.find(MsManyA.class) + .where().isNotEmpty("manybs") + .order("aid"); + + List list = query.findList(); + + if (isPlatformBooleanNative()) { + assertThat(sqlOf(query)).contains("from ms_many_a t0 where exists (select 1 from ms_many_a_many_b x join ms_many_b x2 on x2.bid = x.ms_many_b_bid where x.ms_many_a_aid = t0.aid and x2.deleted = false) and t0.deleted = false"); + } + assertThat(list).hasSize(3); + assertThat(list.get(0).getName()).isEqualTo("a0"); + assertThat(list.get(1).getName()).isEqualTo("a1"); + assertThat(list.get(2).getName()).isEqualTo("a2"); + + testDeletedB0(); + + } + + private void testDeletedB0() { + + Ebean.delete(bs.get(0)); + + List list = Ebean.find(MsManyA.class) + .where().isNotEmpty("manybs") + .order("aid") + .findList(); + + assertThat(list).hasSize(2); + assertThat(list.get(0).getName()).isEqualTo("a1"); + assertThat(list.get(1).getName()).isEqualTo("a2"); + + testDeletedB1(); + } + + private void testDeletedB1() { + + Ebean.delete(bs.get(1)); + + List list = Ebean.find(MsManyA.class) + .where().isNotEmpty("manybs") + .order("aid") + .findList(); + + assertThat(list).hasSize(1); + assertThat(list.get(0).getName()).isEqualTo("a1"); + + testEndTotals(); + } + + private void testEndTotals() { + + assertEquals(5, Ebean.find(MsManyA.class).findCount()); + assertEquals(3, Ebean.find(MsManyB.class).findCount()); + assertEquals(5, Ebean.find(MsManyB.class).setIncludeSoftDeletes().findCount()); + } + + private void setup() { + clean(); + seed(); + } + + private void clean() { + + Ebean.createSqlUpdate("delete from ms_many_a_many_b").execute(); + Ebean.createSqlUpdate("delete from ms_many_a").execute(); + Ebean.createSqlUpdate("delete from ms_many_b").execute(); + } + + private void seed() { + for (int i = 0; i < 5; i++) { + as.add(new MsManyA("a" + i)); + bs.add(new MsManyB("b" + i)); + } + + Ebean.saveAll(as); + Ebean.saveAll(bs); + + as.get(0).getManybs().add(bs.get(0)); + as.get(1).getManybs().addAll(bs); + as.get(2).getManybs().add(bs.get(1)); + + Ebean.save(as.get(0)); + Ebean.save(as.get(1)); + Ebean.save(as.get(2)); + } + +}