From edd72527813a1c29231bc7c1b23ed2dd847b22b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per-=C3=85ke=20Minborg?= Date: Fri, 9 Jun 2017 13:05:16 -0700 Subject: [PATCH] runtime-core: Make collation configurable for MySQL, Fix #481 --- .../internal/db/mariadb/MariaDbDbmsType.java | 15 +++--- .../core/internal/db/mysql/MySqlDbmsType.java | 15 +++--- .../sql/MySqlSpeedmentPredicateView.java | 48 ++++++++----------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mariadb/MariaDbDbmsType.java b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mariadb/MariaDbDbmsType.java index be2ec140b6..ae385c29d9 100644 --- a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mariadb/MariaDbDbmsType.java +++ b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mariadb/MariaDbDbmsType.java @@ -43,16 +43,19 @@ public final class MariaDbDbmsType extends AbstractDbmsType { public static InjectBundle include() { - return of(MySqlDbmsMetadataHandler.class, MariaDbDbmsOperationHandler.class); + return of( + MySqlDbmsMetadataHandler.class, + MariaDbDbmsOperationHandler.class, + MySqlSpeedmentPredicateView.class + ); } - private final static FieldPredicateView PREDICATE_VIEW = new MySqlSpeedmentPredicateView(); - private final MariaDbNamingConvention namingConvention; private final MariaDbConnectionUrlGenerator connectionUrlGenerator; - private @Inject MySqlDbmsMetadataHandler metadataHandler; - private @Inject MariaDbDbmsOperationHandler operationHandler; + @Inject private MySqlDbmsMetadataHandler metadataHandler; + @Inject private MariaDbDbmsOperationHandler operationHandler; + @Inject private MySqlSpeedmentPredicateView fieldPredicateView; private MariaDbDbmsType() { namingConvention = new MariaDbNamingConvention(); @@ -106,7 +109,7 @@ public ConnectionUrlGenerator getConnectionUrlGenerator() { @Override public FieldPredicateView getFieldPredicateView() { - return PREDICATE_VIEW; + return fieldPredicateView; } @Override diff --git a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mysql/MySqlDbmsType.java b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mysql/MySqlDbmsType.java index bd54c315a4..073b8f2f2a 100644 --- a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mysql/MySqlDbmsType.java +++ b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/db/mysql/MySqlDbmsType.java @@ -42,16 +42,19 @@ public final class MySqlDbmsType extends AbstractDbmsType { public static InjectBundle include() { - return of(MySqlDbmsMetadataHandler.class, MySqlDbmsOperationHandler.class); + return of( + MySqlDbmsMetadataHandler.class, + MySqlDbmsOperationHandler.class, + MySqlSpeedmentPredicateView.class + ); } - private final static FieldPredicateView PREDICATE_VIEW = new MySqlSpeedmentPredicateView(); - private final MySqlNamingConvention namingConvention; private final MySqlConnectionUrlGenerator connectionUrlGenerator; - private @Inject MySqlDbmsMetadataHandler metadataHandler; - private @Inject MySqlDbmsOperationHandler operationHandler; + @Inject private MySqlDbmsMetadataHandler metadataHandler; + @Inject private MySqlDbmsOperationHandler operationHandler; + @Inject private MySqlSpeedmentPredicateView fieldPredicateView; private MySqlDbmsType() { namingConvention = new MySqlNamingConvention(); @@ -111,7 +114,7 @@ public ConnectionUrlGenerator getConnectionUrlGenerator() { @Override public FieldPredicateView getFieldPredicateView() { - return PREDICATE_VIEW; + return fieldPredicateView; } @Override diff --git a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/manager/sql/MySqlSpeedmentPredicateView.java b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/manager/sql/MySqlSpeedmentPredicateView.java index df0ca36c2a..0cb05fa5fd 100644 --- a/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/manager/sql/MySqlSpeedmentPredicateView.java +++ b/runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/internal/manager/sql/MySqlSpeedmentPredicateView.java @@ -16,15 +16,16 @@ */ package com.speedment.runtime.core.internal.manager.sql; +import com.speedment.common.injector.annotation.Config; import com.speedment.runtime.core.db.FieldPredicateView; import com.speedment.runtime.core.db.SqlPredicateFragment; import static com.speedment.runtime.core.internal.manager.sql.AbstractFieldPredicateView.of; +import com.speedment.runtime.field.predicate.FieldPredicate; +import com.speedment.runtime.field.predicate.Inclusion; import static com.speedment.runtime.field.util.PredicateOperandUtil.getFirstOperandAsRaw; import static com.speedment.runtime.field.util.PredicateOperandUtil.getFirstOperandAsRawSet; import static com.speedment.runtime.field.util.PredicateOperandUtil.getInclusionOperand; import static com.speedment.runtime.field.util.PredicateOperandUtil.getSecondOperand; -import com.speedment.runtime.field.predicate.FieldPredicate; -import com.speedment.runtime.field.predicate.Inclusion; import java.util.Set; import static java.util.stream.Collectors.joining; @@ -48,24 +49,15 @@ name character(20) select * from colltest where name in ('Olle', 'tryggve' collate utf8_bin) ; */ - private enum Collation { - - UTF8_BIN, UTF8_GENERAL_CI; - - private final String collateCommand; - - private Collation() { - this.collateCommand = "COLLATE " + name().toLowerCase(); - } - - String getCollateCommand() { - return collateCommand; - } - } - + + @Config(name = "db.mysql.binaryCollationName", value = "utf8_bin") + private String binaryCollationName; + @Config(name = "db.mysql.collationName", value = "utf8_general_ci") + private String collationName; + @Override protected SqlPredicateFragment equalIgnoreCaseHelper(String cn, FieldPredicate model, boolean negated) { - return of(compare(cn, " = ?", Collation.UTF8_GENERAL_CI), negated).add(getFirstOperandAsRaw(model)); + return of(compare(cn, " = ?", collationName), negated).add(getFirstOperandAsRaw(model)); } @Override @@ -112,12 +104,12 @@ protected SqlPredicateFragment containsIgnoreCaseHelper(String cn, FieldPredicat @Override protected SqlPredicateFragment equalString(String cn, FieldPredicate model) { - return of(compare(cn, " = ?", Collation.UTF8_BIN)).add(getFirstOperandAsRaw(model)); + return of(compare(cn, " = ?", binaryCollationName)).add(getFirstOperandAsRaw(model)); } @Override protected SqlPredicateFragment notEqualString(String cn, FieldPredicate model) { - return of("(NOT " + compare(cn, " = ?", Collation.UTF8_BIN) + ")").add(getFirstOperandAsRaw(model)); + return of("(NOT " + compare(cn, " = ?", binaryCollationName) + ")").add(getFirstOperandAsRaw(model)); } @Override @@ -132,7 +124,7 @@ protected SqlPredicateFragment notInString(String cn, FieldPredicate model) { private SqlPredicateFragment inStringHelper(String cn, FieldPredicate model, boolean negated) { final Set set = getFirstOperandAsRawSet(model); - return of("(" + cn + " IN (" + set.stream().map($ -> "?").collect(joining(",")) + " "+ Collation.UTF8_BIN.getCollateCommand() +"))", negated).addAll(set); + return of("(" + cn + " IN (" + set.stream().map($ -> "?").collect(joining(",")) + " COLLATE "+ binaryCollationName +"))", negated).addAll(set); } @Override @@ -198,29 +190,29 @@ protected SqlPredicateFragment greaterThanString(String cn, FieldPredicate mo } private String lessOrEqualString(String cn) { - return compare(cn, "<= ?", Collation.UTF8_BIN); + return compare(cn, "<= ?", binaryCollationName); } private String lessThanString(String cn) { - return compare(cn, "< ?", Collation.UTF8_BIN); + return compare(cn, "< ?", binaryCollationName); } private String greaterOrEqualString(String cn) { - return compare(cn, ">= ?", Collation.UTF8_BIN); + return compare(cn, ">= ?", binaryCollationName); } private String greaterThanString(String cn) { - return compare(cn, "> ?", Collation.UTF8_BIN); + return compare(cn, "> ?", binaryCollationName); } - private String compare(String cn, String operator, Collation collation) { + private String compare(String cn, String operator, String collation) { return new StringBuilder() .append('(') .append(cn) .append(' ') .append(operator) - .append(' ') - .append(collation.getCollateCommand()) + .append(" COLLATE ") + .append(collation) .append(')') .toString(); }