Skip to content

Commit

Permalink
runtime-core: Make collation configurable for MySQL, Fix #481
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Jun 9, 2017
1 parent b094ba5 commit edd7252
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 40 deletions.
Expand Up @@ -43,16 +43,19 @@
public final class MariaDbDbmsType extends AbstractDbmsType { public final class MariaDbDbmsType extends AbstractDbmsType {


public static InjectBundle include() { 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 MariaDbNamingConvention namingConvention;
private final MariaDbConnectionUrlGenerator connectionUrlGenerator; private final MariaDbConnectionUrlGenerator connectionUrlGenerator;


private @Inject MySqlDbmsMetadataHandler metadataHandler; @Inject private MySqlDbmsMetadataHandler metadataHandler;
private @Inject MariaDbDbmsOperationHandler operationHandler; @Inject private MariaDbDbmsOperationHandler operationHandler;
@Inject private MySqlSpeedmentPredicateView fieldPredicateView;


private MariaDbDbmsType() { private MariaDbDbmsType() {
namingConvention = new MariaDbNamingConvention(); namingConvention = new MariaDbNamingConvention();
Expand Down Expand Up @@ -106,7 +109,7 @@ public ConnectionUrlGenerator getConnectionUrlGenerator() {


@Override @Override
public FieldPredicateView getFieldPredicateView() { public FieldPredicateView getFieldPredicateView() {
return PREDICATE_VIEW; return fieldPredicateView;
} }


@Override @Override
Expand Down
Expand Up @@ -42,16 +42,19 @@
public final class MySqlDbmsType extends AbstractDbmsType { public final class MySqlDbmsType extends AbstractDbmsType {


public static InjectBundle include() { 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 MySqlNamingConvention namingConvention;
private final MySqlConnectionUrlGenerator connectionUrlGenerator; private final MySqlConnectionUrlGenerator connectionUrlGenerator;


private @Inject MySqlDbmsMetadataHandler metadataHandler; @Inject private MySqlDbmsMetadataHandler metadataHandler;
private @Inject MySqlDbmsOperationHandler operationHandler; @Inject private MySqlDbmsOperationHandler operationHandler;
@Inject private MySqlSpeedmentPredicateView fieldPredicateView;


private MySqlDbmsType() { private MySqlDbmsType() {
namingConvention = new MySqlNamingConvention(); namingConvention = new MySqlNamingConvention();
Expand Down Expand Up @@ -111,7 +114,7 @@ public ConnectionUrlGenerator getConnectionUrlGenerator() {


@Override @Override
public FieldPredicateView getFieldPredicateView() { public FieldPredicateView getFieldPredicateView() {
return PREDICATE_VIEW; return fieldPredicateView;
} }


@Override @Override
Expand Down
Expand Up @@ -16,15 +16,16 @@
*/ */
package com.speedment.runtime.core.internal.manager.sql; 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.FieldPredicateView;
import com.speedment.runtime.core.db.SqlPredicateFragment; import com.speedment.runtime.core.db.SqlPredicateFragment;
import static com.speedment.runtime.core.internal.manager.sql.AbstractFieldPredicateView.of; 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.getFirstOperandAsRaw;
import static com.speedment.runtime.field.util.PredicateOperandUtil.getFirstOperandAsRawSet; 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.getInclusionOperand;
import static com.speedment.runtime.field.util.PredicateOperandUtil.getSecondOperand; 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 java.util.Set;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.joining;


Expand All @@ -48,24 +49,15 @@ name character(20)
select * from colltest where name in ('Olle', 'tryggve' collate utf8_bin) ; select * from colltest where name in ('Olle', 'tryggve' collate utf8_bin) ;
*/ */
private enum Collation {

@Config(name = "db.mysql.binaryCollationName", value = "utf8_bin")
UTF8_BIN, UTF8_GENERAL_CI; private String binaryCollationName;

@Config(name = "db.mysql.collationName", value = "utf8_general_ci")
private final String collateCommand; private String collationName;


private Collation() {
this.collateCommand = "COLLATE " + name().toLowerCase();
}

String getCollateCommand() {
return collateCommand;
}
}

@Override @Override
protected SqlPredicateFragment equalIgnoreCaseHelper(String cn, FieldPredicate<?> model, boolean negated) { 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 @Override
Expand Down Expand Up @@ -112,12 +104,12 @@ protected SqlPredicateFragment containsIgnoreCaseHelper(String cn, FieldPredicat


@Override @Override
protected SqlPredicateFragment equalString(String cn, FieldPredicate<?> model) { 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 @Override
protected SqlPredicateFragment notEqualString(String cn, FieldPredicate<?> model) { 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 @Override
Expand All @@ -132,7 +124,7 @@ protected SqlPredicateFragment notInString(String cn, FieldPredicate<?> model) {


private SqlPredicateFragment inStringHelper(String cn, FieldPredicate<?> model, boolean negated) { private SqlPredicateFragment inStringHelper(String cn, FieldPredicate<?> model, boolean negated) {
final Set<?> set = getFirstOperandAsRawSet(model); 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 @Override
Expand Down Expand Up @@ -198,29 +190,29 @@ protected SqlPredicateFragment greaterThanString(String cn, FieldPredicate<?> mo
} }


private String lessOrEqualString(String cn) { private String lessOrEqualString(String cn) {
return compare(cn, "<= ?", Collation.UTF8_BIN); return compare(cn, "<= ?", binaryCollationName);
} }


private String lessThanString(String cn) { private String lessThanString(String cn) {
return compare(cn, "< ?", Collation.UTF8_BIN); return compare(cn, "< ?", binaryCollationName);
} }


private String greaterOrEqualString(String cn) { private String greaterOrEqualString(String cn) {
return compare(cn, ">= ?", Collation.UTF8_BIN); return compare(cn, ">= ?", binaryCollationName);
} }


private String greaterThanString(String cn) { 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() return new StringBuilder()
.append('(') .append('(')
.append(cn) .append(cn)
.append(' ') .append(' ')
.append(operator) .append(operator)
.append(' ') .append(" COLLATE ")
.append(collation.getCollateCommand()) .append(collation)
.append(')') .append(')')
.toString(); .toString();
} }
Expand Down

0 comments on commit edd7252

Please sign in to comment.