From a020bb15a1e88604f221efdb05cbe6d0d7cd9cd3 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Wed, 26 Sep 2018 11:19:28 +0200 Subject: [PATCH] removed the concat-operator "||" and replaced with "concat()" (#1489) * removed the concat-operator "||" and replaced with "concat()" * using || in postgres * FIX: Assert-statement --- .../config/dbplatform/DatabasePlatform.java | 9 -------- .../server/expression/InPairsExpression.java | 12 +++++----- .../expression/platform/BaseDbExpression.java | 22 +++++++++---------- .../platform/BasicDbExpression.java | 4 ---- .../platform/DbExpressionHandler.java | 10 ++++----- .../platform/DbExpressionHandlerFactory.java | 15 +++++++------ .../expression/platform/H2DbExpression.java | 4 ---- .../platform/MySqlDbExpression.java | 4 ---- .../platform/OracleDbExpression.java | 4 ---- .../platform/PostgresDbExpression.java | 16 ++++++++++---- .../platform/SqlServerDbExpression.java | 4 ---- .../cache/TestCacheViaComplexNaturalKey3.java | 16 +++++++------- 12 files changed, 49 insertions(+), 71 deletions(-) diff --git a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java index 65bdfff4c..152cd3588 100644 --- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java @@ -64,8 +64,6 @@ public class DatabasePlatform { */ protected String closeQuote = "\""; - protected String concatOperator = "||"; - /** * When set to true all db column names and table names use quoted identifiers. */ @@ -455,13 +453,6 @@ public class DatabasePlatform { return openQuote; } - /** - * Return the DB concat operator. - */ - public String getConcatOperator() { - return concatOperator; - } - /** * Return the JDBC type used to store booleans. */ diff --git a/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java b/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java index 91f6742d6..9b2c5c5f1 100644 --- a/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java @@ -92,14 +92,12 @@ class InPairsExpression extends AbstractExpression { return; } - String concat = request.getDbPlatformHandler().getConcatOperator(); - String concatFormula = "(" + property0 + concat + "'" + separator + "'" + concat + property1; - if (suffix != null && !suffix.isEmpty()) { - concatFormula += concat + "'" + suffix + "'"; - } - concatFormula += ")"; - request.append(concatFormula); + StringBuilder sb = new StringBuilder(); + + request.getDbPlatformHandler().concat(property0, separator, property1, suffix); + + request.append(request.getDbPlatformHandler().concat(property0, separator, property1, suffix)); request.appendInExpression(not, concatBindValues); } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java index 584215d4c..8879c84f4 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/BaseDbExpression.java @@ -8,17 +8,6 @@ import io.ebeaninternal.server.expression.BitwiseOp; */ abstract class BaseDbExpression implements DbExpressionHandler { - private final String concatOperator; - - BaseDbExpression(String concatOperator) { - this.concatOperator = concatOperator; - } - - @Override - public String getConcatOperator() { - return concatOperator; - } - @Override public void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match) { @@ -57,4 +46,15 @@ abstract class BaseDbExpression implements DbExpressionHandler { } } + @Override + public String concat(String property0, String separator, String property1, String suffix) { + StringBuilder sb = new StringBuilder(); + sb.append("CONCAT(").append(property0).append(",'").append(separator).append("',").append(property1); + + if (suffix != null && !suffix.isEmpty()) { + sb.append(",'").append(suffix).append('\''); + } + sb.append(')'); + return sb.toString(); + } } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java index adacca04d..8b5ab8d70 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/BasicDbExpression.java @@ -8,10 +8,6 @@ import io.ebeaninternal.server.expression.Op; */ public class BasicDbExpression extends BaseDbExpression { - BasicDbExpression(String concatOperator) { - super(concatOperator); - } - @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { throw new RuntimeException("JSON expressions only supported on Postgres and Oracle"); diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandler.java b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandler.java index 7cf6d696a..93c9dc18a 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandler.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandler.java @@ -9,11 +9,6 @@ import io.ebeaninternal.server.expression.Op; */ public interface DbExpressionHandler { - /** - * Return the DB concat operator (Usually SQL standard "||"). - */ - String getConcatOperator(); - /** * Write the db platform specific json expression. */ @@ -33,4 +28,9 @@ public interface DbExpressionHandler { * Add the bitwise expression. */ void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match); + + /** + * Performs a "CONCAT" operation for that platform. + */ + String concat(String property0, String separator, String property1, String suffix); } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java index b7b62eb71..e9696e5b6 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java @@ -12,20 +12,21 @@ public class DbExpressionHandlerFactory { public static DbExpressionHandler from(DatabasePlatform databasePlatform) { Platform platform = databasePlatform.getPlatform(); - String concatOperator = databasePlatform.getConcatOperator(); switch (platform) { case H2: - return new H2DbExpression(concatOperator); + return new H2DbExpression(); case POSTGRES: - return new PostgresDbExpression(concatOperator); + return new PostgresDbExpression(); case MYSQL: - return new MySqlDbExpression(concatOperator); + return new MySqlDbExpression(); case ORACLE: - return new OracleDbExpression(concatOperator); + return new OracleDbExpression(); + case SQLSERVER16: + case SQLSERVER17: case SQLSERVER: - return new SqlServerDbExpression(concatOperator); + return new SqlServerDbExpression(); default: - return new BasicDbExpression(concatOperator); + return new BasicDbExpression(); } } } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java index 4e0b544f2..fb65c7c03 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/H2DbExpression.java @@ -8,10 +8,6 @@ import io.ebeaninternal.server.expression.BitwiseOp; */ class H2DbExpression extends BasicDbExpression { - H2DbExpression(String concatOperator) { - super(concatOperator); - } - @Override public void bitwise(SpiExpressionRequest request, String propName, BitwiseOp operator, long flags, String compare, long match) { diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java index e0e04ad1f..dff49e0b2 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/MySqlDbExpression.java @@ -5,8 +5,4 @@ package io.ebeaninternal.server.expression.platform; */ class MySqlDbExpression extends BasicDbExpression { - MySqlDbExpression(String concatOperator) { - super(concatOperator); - } - } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java index 4347d2e80..168f01aaf 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/OracleDbExpression.java @@ -9,10 +9,6 @@ import io.ebeaninternal.server.expression.Op; */ public class OracleDbExpression extends BaseDbExpression { - OracleDbExpression(String concatOperator) { - super(concatOperator); - } - @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java index 4af9aa2f7..adac971b5 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/PostgresDbExpression.java @@ -8,10 +8,6 @@ import io.ebeaninternal.server.expression.Op; */ public class PostgresDbExpression extends BaseDbExpression { - PostgresDbExpression(String concatOperator) { - super(concatOperator); - } - @Override public void json(SpiExpressionRequest request, String propName, String path, Op operator, Object value) { @@ -65,4 +61,16 @@ public class PostgresDbExpression extends BaseDbExpression { request.append(" <> 0"); } } + + @Override + public String concat(String property0, String separator, String property1, String suffix) { + StringBuilder sb = new StringBuilder(); + sb.append("(").append(property0).append("||'").append(separator).append("'||").append(property1); + + if (suffix != null && !suffix.isEmpty()) { + sb.append("||'").append(suffix).append('\''); + } + sb.append(')'); + return sb.toString(); + } } diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java b/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java index dc52066e3..98d76ec43 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/SqlServerDbExpression.java @@ -8,10 +8,6 @@ import io.ebeaninternal.server.expression.Op; */ public class SqlServerDbExpression extends BaseDbExpression { - SqlServerDbExpression(String concatOperator) { - super(concatOperator); - } - @Override public void json(final SpiExpressionRequest request, final String propName, final String path, final Op operator, final Object value) { diff --git a/src/test/java/org/tests/model/basic/cache/TestCacheViaComplexNaturalKey3.java b/src/test/java/org/tests/model/basic/cache/TestCacheViaComplexNaturalKey3.java index 7f584c378..c9e698890 100644 --- a/src/test/java/org/tests/model/basic/cache/TestCacheViaComplexNaturalKey3.java +++ b/src/test/java/org/tests/model/basic/cache/TestCacheViaComplexNaturalKey3.java @@ -4,8 +4,6 @@ import io.ebean.BaseTestCase; import io.ebean.CacheMode; import io.ebean.Ebean; import io.ebean.Pairs; -import io.ebean.annotation.IgnorePlatform; -import io.ebean.annotation.Platform; import io.ebean.cache.ServerCache; import io.ebean.cache.ServerCacheManager; import io.ebean.cache.ServerCacheStatistics; @@ -251,7 +249,6 @@ public class TestCacheViaComplexNaturalKey3 extends BaseTestCase { assertBeanCacheHitMiss(0, 0); } - @IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER}) @Test public void findList_inPairs_standardConcat() { @@ -280,14 +277,15 @@ public class TestCacheViaComplexNaturalKey3 extends BaseTestCase { assertBeanCacheHitMiss(1, 0); if (isH2()) { - assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||'-'||t0.code) in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2-1000,3-1000})"); - } else { + assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and CONCAT(t0.sku,'-',t0.code) in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2-1000,3-1000})"); + } else if (isPostgres()) { assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||'-'||t0.code)"); + } else { + assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and CONCAT(t0.sku,'-',t0.code)"); } } - @IgnorePlatform({Platform.MYSQL, Platform.SQLSERVER}) @Test public void findList_inPairs_userConcat() { @@ -318,9 +316,11 @@ public class TestCacheViaComplexNaturalKey3 extends BaseTestCase { assertBeanCacheHitMiss(1, 0); if (isH2()) { - assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||':'||t0.code||'-foo') in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2:1000-foo,3:1000-foo})"); - } else { + assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and CONCAT(t0.sku,':',t0.code,'-foo') in (?, ? ) order by t0.sku desc; --bind(def,Array[2]={2:1000-foo,3:1000-foo})"); + } else if (isPostgres()){ assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and (t0.sku||':'||t0.code||'-foo')"); + } else { + assertThat(sql.get(0)).contains("from o_cached_natkey3 t0 where t0.store = ? and CONCAT(t0.sku,':',t0.code,'-foo')"); } }