From 35b467c04f38cd27c7c263ff3d45388d92991412 Mon Sep 17 00:00:00 2001 From: Thibault Meyer <0xbaadf00d@users.noreply.github.com> Date: Mon, 3 Jul 2017 10:45:48 +0200 Subject: [PATCH] JSON simple implementation for MSSQL (#1057) - Use JSON_VALUE - Use NVARCHAR type Signed-off-by: Thibault Meyer --- .../sqlserver/SqlServerPlatform.java | 16 +++++------ .../server/core/InternalConfiguration.java | 19 +++++++------ .../server/core/SqlServerJsonExpression.java | 28 +++++++++++++++++++ 3 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/ebeaninternal/server/core/SqlServerJsonExpression.java diff --git a/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java b/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java index fdb7663c1..c874a429e 100644 --- a/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java @@ -2,11 +2,7 @@ package io.ebean.config.dbplatform.sqlserver; import io.ebean.PersistBatch; import io.ebean.Platform; -import io.ebean.config.dbplatform.DatabasePlatform; -import io.ebean.config.dbplatform.DbPlatformType; -import io.ebean.config.dbplatform.DbType; -import io.ebean.config.dbplatform.IdType; -import io.ebean.config.dbplatform.SqlErrorCodes; +import io.ebean.config.dbplatform.*; import io.ebean.dbmigration.ddlgeneration.platform.SqlServerDdl; import java.sql.Types; @@ -35,13 +31,13 @@ public class SqlServerPlatform extends DatabasePlatform { this.exceptionTranslator = new SqlErrorCodes() .addAcquireLock("1222") - .addDuplicateKey("2601","2627") - .addDataIntegrity("544","8114","8115") + .addDuplicateKey("2601", "2627") + .addDataIntegrity("544", "8114", "8115") .build(); this.openQuote = "["; this.closeQuote = "]"; - this.specialLikeCharacters = new char[] { '%', '_', '[' }; + this.specialLikeCharacters = new char[]{'%', '_', '['}; this.likeClause = "like ? COLLATE Latin1_General_BIN"; booleanDbType = Types.INTEGER; @@ -63,11 +59,13 @@ public class SqlServerPlatform extends DatabasePlatform { dbTypeMap.put(DbType.TIME, new DbPlatformType("time")); dbTypeMap.put(DbType.TIMESTAMP, new DbPlatformType("datetime2")); + dbTypeMap.put(DbType.JSON, new DbPlatformType("nvarchar(max)")); + dbTypeMap.put(DbType.JSONB, new DbPlatformType("nvarchar(max)")); + } @Override protected void escapeLikeCharacter(char ch, StringBuilder sb) { sb.append('[').append(ch).append(']'); } - } diff --git a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index 4f6c3b2f5..ab2584b5a 100644 --- a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -248,19 +248,20 @@ public class InternalConfiguration { * Return the JSON expression handler for the given database platform. */ private DbExpressionHandler getDbExpressionHandler(DatabasePlatform databasePlatform) { - - Platform platform = databasePlatform.getPlatform(); - if (platform == Platform.POSTGRES) { - return new PostgresJsonExpression(); + final Platform platform = databasePlatform.getPlatform(); + switch (platform) { + case POSTGRES: + return new PostgresJsonExpression(); + case ORACLE: + return new OracleDbExpression(); + case SQLSERVER: + return new SqlServerJsonExpression(); + default: + return new NotSupportedDbExpression(); } - if (platform == Platform.ORACLE) { - return new OracleDbExpression(); - } - return new NotSupportedDbExpression(); } public JsonContext createJsonContext(SpiEbeanServer server) { - return new DJsonContext(server, jsonFactory, typeManager); } diff --git a/src/main/java/io/ebeaninternal/server/core/SqlServerJsonExpression.java b/src/main/java/io/ebeaninternal/server/core/SqlServerJsonExpression.java new file mode 100644 index 000000000..a25ddea46 --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/core/SqlServerJsonExpression.java @@ -0,0 +1,28 @@ +package io.ebeaninternal.server.core; + +import io.ebeaninternal.api.SpiExpressionRequest; +import io.ebeaninternal.server.expression.Op; + +/** + * Microsoft SQL Server JSON. ARRAY expressions not supported. + */ +public class SqlServerJsonExpression implements DbExpressionHandler { + + @Override + public void json(final SpiExpressionRequest request, final String propName, + final String path, final Op operator, final Object value) { + request.append("json_value(").append(propName).append(", '$.").append(path).append("')"); + request.append(operator.bind()); + } + + @Override + public void arrayContains(final SpiExpressionRequest request, final String propName, + final boolean contains, final Object... values) { + throw new RuntimeException("ARRAY expressions not supported on Microsoft SQL Server"); + } + + @Override + public void arrayIsEmpty(final SpiExpressionRequest request, final String propName, final boolean empty) { + throw new RuntimeException("ARRAY expressions not supported on Microsoft SQL Server"); + } +}