diff --git a/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java b/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java index 79ecbd46a..0f8078c9d 100644 --- a/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java +++ b/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java @@ -74,5 +74,5 @@ public interface SpiExpressionRequest { /** * Append IN expression taking into account platform and type support for Multi-value. */ - void appendInExpression(Object[] bindValues); + void appendInExpression(boolean not, Object[] bindValues); } diff --git a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index 030615494..3b46d59c1 100644 --- a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -275,10 +275,10 @@ public class InternalConfiguration { private MultiValueBind createMultiValueBind(Platform platform) { switch (platform) { - case H2: - return new H2MultiValueBind(); case POSTGRES: return new PostgresMultiValueBind(); +// case H2: +// return new H2MultiValueBind(); // case SQLSERVER: // return new SqlServerTvpMultiValueHelp(); // case ORACLE: diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index dcb92c73a..3469bb0c5 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1663,7 +1663,7 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { * Return a raw expression for 'where parent id in ...' clause. */ public String getParentIdInExpr(int parentIdSize, String rawWhere) { - String inClause = idBinder.getIdInValueExpr(parentIdSize); + String inClause = idBinder.getIdInValueExpr(false, parentIdSize); return idBinder.isIdInExpandedForm() ? inClause : rawWhere + inClause; } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java b/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java index c2545d06f..c8e8b3a8a 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java @@ -137,7 +137,7 @@ public final class BeanFkeyProperty implements ElPropertyValue { * Returns null as not an AssocOne. */ @Override - public String getAssocIdInValueExpr(int size) { + public String getAssocIdInValueExpr(boolean not, int size) { return null; } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java index fd78177a7..c2a720481 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java @@ -909,7 +909,7 @@ public class BeanProperty implements ElPropertyValue, Property { } @Override - public String getAssocIdInValueExpr(int size) { + public String getAssocIdInValueExpr(boolean not, int size) { // Returns null as not an AssocOne. return null; } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 52844c8f1..897d1ab8c 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -440,7 +440,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { private String buildInClauseBinding(int size, String bindProto) { if (descriptor.isSimpleId()) { - return descriptor.getIdBinder().getIdInValueExpr(size); + return descriptor.getIdBinder().getIdInValueExpr(false, size); } StringBuilder sb = new StringBuilder(10 + (size * (bindProto.length() + 1))); sb.append(" in"); @@ -545,8 +545,8 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { * Return the logical id value expression taking into account embedded id's. */ @Override - public String getAssocIdInValueExpr(int size) { - return targetDescriptor.getIdBinder().getIdInValueExpr(size); + public String getAssocIdInValueExpr(boolean not, int size) { + return targetDescriptor.getIdBinder().getIdInValueExpr(not, size); } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index f4679cb19..fa845bad7 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -207,7 +207,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { StringBuilder sb = new StringBuilder(100); sb.append(deleteByParentIdInSql); - String inClause = targetIdBinder.getIdInValueExpr(parentIdist.size()); + String inClause = targetIdBinder.getIdInValueExpr(false, parentIdist.size()); sb.append(inClause); DefaultSqlUpdate delete = new DefaultSqlUpdate(sb.toString()); @@ -256,7 +256,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { private List findIdsByParentIdList(List parentIdList, Transaction t) { String rawWhere = deriveWhereParentIdSql(true); - String inClause = targetIdBinder.getIdInValueExpr(parentIdList.size()); + String inClause = targetIdBinder.getIdInValueExpr(false, parentIdList.size()); String expr = rawWhere + inClause; @@ -445,8 +445,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { * Return the logical id value expression taking into account embedded id's. */ @Override - public String getAssocIdInValueExpr(int size) { - return targetDescriptor.getIdBinder().getIdInValueExpr(size); + public String getAssocIdInValueExpr(boolean not, int size) { + return targetDescriptor.getIdBinder().getIdInValueExpr(not, size); } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java index bce0e892d..766f9eb60 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java +++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java @@ -153,7 +153,7 @@ public interface IdBinder { /** * Return the binding expression (like "?" or "(?,?)")for the Id. */ - String getIdInValueExpr(int size); + String getIdInValueExpr(boolean not, int size); /** * Same as getIdInValueExpr but for delete by id. diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java index 7a5b4d276..5013b2d9e 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java +++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java @@ -170,7 +170,7 @@ public final class IdBinderEmbedded implements IdBinder { throw new IndexOutOfBoundsException("The size must be at least 1"); } if (!idInExpandedForm) { - return getIdInValueExpr(size); + return getIdInValueExpr(false, size); } StringBuilder sb = new StringBuilder(); @@ -195,12 +195,14 @@ public final class IdBinderEmbedded implements IdBinder { } @Override - public String getIdInValueExpr(int size) { + public String getIdInValueExpr(boolean not, int size) { if (size <= 0) { throw new IndexOutOfBoundsException("The size must be at least 1"); } StringBuilder sb = new StringBuilder(); - + if (not) { + sb.append(" not"); + } if (!idInExpandedForm) { sb.append(" in"); } diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java index 5a04f0d91..01052b076 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java +++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java @@ -88,11 +88,11 @@ public final class IdBinderEmpty implements IdBinder { @Override public String getIdInValueExprDelete(int size) { - return getIdInValueExpr(size); + return getIdInValueExpr(false, size); } @Override - public String getIdInValueExpr(int size) { + public String getIdInValueExpr(boolean not, int size) { return ""; } diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java index ac97ea374..a4da8e3f2 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java +++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java @@ -133,15 +133,15 @@ public final class IdBinderSimple implements IdBinder { @Override public String getIdInValueExprDelete(int size) { - return getIdInValueExpr(size); + return getIdInValueExpr(false, size); } @Override - public String getIdInValueExpr(int size) { + public String getIdInValueExpr(boolean not, int size) { if (size <= 0) { throw new IndexOutOfBoundsException("The size must be at least 1"); } - return multiValueBind.getInExpression(scalarType, size); + return multiValueBind.getInExpression(not, scalarType, size); } @Override diff --git a/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java b/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java index 125c71dde..032570fc5 100644 --- a/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java +++ b/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java @@ -192,8 +192,8 @@ public class ElPropertyChain implements ElPropertyValue { } @Override - public String getAssocIdInValueExpr(int size) { - return lastElPropertyValue.getAssocIdInValueExpr(size); + public String getAssocIdInValueExpr(boolean not, int size) { + return lastElPropertyValue.getAssocIdInValueExpr(not, size); } @Override diff --git a/src/main/java/io/ebeaninternal/server/el/ElPropertyValue.java b/src/main/java/io/ebeaninternal/server/el/ElPropertyValue.java index 7f59fcc19..bbae84850 100644 --- a/src/main/java/io/ebeaninternal/server/el/ElPropertyValue.java +++ b/src/main/java/io/ebeaninternal/server/el/ElPropertyValue.java @@ -14,7 +14,7 @@ public interface ElPropertyValue extends ElPropertyDeploy, ExpressionPath { /** * Return the logical id value expression taking into account embedded id's. */ - String getAssocIdInValueExpr(int size); + String getAssocIdInValueExpr(boolean not, int size); /** * Return the logical id in expression taking into account embedded id's. diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java index e2e7851db..6f800cfbf 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionRequest.java @@ -161,7 +161,7 @@ public class DefaultExpressionRequest implements SpiExpressionRequest { } @Override - public void appendInExpression(Object[] bindValues) { - append(binder.getInExpression(bindValues)); + public void appendInExpression(boolean not, Object[] bindValues) { + append(binder.getInExpression(not, bindValues)); } } diff --git a/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java b/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java index aa76daebe..a8a5197b0 100644 --- a/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java @@ -72,7 +72,7 @@ public class IdInExpression extends NonPrepareExpression { request.append("1=0"); // append false for this stage } else { request.append(descriptor.getIdBinder().getBindIdInSql(null)); - String inClause = idBinder.getIdInValueExpr(idCollection.size()); + String inClause = idBinder.getIdInValueExpr(false, idCollection.size()); request.append(inClause); } } @@ -87,7 +87,7 @@ public class IdInExpression extends NonPrepareExpression { request.append("1=0"); // append false for this stage } else { request.append(descriptor.getIdBinderInLHSSql()); - String inClause = idBinder.getIdInValueExpr(idCollection.size()); + String inClause = idBinder.getIdInValueExpr(false, idCollection.size()); request.append(inClause); } } diff --git a/src/main/java/io/ebeaninternal/server/expression/InExpression.java b/src/main/java/io/ebeaninternal/server/expression/InExpression.java index 73da10629..58c479058 100644 --- a/src/main/java/io/ebeaninternal/server/expression/InExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/InExpression.java @@ -102,18 +102,12 @@ class InExpression extends AbstractExpression { if (prop != null) { request.append(prop.getAssocIdInExpr(propName)); - String inClause = prop.getAssocIdInValueExpr(bindValues.length); - if (not) { - request.append(" not"); - } + String inClause = prop.getAssocIdInValueExpr(not, bindValues.length); request.append(inClause); } else { request.append(propName); - if (not) { - request.append(" not"); - } - request.appendInExpression(bindValues); + request.appendInExpression(not, bindValues); } } diff --git a/src/main/java/io/ebeaninternal/server/persist/Binder.java b/src/main/java/io/ebeaninternal/server/persist/Binder.java index d031adf47..34a3f8f2c 100644 --- a/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -229,9 +229,9 @@ public class Binder { /** * Return the SQL in clause taking into account Multi-value support. */ - public String getInExpression(Object[] bindValues) { + public String getInExpression(boolean not, Object[] bindValues) { ScalarType type = getScalarType(bindValues[0].getClass()); - return multiValueBind.getInExpression(type, bindValues.length); + return multiValueBind.getInExpression(not, type, bindValues.length); } /** diff --git a/src/main/java/io/ebeaninternal/server/persist/platform/H2MultiValueBind.java b/src/main/java/io/ebeaninternal/server/persist/platform/H2MultiValueBind.java index 30b56a194..8cf279a9e 100644 --- a/src/main/java/io/ebeaninternal/server/persist/platform/H2MultiValueBind.java +++ b/src/main/java/io/ebeaninternal/server/persist/platform/H2MultiValueBind.java @@ -10,10 +10,10 @@ import io.ebeaninternal.server.type.ScalarType; public class H2MultiValueBind extends AbstractMultiValueBind { @Override - public String getInExpression(ScalarType type, int size) { + public String getInExpression(boolean not, ScalarType type, int size) { String arrayType = getArrayType(type.getJdbcType()); if (arrayType == null) { - return super.getInExpression(type, size); + return super.getInExpression(not, type, size); } else { StringBuilder sb = new StringBuilder(50); sb.append(" in (select * from table(x ").append(arrayType).append(" = ?)) "); diff --git a/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java b/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java index 342651273..7df88ebde 100644 --- a/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java +++ b/src/main/java/io/ebeaninternal/server/persist/platform/MultiValueBind.java @@ -55,8 +55,11 @@ public class MultiValueBind { /** * Appends the 'in' expression to the request. Must add leading & trailing space! */ - public String getInExpression(ScalarType type, int size) { + public String getInExpression(boolean not, ScalarType type, int size) { StringBuilder sb = new StringBuilder(); + if (not) { + sb.append(" not"); + } sb.append(" in (?"); for (int i = 1; i < size; i++) { sb.append(", ").append("?"); diff --git a/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java b/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java index 418f92587..ac8141a5b 100644 --- a/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java +++ b/src/main/java/io/ebeaninternal/server/persist/platform/PostgresMultiValueBind.java @@ -4,31 +4,22 @@ import io.ebean.config.dbplatform.ExtraDbTypes; import io.ebeaninternal.server.type.ScalarType; /** - * Multi value binder that uses Postgres Array and unnest. - * - * @author Roland Praml, FOCONIS AG + * Multi value binder that uses Postgres Array. */ public class PostgresMultiValueBind extends AbstractMultiValueBind { @Override - public String getInExpression(ScalarType type, int size) { + public String getInExpression(boolean not, ScalarType type, int size) { int dbType = type.getJdbcType(); if (dbType == ExtraDbTypes.UUID) { - return " in (select(unnest(?))::uuid) "; + return (not) ? " != all(?::uuid[])" : " = any(?::uuid[])"; } String arrayType = getArrayType(dbType); if (arrayType == null) { - return super.getInExpression(type, size); + return super.getInExpression(not, type, size); } else { - return " in (select(unnest(?))) "; + return (not) ? " != all(?)" : " = any(?)"; } } - @Override - protected String getArrayType(int dbType) { - if (dbType == ExtraDbTypes.UUID) { - return "uuid"; - } - return super.getArrayType(dbType); - } } diff --git a/src/test/java/io/ebean/BaseTestCase.java b/src/test/java/io/ebean/BaseTestCase.java index 66b163495..09b2100bf 100644 --- a/src/test/java/io/ebean/BaseTestCase.java +++ b/src/test/java/io/ebean/BaseTestCase.java @@ -15,6 +15,8 @@ import org.tests.model.basic.Country; import java.sql.Types; +import static org.assertj.core.api.Assertions.assertThat; + @RunWith(ConditionalTestRunner.class) public abstract class BaseTestCase { @@ -131,6 +133,29 @@ public abstract class BaseTestCase { .findList(); } + /** + * Platform specific IN clause assert. + */ + protected void platformAssertIn(String sql, String containsIn) { + if (isPostgres()) { + assertThat(sql).contains(containsIn+" = any("); + } else { + assertThat(sql).contains(containsIn+" in "); + } + // H2 contains("where t0.name in (select * from table(x varchar = ?)"); + } + + /** + * Platform specific NOT IN clause assert. + */ + protected void platformAssertNotIn(String sql, String containsIn) { + if (isPostgres()) { + assertThat(sql).contains(containsIn+" != all("); + } else { + assertThat(sql).contains(containsIn+" not in "); + } + } + protected OrmQueryRequest createQueryRequest(SpiQuery.Type type, Query query, Transaction t) { return HelpCreateQueryRequest.create(server(), type, query, t); } diff --git a/src/test/java/io/ebean/EbeanServer_deleteAllByIdTest.java b/src/test/java/io/ebean/EbeanServer_deleteAllByIdTest.java index 5eb6a4c2f..b7c285afb 100644 --- a/src/test/java/io/ebean/EbeanServer_deleteAllByIdTest.java +++ b/src/test/java/io/ebean/EbeanServer_deleteAllByIdTest.java @@ -29,11 +29,7 @@ public class EbeanServer_deleteAllByIdTest extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); - if (isH2()) { - assertThat(loggedSql.get(0)).contains("delete from e_basicver where id in (select * from table(x bigint = ?))"); - } else { - assertThat(loggedSql.get(0)).contains("delete from e_basicver where id in "); - } + platformAssertIn(loggedSql.get(0), "delete from e_basicver where id "); } @Test @@ -59,9 +55,7 @@ public class EbeanServer_deleteAllByIdTest extends BaseTestCase { } List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); - if (isH2()) { - assertThat(loggedSql.get(0)).contains("delete from e_basicver where id in (select * from table(x bigint = ?))"); - } + platformAssertIn(loggedSql.get(0), "delete from e_basicver where id "); } @Test @@ -81,9 +75,7 @@ public class EbeanServer_deleteAllByIdTest extends BaseTestCase { List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); - if (isH2()) { - assertThat(loggedSql.get(0)).contains("delete from e_basicver where id in (select * from table(x bigint = ?))"); - } + platformAssertIn(loggedSql.get(0), "delete from e_basicver where id "); } @@ -110,9 +102,7 @@ public class EbeanServer_deleteAllByIdTest extends BaseTestCase { } List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1); - if (isH2()) { - assertThat(loggedSql.get(0)).contains("delete from e_basicver where id in (select * from table(x bigint = ?))"); - } + platformAssertIn(loggedSql.get(0), "delete from e_basicver where id "); } private List beans(int count) { diff --git a/src/test/java/io/ebeaninternal/server/expression/TDSpiExpressionRequest.java b/src/test/java/io/ebeaninternal/server/expression/TDSpiExpressionRequest.java index da204459a..e60bb4e73 100644 --- a/src/test/java/io/ebeaninternal/server/expression/TDSpiExpressionRequest.java +++ b/src/test/java/io/ebeaninternal/server/expression/TDSpiExpressionRequest.java @@ -85,7 +85,7 @@ public class TDSpiExpressionRequest implements SpiExpressionRequest { } @Override - public void appendInExpression(Object[] bindValues) { + public void appendInExpression(boolean not, Object[] bindValues) { } } diff --git a/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java b/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java index ea259390b..ad13e69c8 100644 --- a/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java +++ b/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java @@ -4,9 +4,9 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; import io.ebeaninternal.api.SpiQuery; +import org.junit.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.ResetBasicData; -import org.junit.Test; import java.util.Arrays; import java.util.List; @@ -167,7 +167,7 @@ public class EqlParserTest extends BaseTestCase { Query query = parse("where name in ('Rob','Jim')"); query.findList(); - assertThat(query.getGeneratedSql()).contains("where t0.name in "); + platformAssertIn(query.getGeneratedSql(),"where t0.name"); } @Test @@ -178,12 +178,7 @@ public class EqlParserTest extends BaseTestCase { query.setParameter("two", "Bar"); query.findList(); - - if (isH2()) { - assertThat(query.getGeneratedSql()).contains("where t0.name in (select * from table(x varchar = ?)"); - } else { - assertThat(query.getGeneratedSql()).contains("where t0.name in "); - } + platformAssertIn(query.getGeneratedSql(),"where t0.name"); } @Test @@ -194,11 +189,7 @@ public class EqlParserTest extends BaseTestCase { query.setParameter("two", "Bar"); query.findList(); - if (isH2()) { - assertThat(query.getGeneratedSql()).contains("where t0.name in (select * from table(x varchar = ?)"); - } else { - assertThat(query.getGeneratedSql()).contains("where t0.name in "); - } + platformAssertIn(query.getGeneratedSql(),"where t0.name"); } @Test @@ -209,11 +200,7 @@ public class EqlParserTest extends BaseTestCase { query.setParameter("two", "Bar"); query.findList(); - if (isH2()) { - assertThat(query.getGeneratedSql()).contains("where t0.name in (select * from table(x varchar = ?)"); - } else { - assertThat(query.getGeneratedSql()).contains("where t0.name in "); - } + platformAssertIn(query.getGeneratedSql(),"where t0.name"); } @Test @@ -223,12 +210,7 @@ public class EqlParserTest extends BaseTestCase { query.setParameter("names", Arrays.asList("Baz", "Maz", "Jim")); query.findList(); - if (isH2()) { - assertThat(query.getGeneratedSql()).contains("where t0.name in (select * from table(x varchar = ?)"); - - } else { - assertThat(query.getGeneratedSql()).contains("where t0.name in "); - } + platformAssertIn(query.getGeneratedSql(),"where t0.name"); } @Test diff --git a/src/test/java/org/tests/batchload/TestBatchLazyWithCacheHits.java b/src/test/java/org/tests/batchload/TestBatchLazyWithCacheHits.java index 90ba66020..e2d98199c 100644 --- a/src/test/java/org/tests/batchload/TestBatchLazyWithCacheHits.java +++ b/src/test/java/org/tests/batchload/TestBatchLazyWithCacheHits.java @@ -79,7 +79,7 @@ public class TestBatchLazyWithCacheHits extends BaseTestCase { // batch lazy loading into cache assertThat(sql).hasSize(2); assertThat(sql.get(0)).contains("from uuone t0 where t0.name like "); - assertThat(sql.get(1)).contains("from uuone t0 where t0.id in "); + platformAssertIn(sql.get(1), "from uuone t0 where t0.id"); statistics = beanCache.getStatistics(true); assertThat(statistics.getSize()).isGreaterThan(3); diff --git a/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java b/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java index 541a6b88a..ffde77d3b 100644 --- a/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java +++ b/src/test/java/org/tests/batchload/TestQueryJoinToAssocOne.java @@ -36,7 +36,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); - assertThat(secondaryQuery).contains(" (t0.order_id) in "); + platformAssertIn(secondaryQuery, " (t0.order_id)"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @@ -63,7 +63,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); - assertThat(secondaryQuery).contains(" (t0.order_id) in "); + platformAssertIn(secondaryQuery, " (t0.order_id)"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } @@ -103,7 +103,7 @@ public class TestQueryJoinToAssocOne extends BaseTestCase { String secondaryQuery = trimSql(loggedSql.get(1), 1); assertThat(secondaryQuery).contains("select t0.order_id, t0.id,"); assertThat(secondaryQuery).contains(" from o_order_detail t0 left join o_product t1"); - assertThat(secondaryQuery).contains(" (t0.order_id) in "); + platformAssertIn(secondaryQuery, " (t0.order_id)"); assertThat(secondaryQuery).contains(" order by t0.order_id, t0.id"); } diff --git a/src/test/java/org/tests/batchload/TestSecondaryQueries.java b/src/test/java/org/tests/batchload/TestSecondaryQueries.java index 2804fd13f..fbe1891df 100644 --- a/src/test/java/org/tests/batchload/TestSecondaryQueries.java +++ b/src/test/java/org/tests/batchload/TestSecondaryQueries.java @@ -36,7 +36,8 @@ public class TestSecondaryQueries extends BaseTestCase { assertThat(sql).hasSize(2); assertThat(trimSql(sql.get(0), 2)).contains("select t0.id, t0.status, t0.kcustomer_id from o_order t0"); - assertThat(trimSql(sql.get(1), 2)).contains("select t0.id, t0.name from o_customer t0 where t0.id in"); + assertThat(trimSql(sql.get(1), 2)).contains("select t0.id, t0.name from o_customer t0 where t0.id"); + platformAssertIn(sql.get(1), " where t0.id"); } @Test @@ -71,7 +72,8 @@ public class TestSecondaryQueries extends BaseTestCase { sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); - assertThat(trimSql(sql.get(0), 1)).contains("select t0.id, t0.name from o_customer t0 where t0.id in"); + assertThat(trimSql(sql.get(0), 1)).contains("select t0.id, t0.name from o_customer t0 where t0.id"); + platformAssertIn(sql.get(0), " where t0.id"); } @Test @@ -123,7 +125,8 @@ public class TestSecondaryQueries extends BaseTestCase { assertThat(generatedSql).contains("from o_customer t0 where t0.id = ?"); assertEquals(2, sql.size()); - assertThat(sql.get(1)).contains("from contact t0 where (t0.customer_id) in "); + assertThat(sql.get(1)).contains("from contact t0 where (t0.customer_id) "); + platformAssertIn(sql.get(1), " where (t0.customer_id)"); } @@ -179,7 +182,8 @@ public class TestSecondaryQueries extends BaseTestCase { // from o_order_detail t0 // where (t0.order_id) in (?,?,?,?,?) ; --bind(1,4,1,1,1) - assertThat(ordSecondarySql).contains(" from o_order_detail t0 where t0.id > 0 and (t0.order_id) in "); + assertThat(ordSecondarySql).contains(" from o_order_detail t0 where t0.id > 0 and (t0.order_id) "); + platformAssertIn(ordSecondarySql, "and (t0.order_id)"); } } diff --git a/src/test/java/org/tests/model/onetoone/album/DeleteById_SoftDelete_Tests.java b/src/test/java/org/tests/model/onetoone/album/DeleteById_SoftDelete_Tests.java index 9ee6b7ff6..bb27d3c5a 100644 --- a/src/test/java/org/tests/model/onetoone/album/DeleteById_SoftDelete_Tests.java +++ b/src/test/java/org/tests/model/onetoone/album/DeleteById_SoftDelete_Tests.java @@ -118,9 +118,9 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); if (isPlatformBooleanNative()) { - assertThat(sql.get(0)).contains("update cover set deleted=true where id in "); + assertThat(sql.get(0)).contains("update cover set deleted=true where id "); } else { - assertThat(sql.get(0)).contains("update cover set deleted=1 where id in "); + assertThat(sql.get(0)).contains("update cover set deleted=1 where id "); } } @@ -144,9 +144,9 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); if (isPlatformBooleanNative()) { - assertThat(sql.get(0)).contains("update cover set deleted=true where id in "); + assertThat(sql.get(0)).contains("update cover set deleted=true where id"); } else { - assertThat(sql.get(0)).contains("update cover set deleted=1 where id in "); + assertThat(sql.get(0)).contains("update cover set deleted=1 where id"); } } @@ -162,7 +162,7 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); - assertThat(sql.get(0)).contains("delete from cover where id in "); + platformAssertIn(sql.get(0), "delete from cover where id "); } @Test @@ -178,7 +178,7 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); - assertThat(sql.get(0)).contains("delete from cover where id in "); + platformAssertIn(sql.get(0), "delete from cover where id "); } @@ -201,7 +201,7 @@ public class DeleteById_SoftDelete_Tests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); assertThat(sql).hasSize(1); - assertThat(sql.get(0)).contains("delete from cover where id in "); + platformAssertIn(sql.get(0), "delete from cover where id "); } @Test diff --git a/src/test/java/org/tests/query/TestQueryFetchManyTwoDeep.java b/src/test/java/org/tests/query/TestQueryFetchManyTwoDeep.java index fd449e8bf..048a6e97c 100644 --- a/src/test/java/org/tests/query/TestQueryFetchManyTwoDeep.java +++ b/src/test/java/org/tests/query/TestQueryFetchManyTwoDeep.java @@ -57,7 +57,8 @@ public class TestQueryFetchManyTwoDeep extends BaseTestCase { //SpiQuery secondaryQuery = secondaryQueries.get(0); String secondarySql = sql.get(1); - assertThat(secondarySql).contains("from o_order_detail t0 where t0.id > 0 and (t0.order_id) in"); + assertThat(secondarySql).contains("from o_order_detail t0 where t0.id > 0 and (t0.order_id) "); + platformAssertIn(secondarySql, "(t0.order_id)"); // select t0.order_id c0, t0.id c1, t0.order_qty c2, t0.ship_qty c3, t0.unit_price c4, t0.cretime c5, t0.updtime c6, t0.order_id c7, t0.product_id c8 // from o_order_detail t0 diff --git a/src/test/java/org/tests/query/TestQueryFilterMany.java b/src/test/java/org/tests/query/TestQueryFilterMany.java index f34a275e0..dc03f4982 100644 --- a/src/test/java/org/tests/query/TestQueryFilterMany.java +++ b/src/test/java/org/tests/query/TestQueryFilterMany.java @@ -76,9 +76,9 @@ public class TestQueryFilterMany extends BaseTestCase { assertThat(sql).hasSize(3); assertThat(sql.get(0)).contains(" from o_customer t0; --bind()"); - assertThat(sql.get(1)).contains(" from contact t0 where (t0.customer_id) in"); + platformAssertIn(sql.get(1), " from contact t0 where (t0.customer_id)"); assertThat(sql.get(1)).contains(" and t0.first_name is not null"); - assertThat(sql.get(2)).contains(" from contact_note t0 where (t0.contact_id) in"); + platformAssertIn(sql.get(2), " from contact_note t0 where (t0.contact_id)"); assertThat(sql.get(2)).contains(" and lower(t0.title) like"); } } diff --git a/src/test/java/org/tests/query/TestQueryInAssocOne.java b/src/test/java/org/tests/query/TestQueryInAssocOne.java index 7218f2570..9de07f3ff 100644 --- a/src/test/java/org/tests/query/TestQueryInAssocOne.java +++ b/src/test/java/org/tests/query/TestQueryInAssocOne.java @@ -27,7 +27,7 @@ public class TestQueryInAssocOne extends BaseTestCase { String sql = query.getGeneratedSql(); assertThat(sql).contains("join o_customer t1 on t1.id = t0.kcustomer_id"); - assertThat(sql).contains("t0.kcustomer_id in "); + platformAssertIn(sql, "where t0.kcustomer_id"); } @@ -44,7 +44,7 @@ public class TestQueryInAssocOne extends BaseTestCase { String sql = query.getGeneratedSql(); assertThat(sql).contains("join o_customer t1 on t1.id = t0.kcustomer_id"); - assertThat(sql).contains("t0.kcustomer_id in "); + platformAssertIn(sql, "t0.kcustomer_id"); } @@ -61,6 +61,6 @@ public class TestQueryInAssocOne extends BaseTestCase { String sql = query.getGeneratedSql(); assertThat(sql).contains("join o_customer t1 on t1.id = t0.kcustomer_id"); - assertThat(sql).contains("t0.kcustomer_id not in "); + platformAssertNotIn(sql, "t0.kcustomer_id"); } } diff --git a/src/test/java/org/tests/query/TestSubQuery.java b/src/test/java/org/tests/query/TestSubQuery.java index 817555e22..1e3427737 100644 --- a/src/test/java/org/tests/query/TestSubQuery.java +++ b/src/test/java/org/tests/query/TestSubQuery.java @@ -24,6 +24,8 @@ public class TestSubQuery extends BaseTestCase { List productIds = new ArrayList<>(); productIds.add(3); + productIds.add(4); + productIds.add(5); Query sq = Ebean.createQuery(Order.class).select("id").where() .in("details.product.id", productIds).query(); diff --git a/src/test/java/org/tests/query/TestWhereIn.java b/src/test/java/org/tests/query/TestWhereIn.java new file mode 100644 index 000000000..9fa85e82a --- /dev/null +++ b/src/test/java/org/tests/query/TestWhereIn.java @@ -0,0 +1,45 @@ +package org.tests.query; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.Query; +import org.junit.Test; +import org.tests.model.basic.Country; +import org.tests.model.basic.ResetBasicData; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestWhereIn extends BaseTestCase { + + @Test + public void testInVarchar() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Country.class) + .where().in("code", "NZ", "AU") + .query(); + + query.findList(); + if (isPostgres()) { + assertThat(sqlOf(query)).contains(" = any("); + } + + } + + + @Test + public void testNotInVarchar() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Country.class) + .where().notIn("code", "NZ", "SA", "US") + .query(); + + query.findList(); + if (isPostgres()) { + assertThat(sqlOf(query)).contains(" != all("); + } + } +} diff --git a/src/test/java/org/tests/query/other/TestManyLazyLoadingQuery.java b/src/test/java/org/tests/query/other/TestManyLazyLoadingQuery.java index cf20aba40..4070496c1 100644 --- a/src/test/java/org/tests/query/other/TestManyLazyLoadingQuery.java +++ b/src/test/java/org/tests/query/other/TestManyLazyLoadingQuery.java @@ -55,7 +55,8 @@ public class TestManyLazyLoadingQuery extends BaseTestCase { beanProperty.addWhereParentIdIn(query0, parentIds, false); query0.findList(); - assertThat(query0.getGeneratedSql()).contains(" from o_order_detail t0 where (t0.order_id) in ("); + assertThat(query0.getGeneratedSql()).contains(" from o_order_detail t0 where (t0.order_id) "); + platformAssertIn(query0.getGeneratedSql(), "where (t0.order_id)"); } finally { Ebean.endTransaction();