From f8b9ca2034137959705165856edf437b4a1b4f1f Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 4 Oct 2018 20:26:00 +1300 Subject: [PATCH] #1498 - findIds() with @SoftDelete bean returns all Ids (when soft deleted ones should not return) --- .../server/query/CQueryBuilder.java | 17 +++++++--- .../tests/softdelete/TestSoftDeleteBasic.java | 32 +++++++++++++++++-- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 43f4275f0..e1f4b2249 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -138,11 +138,14 @@ class CQueryBuilder { // wrap as - delete from table where id in (select id ...) String sql = buildSql(null, request, predicates, sqlTree).getSql(); sql = request.getBeanDescriptor().getDeleteByIdInSql() + "in (" + sql + ")"; - String alias = (rootTableAlias == null) ? "t0" : rootTableAlias; - sql = aliasReplace(sql, alias); + sql = aliasReplace(sql, alias(rootTableAlias)); return sql; } + private String alias(String rootTableAlias) { + return (rootTableAlias == null) ? "t0" : rootTableAlias; + } + private String buildUpdateSql(OrmQueryRequest request, String rootTableAlias, CQueryPredicates predicates, SqlTree sqlTree) { StringBuilder sb = new StringBuilder(200); @@ -160,8 +163,7 @@ class CQueryBuilder { // wrap as - update table set ... where id in (select id ...) String sql = buildSqlUpdate(null, request, predicates, sqlTree).getSql(); sql = updateClause + " " + request.getBeanDescriptor().getWhereIdInSql() + "in (" + sql + ")"; - String alias = (rootTableAlias == null) ? "t0" : rootTableAlias; - sql = aliasReplace(sql, alias); + sql = aliasReplace(sql, alias(rootTableAlias)); return sql; } @@ -209,7 +211,12 @@ class CQueryBuilder { */ CQueryFetchSingleAttribute buildFetchIdsQuery(OrmQueryRequest request) { - request.getQuery().setSelectId(); + SpiQuery query = request.getQuery(); + query.setSelectId(); + BeanDescriptor desc = request.getBeanDescriptor(); + if (desc.isSoftDelete()) { + query.addSoftDeletePredicate(desc.getSoftDeletePredicate(alias(query.getAlias()))); + } return buildFetchAttributeQuery(request); } diff --git a/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java b/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java index d15698cda..511e68fd3 100644 --- a/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java +++ b/src/test/java/org/tests/softdelete/TestSoftDeleteBasic.java @@ -6,11 +6,10 @@ import io.ebean.Query; import io.ebean.SqlQuery; import io.ebean.SqlRow; import io.ebean.Transaction; - -import org.tests.model.softdelete.EBasicSDChild; -import org.tests.model.softdelete.EBasicSoftDelete; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; +import org.tests.model.softdelete.EBasicSDChild; +import org.tests.model.softdelete.EBasicSoftDelete; import java.util.List; @@ -18,6 +17,33 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestSoftDeleteBasic extends BaseTestCase { + @Test + public void testFindIdsWhenIncludeSoftDeletedChlld() { + + EBasicSoftDelete bean = new EBasicSoftDelete(); + bean.setName("softDelChildren"); + bean.addChild("child1", 10); + bean.addChild("child2", 20); + bean.addChild("child3", 30); + + Ebean.save(bean); + Ebean.delete(bean.getChildren().get(0)); + + LoggedSqlCollector.start(); + + List ids = Ebean.find(EBasicSDChild.class).where().eq("owner", bean).findIds(); + assertThat(ids).hasSize(2); + + List beans = Ebean.find(EBasicSDChild.class).where().eq("owner", bean).findList(); + assertThat(beans).hasSize(2); + + List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(2); + assertThat(sql.get(0)).contains("from ebasic_sdchild t0 where t0.owner_id = ? and t0.deleted = false"); + assertThat(sql.get(1)).contains("from ebasic_sdchild t0 where t0.owner_id = ? and t0.deleted = false"); + } + @Test public void test() {