#1253 - Query where many isNotEmpty() ... on ManyToMany with SoftDelete produces incorrect SQL

Failing test
This commit is contained in:
Rob Bygrave
2018-02-09 15:00:29 +13:00
parent 66b6dba921
commit caa36262c1
3 changed files with 188 additions and 0 deletions
@@ -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<MsManyB> 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<MsManyB> getManybs() {
return manybs;
}
public void setManybs(List<MsManyB> manybs) {
this.manybs = manybs;
}
}
@@ -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<MsManyA> manyas;
public MsManyB(String name) {
this.name = name;
}
}
@@ -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<MsManyA> as = new ArrayList<>();
private List<MsManyB> bs = new ArrayList<>();
@Test
public void test() {
setup();
Query<MsManyA> query = Ebean.find(MsManyA.class)
.where().isNotEmpty("manybs")
.order("aid");
List<MsManyA> 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<MsManyA> 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<MsManyA> 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));
}
}