From 55b311ff63d4221613261313a536a3fe29bffb84 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Thu, 10 Oct 2019 21:54:19 +0800 Subject: [PATCH] Decouple ParameterBuilder and route (#3214) * remove getter of GroupedParameterBuilder.parameterGroups * rename GroupedParameterBuilder.parameterGroups to groupedParameters * add GroupedParameterBuilder.getParameters(count) * move sharding logic from GroupedParameterBuilder to ShardingSQLRewriteEngine * remove GroupedParameterBuilder.shardingConditions * refactor ShardingSQLRewriteEngine * reuse StandardParameterBuilder on GroupedParameterBuilder * refactor ParameterRewriterBuilder.getParameterRewriters() --- .../core/BaseShardingEngine.java | 3 +- .../EncryptSQLRewriteContextDecorator.java | 3 +- .../EncryptParameterRewriterBuilder.java | 7 +- .../EncryptInsertValueParameterRewriter.java | 27 +- .../ShardingSQLRewriteContextDecorator.java | 3 +- .../engine/ShardingSQLRewriteEngine.java | 43 ++- .../ShardingParameterRewriterBuilder.java | 13 +- ...eratedKeyInsertValueParameterRewriter.java | 4 +- .../parameter/builder/ParameterBuilder.java | 10 - .../builder/impl/GroupedParameterBuilder.java | 92 +----- .../impl/StandardParameterBuilder.java | 13 +- .../rewriter/ParameterRewriterBuilder.java | 4 +- .../ShardingSQLRewriteEngineTest.java | 296 ++++++++++-------- .../impl/GroupedParameterBuilderTest.java | 36 +-- .../core/route/type/RoutingResult.java | 2 +- .../executor/PreparedStatementExecutor.java | 3 +- 16 files changed, 270 insertions(+), 289 deletions(-) diff --git a/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java b/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java index bb32bc7a16..abbf993072 100644 --- a/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java +++ b/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java @@ -114,7 +114,8 @@ public abstract class BaseShardingEngine { new EncryptSQLRewriteContextDecorator(shardingRule.getEncryptRule(), isQueryWithCipherColumn).decorate(sqlRewriteContext); Collection result = new LinkedHashSet<>(); for (RoutingUnit each : sqlRouteResult.getRoutingResult().getRoutingUnits()) { - ShardingSQLRewriteEngine sqlRewriteEngine = new ShardingSQLRewriteEngine(each, getLogicAndActualTables(each, sqlRouteResult.getSqlStatementContext().getTablesContext().getTableNames())); + ShardingSQLRewriteEngine sqlRewriteEngine = new ShardingSQLRewriteEngine( + sqlRouteResult.getShardingConditions(), each, getLogicAndActualTables(each, sqlRouteResult.getSqlStatementContext().getTablesContext().getTableNames())); SQLRewriteResult sqlRewriteResult = sqlRewriteEngine.rewrite(sqlRewriteContext); result.add(new RouteUnit(each.getDataSourceName(), new SQLUnit(sqlRewriteResult.getSql(), sqlRewriteResult.getParameters()))); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/context/EncryptSQLRewriteContextDecorator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/context/EncryptSQLRewriteContextDecorator.java index 472add2b54..fd9b451996 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/context/EncryptSQLRewriteContextDecorator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/context/EncryptSQLRewriteContextDecorator.java @@ -39,8 +39,7 @@ public final class EncryptSQLRewriteContextDecorator implements SQLRewriteContex @Override public void decorate(final SQLRewriteContext sqlRewriteContext) { - for (ParameterRewriter each : new EncryptParameterRewriterBuilder(encryptRule, isQueryWithCipherColumn).getParameterRewriters( - sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getTableMetas())) { + for (ParameterRewriter each : new EncryptParameterRewriterBuilder(encryptRule, isQueryWithCipherColumn).getParameterRewriters(sqlRewriteContext.getTableMetas())) { each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters()); } sqlRewriteContext.addSQLTokenGenerators(new EncryptTokenGenerateBuilder(encryptRule, isQueryWithCipherColumn).getSQLTokenGenerators()); diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/EncryptParameterRewriterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/EncryptParameterRewriterBuilder.java index e297900d7c..2e81466602 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/EncryptParameterRewriterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/EncryptParameterRewriterBuilder.java @@ -22,11 +22,10 @@ import org.apache.shardingsphere.core.metadata.table.TableMetas; import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptAssignmentParameterRewriter; import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptInsertValueParameterRewriter; import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptPredicateParameterRewriter; -import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; -import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter; -import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder; import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware; import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware; +import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder; import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware; import org.apache.shardingsphere.core.rule.EncryptRule; @@ -46,7 +45,7 @@ public final class EncryptParameterRewriterBuilder implements ParameterRewriterB private final boolean queryWithCipherColumn; @Override - public Collection getParameterRewriters(final ParameterBuilder parameterBuilder, final TableMetas tableMetas) { + public Collection getParameterRewriters(final TableMetas tableMetas) { Collection result = getParameterRewriters(); for (ParameterRewriter each : result) { setUpParameterRewriters(each, tableMetas); diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/impl/EncryptInsertValueParameterRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/impl/EncryptInsertValueParameterRewriter.java index c8051350b9..9dc2b29959 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/impl/EncryptInsertValueParameterRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/encrypt/parameter/impl/EncryptInsertValueParameterRewriter.java @@ -23,10 +23,11 @@ import lombok.Setter; import org.apache.shardingsphere.core.optimize.segment.insert.InsertValueContext; import org.apache.shardingsphere.core.optimize.statement.SQLStatementContext; import org.apache.shardingsphere.core.optimize.statement.impl.InsertSQLStatementContext; +import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware; import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder; +import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder; import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter; -import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable; import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor; @@ -34,7 +35,6 @@ import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor; import java.util.Iterator; import java.util.List; -import java.util.Map; /** * Insert value parameter rewriter for encrypt. @@ -64,33 +64,34 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri } } - private void encryptInsertValues(final GroupedParameterBuilder parameterBuilder, final InsertSQLStatementContext insertSQLStatementContext, + private void encryptInsertValues(final GroupedParameterBuilder parameterBuilder, final InsertSQLStatementContext sqlStatementContext, final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final String encryptLogicColumnName) { - int columnIndex = insertSQLStatementContext.getColumnNames().indexOf(encryptLogicColumnName); - Iterator insertValueContexts = insertSQLStatementContext.getInsertValueContexts().iterator(); + int columnIndex = sqlStatementContext.getColumnNames().indexOf(encryptLogicColumnName); + Iterator insertValueContexts = sqlStatementContext.getInsertValueContexts().iterator(); int count = 0; - for (List each : parameterBuilder.getParameterGroups()) { + for (List each : sqlStatementContext.getGroupedParameters()) { if (!each.isEmpty()) { - encryptInsertValue(encryptRule, shardingEncryptor, tableName, columnIndex, each.size(), insertValueContexts.next().getValue(columnIndex), - parameterBuilder.getAddedIndexAndParameterGroups().get(count), parameterBuilder.getReplacedIndexAndParameterGroups().get(count), encryptLogicColumnName); + encryptInsertValue(encryptRule, shardingEncryptor, tableName, columnIndex, each.size(), + insertValueContexts.next().getValue(columnIndex), parameterBuilder.getParameterBuilders().get(count), encryptLogicColumnName); } count++; } } - private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final int parameterSize, - final Object originalValue, final Map addedParameters, final Map replacedParameters, final String encryptLogicColumnName) { + private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final int parameterSize, + final Object originalValue, final StandardParameterBuilder parameterBuilder, final String encryptLogicColumnName) { // FIXME: can process all part of insert value is ? or literal, can not process mix ? and literal // For example: values (?, ?), (1, 1) can process // For example: values (?, 1), (?, 2) can not process - replacedParameters.put(columnIndex, shardingEncryptor.encrypt(originalValue)); + parameterBuilder.getReplacedIndexAndParameters().put(columnIndex, shardingEncryptor.encrypt(originalValue)); if (shardingEncryptor instanceof ShardingQueryAssistedEncryptor) { Optional assistedColumnName = encryptRule.findAssistedQueryColumn(tableName, encryptLogicColumnName); Preconditions.checkArgument(assistedColumnName.isPresent(), "Can not find assisted query Column Name"); - addedParameters.put(parameterSize + addedParameters.size(), ((ShardingQueryAssistedEncryptor) shardingEncryptor).queryAssistedEncrypt(originalValue.toString())); + parameterBuilder.getAddedIndexAndParameters().put(parameterSize + parameterBuilder.getAddedIndexAndParameters().size(), + ((ShardingQueryAssistedEncryptor) shardingEncryptor).queryAssistedEncrypt(originalValue.toString())); } if (encryptRule.findPlainColumn(tableName, encryptLogicColumnName).isPresent()) { - addedParameters.put(parameterSize + addedParameters.size(), originalValue); + parameterBuilder.getAddedIndexAndParameters().put(parameterSize + parameterBuilder.getAddedIndexAndParameters().size(), originalValue); } } } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/context/ShardingSQLRewriteContextDecorator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/context/ShardingSQLRewriteContextDecorator.java index d8beb9e6bf..4e11a88107 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/context/ShardingSQLRewriteContextDecorator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/context/ShardingSQLRewriteContextDecorator.java @@ -40,8 +40,7 @@ public final class ShardingSQLRewriteContextDecorator implements SQLRewriteConte @Override public void decorate(final SQLRewriteContext sqlRewriteContext) { - for (ParameterRewriter each : new ShardingParameterRewriterBuilder(shardingRule, sqlRouteResult).getParameterRewriters( - sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getTableMetas())) { + for (ParameterRewriter each : new ShardingParameterRewriterBuilder(shardingRule, sqlRouteResult).getParameterRewriters(sqlRewriteContext.getTableMetas())) { each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters()); } sqlRewriteContext.addSQLTokenGenerators(new ShardingTokenGenerateBuilder(shardingRule, sqlRouteResult).getSQLTokenGenerators()); diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/engine/ShardingSQLRewriteEngine.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/engine/ShardingSQLRewriteEngine.java index 1dee5f45af..93d5af52e1 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/engine/ShardingSQLRewriteEngine.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/engine/ShardingSQLRewriteEngine.java @@ -21,8 +21,17 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.rewrite.context.SQLRewriteContext; import org.apache.shardingsphere.core.rewrite.engine.SQLRewriteEngine; import org.apache.shardingsphere.core.rewrite.engine.SQLRewriteResult; +import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder; +import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder; +import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingCondition; +import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingConditions; import org.apache.shardingsphere.core.route.type.RoutingUnit; +import org.apache.shardingsphere.core.rule.DataNode; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; import java.util.Map; /** @@ -33,12 +42,44 @@ import java.util.Map; @RequiredArgsConstructor public final class ShardingSQLRewriteEngine implements SQLRewriteEngine { + private final ShardingConditions shardingConditions; + private final RoutingUnit routingUnit; private final Map logicAndActualTables; @Override public SQLRewriteResult rewrite(final SQLRewriteContext sqlRewriteContext) { - return new SQLRewriteResult(sqlRewriteContext.getSQLBuilder().toSQL(routingUnit, logicAndActualTables), sqlRewriteContext.getParameterBuilder().getParameters(routingUnit)); + return new SQLRewriteResult(sqlRewriteContext.getSQLBuilder().toSQL(routingUnit, logicAndActualTables), getParameters(sqlRewriteContext.getParameterBuilder())); + } + + private List getParameters(final ParameterBuilder parameterBuilder) { + if (parameterBuilder instanceof StandardParameterBuilder || shardingConditions.getConditions().isEmpty()) { + return parameterBuilder.getParameters(); + } + if (parameterBuilder.getParameters().isEmpty()) { + return Collections.emptyList(); + } + List result = new LinkedList<>(); + int count = 0; + for (ShardingCondition each : shardingConditions.getConditions()) { + if (isInSameDataNode(each)) { + result.addAll(((GroupedParameterBuilder) parameterBuilder).getParameters(count)); + } + count++; + } + return result; + } + + private boolean isInSameDataNode(final ShardingCondition shardingCondition) { + if (shardingCondition.getDataNodes().isEmpty()) { + return true; + } + for (DataNode each : shardingCondition.getDataNodes()) { + if (routingUnit.getTableUnit(each.getDataSourceName(), each.getTableName()).isPresent()) { + return true; + } + } + return false; } } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/ShardingParameterRewriterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/ShardingParameterRewriterBuilder.java index 69f67355f6..c23773870f 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/ShardingParameterRewriterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/ShardingParameterRewriterBuilder.java @@ -19,14 +19,12 @@ package org.apache.shardingsphere.core.rewrite.feature.sharding.parameter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.metadata.table.TableMetas; -import org.apache.shardingsphere.core.rewrite.feature.sharding.parameter.impl.ShardingPaginationParameterRewriter; -import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; -import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter; -import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder; -import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder; import org.apache.shardingsphere.core.rewrite.feature.sharding.parameter.impl.ShardingGeneratedKeyInsertValueParameterRewriter; +import org.apache.shardingsphere.core.rewrite.feature.sharding.parameter.impl.ShardingPaginationParameterRewriter; import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware; import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.ShardingRuleAware; +import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder; import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.rule.ShardingRule; @@ -47,10 +45,7 @@ public final class ShardingParameterRewriterBuilder implements ParameterRewriter private final SQLRouteResult sqlRouteResult; @Override - public Collection getParameterRewriters(final ParameterBuilder parameterBuilder, final TableMetas tableMetas) { - if (parameterBuilder instanceof GroupedParameterBuilder) { - ((GroupedParameterBuilder) parameterBuilder).setShardingConditions(sqlRouteResult.getShardingConditions()); - } + public Collection getParameterRewriters(final TableMetas tableMetas) { Collection result = getParameterRewriters(); for (ParameterRewriter each : result) { setUpParameterRewriters(each, tableMetas); diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java index 8d23e9fe88..197eea00ea 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/feature/sharding/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java @@ -44,10 +44,10 @@ public final class ShardingGeneratedKeyInsertValueParameterRewriter implements P if (sqlStatementContext instanceof InsertSQLStatementContext && sqlRouteResult.getGeneratedKey().isPresent() && sqlRouteResult.getGeneratedKey().get().isGenerated()) { Iterator> generatedValues = sqlRouteResult.getGeneratedKey().get().getGeneratedValues().descendingIterator(); int count = 0; - for (List each : ((GroupedParameterBuilder) parameterBuilder).getParameterGroups()) { + for (List each : ((InsertSQLStatementContext) sqlStatementContext).getGroupedParameters()) { Comparable generatedValue = generatedValues.next(); if (!each.isEmpty()) { - ((GroupedParameterBuilder) parameterBuilder).getAddedIndexAndParameterGroups().get(count).put(each.size(), generatedValue); + ((GroupedParameterBuilder) parameterBuilder).getParameterBuilders().get(count).getAddedIndexAndParameters().put(each.size(), generatedValue); } count++; } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/ParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/ParameterBuilder.java index 677d366f24..40481d2243 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/ParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/ParameterBuilder.java @@ -17,8 +17,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder; -import org.apache.shardingsphere.core.route.type.RoutingUnit; - import java.util.List; /** @@ -34,12 +32,4 @@ public interface ParameterBuilder { * @return parameters */ List getParameters(); - - /** - * Get parameters. - * - * @param routingUnit routing unit - * @return parameters - */ - List getParameters(RoutingUnit routingUnit); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilder.java index d7cd30b25c..0f1915f530 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilder.java @@ -18,20 +18,11 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; import lombok.Getter; -import lombok.Setter; import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; -import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingCondition; -import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingConditions; -import org.apache.shardingsphere.core.route.type.RoutingUnit; -import org.apache.shardingsphere.core.rule.DataNode; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; /** * Grouped Parameter builder. @@ -39,85 +30,34 @@ import java.util.Map.Entry; * @author panjuan * @author zhangliang */ +@Getter public final class GroupedParameterBuilder implements ParameterBuilder { - @Getter - private final List> parameterGroups; + private final List parameterBuilders; - @Setter - private ShardingConditions shardingConditions; - - @Getter - private final List> addedIndexAndParameterGroups; - - @Getter - private final List> replacedIndexAndParameterGroups; - - public GroupedParameterBuilder(final List> parameterGroups) { - this.parameterGroups = parameterGroups; - addedIndexAndParameterGroups = createAdditionalParameterGroups(); - replacedIndexAndParameterGroups = createAdditionalParameterGroups(); - } - - private List> createAdditionalParameterGroups() { - List> result = new ArrayList<>(parameterGroups.size()); - for (int i = 0; i < parameterGroups.size(); i++) { - result.add(new HashMap()); + public GroupedParameterBuilder(final List> groupedParameters) { + parameterBuilders = new ArrayList<>(groupedParameters.size()); + for (List each : groupedParameters) { + parameterBuilders.add(new StandardParameterBuilder(each)); } - return result; } @Override public List getParameters() { List result = new LinkedList<>(); - int count = 0; - for (List each : parameterGroups) { - result.addAll(getParameters(each, count)); - count++; - } - return result; - } - - @Override - public List getParameters(final RoutingUnit routingUnit) { - List result = new LinkedList<>(); - Iterator shardingConditionIterator = shardingConditions.getConditions().iterator(); - int count = 0; - for (List each : parameterGroups) { - if (!shardingConditionIterator.hasNext() || isInSameDataNode(shardingConditionIterator.next(), routingUnit)) { - result.addAll(getParameters(each, count)); - } - count++; - } - return result; - } - - private List getParameters(final List parameterGroup, final int count) { - List result = new LinkedList<>(); - result.addAll(parameterGroup); - for (Entry entry : replacedIndexAndParameterGroups.get(count).entrySet()) { - result.set(entry.getKey(), entry.getValue()); - } - for (Entry entry : addedIndexAndParameterGroups.get(count).entrySet()) { - int index = entry.getKey(); - if (index < result.size()) { - result.add(index, entry.getValue()); - } else { - result.add(entry.getValue()); - } + for (int i = 0; i < parameterBuilders.size(); i++) { + result.addAll(getParameters(i)); } return result; } - private boolean isInSameDataNode(final ShardingCondition shardingCondition, final RoutingUnit routingUnit) { - if (shardingCondition.getDataNodes().isEmpty()) { - return true; - } - for (DataNode each : shardingCondition.getDataNodes()) { - if (routingUnit.getTableUnit(each.getDataSourceName(), each.getTableName()).isPresent()) { - return true; - } - } - return false; + /** + * Get parameters. + * + * @param count parameters group count + * @return parameters + */ + public List getParameters(final int count) { + return parameterBuilders.get(count).getParameters(); } } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/StandardParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/StandardParameterBuilder.java index 978d8a453f..59886d6c37 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/StandardParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/StandardParameterBuilder.java @@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; -import org.apache.shardingsphere.core.route.type.RoutingUnit; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -51,13 +50,13 @@ public final class StandardParameterBuilder implements ParameterBuilder { result.set(entry.getKey(), entry.getValue()); } for (Entry entry : addedIndexAndParameters.entrySet()) { - result.add(entry.getKey(), entry.getValue()); + int index = entry.getKey(); + if (index < result.size()) { + result.add(index, entry.getValue()); + } else { + result.add(entry.getValue()); + } } return result; } - - @Override - public List getParameters(final RoutingUnit routingUnit) { - return getParameters(); - } } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/rewriter/ParameterRewriterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/rewriter/ParameterRewriterBuilder.java index fb7df84734..060a1b19dc 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/rewriter/ParameterRewriterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/parameter/rewriter/ParameterRewriterBuilder.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.rewriter; import org.apache.shardingsphere.core.metadata.table.TableMetas; -import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; import java.util.Collection; @@ -32,9 +31,8 @@ public interface ParameterRewriterBuilder { /** * Get parameter rewriters. * - * @param parameterBuilder parameter builder * @param tableMetas table metas * @return parameter rewriters */ - Collection getParameterRewriters(ParameterBuilder parameterBuilder, TableMetas tableMetas); + Collection getParameterRewriters(TableMetas tableMetas); } diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/feature/sharding/ShardingSQLRewriteEngineTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/feature/sharding/ShardingSQLRewriteEngineTest.java index c40286b571..72c8e37d2f 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/feature/sharding/ShardingSQLRewriteEngineTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/feature/sharding/ShardingSQLRewriteEngineTest.java @@ -125,8 +125,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteWithoutChange() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultWithoutChange(), "SELECT table_y.id FROM table_y WHERE table_y.id=?", Collections.singletonList(1)); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT table_y.id FROM table_y WHERE table_y.id=?")); + SQLRouteResult sqlRouteResult = createSQLRouteResultWithoutChange(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT table_y.id FROM table_y WHERE table_y.id=?", Collections.singletonList(1)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT table_y.id FROM table_y WHERE table_y.id=?")); } private SQLRouteResult createSQLRouteResultWithoutChange() { @@ -141,9 +143,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableName() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForTableName(), "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", Arrays.asList(1, "x")); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createRouteResultForTableName(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT table_x.id, x.name FROM table_x x WHERE table_x.id=? AND x.name=?", Arrays.asList(1, "x")); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT table_1.id, x.name FROM table_1 x WHERE table_1.id=? AND x.name=?")); } @@ -162,10 +164,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteOrderByAndGroupByDerivedColumns() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForOrderByAndGroupByDerivedColumns(), "SELECT x.age FROM table_x x GROUP BY x.id ORDER BY x.name", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is( - "SELECT x.age , x.id AS GROUP_BY_DERIVED_0 , x.name AS ORDER_BY_DERIVED_0 FROM table_1 x GROUP BY x.id ORDER BY x.name")); + SQLRouteResult sqlRouteResult = createRouteResultForOrderByAndGroupByDerivedColumns(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT x.age FROM table_x x GROUP BY x.id ORDER BY x.name", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT x.age , x.id AS GROUP_BY_DERIVED_0 , x.name AS ORDER_BY_DERIVED_0 FROM table_1 x GROUP BY x.id ORDER BY x.name")); } private SQLRouteResult createRouteResultForOrderByAndGroupByDerivedColumns() { @@ -184,9 +186,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteAggregationDerivedColumns() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForAggregationDerivedColumns(), "SELECT AVG(x.age) FROM table_x x", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is( - "SELECT AVG(x.age) , COUNT(x.age) AS AVG_DERIVED_COUNT_0 , SUM(x.age) AS AVG_DERIVED_SUM_0 FROM table_1 x")); + SQLRouteResult sqlRouteResult = createRouteResultForAggregationDerivedColumns(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT AVG(x.age) FROM table_x x", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT AVG(x.age) , COUNT(x.age) AS AVG_DERIVED_COUNT_0 , SUM(x.age) AS AVG_DERIVED_SUM_0 FROM table_1 x")); } private SQLRouteResult createRouteResultForAggregationDerivedColumns() { @@ -208,8 +211,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteAutoGeneratedKeyColumn() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForAutoGeneratedKeyColumn(), "INSERT INTO table_x (name, age) VALUES (?, ?)", Arrays.asList("Bill", 1)); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO table_1 (name, age, id) VALUES (?, ?, ?)")); + SQLRouteResult sqlRouteResult = createRouteResultForAutoGeneratedKeyColumn(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO table_x (name, age) VALUES (?, ?)", Arrays.asList("Bill", 1)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO table_1 (name, age, id) VALUES (?, ?, ?)")); } private SQLRouteResult createRouteResultForAutoGeneratedKeyColumn() { @@ -226,18 +231,20 @@ public final class ShardingSQLRewriteEngineTest { InsertSQLStatementContext insertSQLStatementContext = new InsertSQLStatementContext(null, Arrays.asList("x", 1), insertStatement); ShardingCondition shardingCondition = new ShardingCondition(); shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + ShardingConditions shardingConditions = new ShardingConditions(Collections.singletonList(shardingCondition)); GeneratedKey generatedKey = new GeneratedKey("id", true); generatedKey.getGeneratedValues().add(1); - SQLRouteResult result = new SQLRouteResult(insertSQLStatementContext, new ShardingConditions(Collections.singletonList(shardingCondition)), generatedKey); + SQLRouteResult result = new SQLRouteResult(insertSQLStatementContext, shardingConditions, generatedKey); result.setRoutingResult(new RoutingResult()); return result; } @Test public void assertRewriteAutoGeneratedKeyColumnWithoutColumnsWithParameter() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithParameter(), "INSERT INTO `table_x` VALUES (?)", Arrays.asList("Bill", 1)); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1`(name, id) VALUES (?, ?)")); + SQLRouteResult sqlRouteResult = createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_x` VALUES (?)", Arrays.asList("Bill", 1)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO `table_1`(name, id) VALUES (?, ?)")); } private SQLRouteResult createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithParameter() { @@ -261,9 +268,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteAutoGeneratedKeyColumnWithoutColumnsWithoutParameter() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithoutParameter(), "INSERT INTO `table_x` VALUES (10)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1`(name, id) VALUES (10, 1)")); + SQLRouteResult sqlRouteResult = createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithoutParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_x` VALUES (10)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO `table_1`(name, id) VALUES (10, 1)")); } private SQLRouteResult createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithoutParameter() { @@ -287,9 +295,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteDuplicateKeyWithoutColumnsWithoutParameter() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForDuplicateKeyWithoutColumnsWithoutParameter(), - "INSERT INTO `table_x` VALUES (10) ON DUPLICATE KEY UPDATE name = VALUES(name)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createRouteResultForDuplicateKeyWithoutColumnsWithoutParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_x` VALUES (10) ON DUPLICATE KEY UPDATE name = VALUES(name)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1`(name, id) VALUES (10, 1) ON DUPLICATE KEY UPDATE name = VALUES(name)")); } @@ -314,9 +322,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteDuplicateKeyWithSetWithoutParameter() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForDuplicateKeyWithSetWithoutParameter(), + SQLRouteResult sqlRouteResult = createRouteResultForDuplicateKeyWithSetWithoutParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_x` set name = 10, id = 1 ON DUPLICATE KEY UPDATE name = VALUES(name)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1` set name = 10, id = 1 ON DUPLICATE KEY UPDATE name = VALUES(name)")); } @@ -336,9 +345,11 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteColumnWithoutColumnsWithoutParameter() { + SQLRouteResult sqlRouteResult = createRouteResultForColumnWithoutColumnsWithoutParameter(); SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForColumnWithoutColumnsWithoutParameter(), "INSERT INTO `table_x` VALUES (10, 1)", Arrays.asList("x", 1)); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1`(name, id) VALUES (10, 1)")); + sqlRouteResult, "INSERT INTO `table_x` VALUES (10, 1)", Arrays.asList("x", 1)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO `table_1`(name, id) VALUES (10, 1)")); } private SQLRouteResult createRouteResultForColumnWithoutColumnsWithoutParameter() { @@ -360,8 +371,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteColumnWithoutColumnsWithParameter() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForColumnWithoutColumnsWithParameter(), "INSERT INTO `table_x` VALUES (?, ?)", Arrays.asList("x", 1)); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_1`(name, id) VALUES (?, ?)")); + SQLRouteResult sqlRouteResult = createRouteResultForColumnWithoutColumnsWithParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_x` VALUES (?, ?)", Arrays.asList("x", 1)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO `table_1`(name, id) VALUES (?, ?)")); } private SQLRouteResult createRouteResultForColumnWithoutColumnsWithParameter() { @@ -387,8 +400,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteLimit() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForLimit(), "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT x.id FROM table_1 x LIMIT 0, 4")); + SQLRouteResult sqlRouteResult = createRouteResultForLimit(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT x.id FROM table_1 x LIMIT 0, 4")); } private SQLRouteResult createRouteResultForLimit() { @@ -405,9 +420,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteRowNumber() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForRowNumber(), + SQLRouteResult sqlRouteResult = createRouteResultForRowNumber(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>0")); } @@ -425,9 +441,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTopAndRowNumber() { + SQLRouteResult sqlRouteResult = createRouteResultForTopAndRowNumber(); SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForTopAndRowNumber(), "SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>0")); } @@ -445,8 +462,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteLimitForMemoryGroupBy() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForLimitForMemoryGroupBy(), "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT x.id FROM table_1 x LIMIT 0, 2147483647")); + SQLRouteResult sqlRouteResult = createRouteResultForLimitForMemoryGroupBy(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT x.id FROM table_1 x LIMIT 0, 2147483647")); } private SQLRouteResult createRouteResultForLimitForMemoryGroupBy() { @@ -466,9 +485,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteRowNumForMemoryGroupBy() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForRowNumForMemoryGroupBy(), + SQLRouteResult sqlRouteResult = createRouteResultForRowNumForMemoryGroupBy(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=2147483647) t WHERE t.rownum_>0")); } @@ -489,9 +509,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTopAndRowNumberForMemoryGroupBy() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForTopAndRowNumberForMemoryGroupBy(), + SQLRouteResult sqlRouteResult = createRouteResultForTopAndRowNumberForMemoryGroupBy(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT TOP(2147483647) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>0")); } @@ -512,8 +533,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteLimitForNotRewritePagination() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForLimitForNotRewritePagination(), "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT x.id FROM table_1 x LIMIT 2, 2")); + SQLRouteResult sqlRouteResult = createRouteResultForLimitForNotRewritePagination(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT x.id FROM table_x x LIMIT 2, 2", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT x.id FROM table_1 x LIMIT 2, 2")); } private SQLRouteResult createRouteResultForLimitForNotRewritePagination() { @@ -532,9 +555,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteRowNumForNotRewritePagination() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForRowNumForNotRewritePagination(), + SQLRouteResult sqlRouteResult = createRouteResultForRowNumForNotRewritePagination(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>2")); } @@ -554,10 +578,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTopAndRowNumberForNotRewritePagination() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForTopAndRowNumberForNotRewritePagination(), + SQLRouteResult sqlRouteResult = createRouteResultForTopAndRowNumberForNotRewritePagination(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_1 x) AS row_ WHERE row_.rownum_>2")); } @@ -577,8 +601,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteDerivedOrderBy() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForDerivedOrderBy(), "SELECT x.id, x.name FROM table_x x GROUP BY x.id, x.name DESC", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createRouteResultForDerivedOrderBy(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT x.id, x.name FROM table_x x GROUP BY x.id, x.name DESC", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT x.id, x.name FROM table_1 x GROUP BY x.id, x.name DESC ORDER BY x.id ASC,x.name DESC ")); } @@ -604,8 +629,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteIndexTokenForIndexNameTableName() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForIndexTokenForIndexNameTableName(), "CREATE INDEX index_name ON table_x ('column')", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("CREATE INDEX index_name_table_1 ON table_1 ('column')")); + SQLRouteResult sqlRouteResult = createRouteResultForIndexTokenForIndexNameTableName(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "CREATE INDEX index_name ON table_x ('column')", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("CREATE INDEX index_name_table_1 ON table_1 ('column')")); } private SQLRouteResult createRouteResultForIndexTokenForIndexNameTableName() { @@ -622,9 +649,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteIndexTokenForIndexNameTableNameWithoutLogicTableName() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForIndexTokenForIndexNameTableNameWithoutLogicTableName(), "CREATE INDEX logic_index ON table_x ('column')", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("CREATE INDEX logic_index_table_1 ON table_1 ('column')")); + SQLRouteResult sqlRouteResult = createRouteResultForIndexTokenForIndexNameTableNameWithoutLogicTableName(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "CREATE INDEX logic_index ON table_x ('column')", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("CREATE INDEX logic_index_table_1 ON table_1 ('column')")); } private SQLRouteResult createRouteResultForIndexTokenForIndexNameTableNameWithoutLogicTableName() { @@ -641,8 +669,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithoutBackQuoteForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForTableTokenWithoutBackQuoteForShow(), "SHOW COLUMNS FROM table_x", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_1")); + SQLRouteResult sqlRouteResult = createRouteResultForTableTokenWithoutBackQuoteForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM table_x", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_1")); } private SQLRouteResult createRouteResultForTableTokenWithoutBackQuoteForShow() { @@ -657,9 +686,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithoutBackQuoteFromSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createRouteResultForTableTokenWithoutBackQuoteFromSchemaForShow(), "SHOW COLUMNS FROM table_x FROM 'sharding_db'", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, Collections.singletonMap("table_x", "table_x")).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_x")); + SQLRouteResult sqlRouteResult = createRouteResultForTableTokenWithoutBackQuoteFromSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM table_x FROM 'sharding_db'", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, Collections.singletonMap("table_x", "table_x")).rewrite(sqlRewriteContext).getSql(), + is("SHOW COLUMNS FROM table_x")); } private SQLRouteResult createRouteResultForTableTokenWithoutBackQuoteFromSchemaForShow() { @@ -675,8 +705,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithBackQuoteForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createRouteResultForTableTokenWithBackQuoteForShow(), "SHOW COLUMNS FROM `table_x`", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); + SQLRouteResult sqlRouteResult = createRouteResultForTableTokenWithBackQuoteForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM `table_x`", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); } private SQLRouteResult createRouteResultForTableTokenWithBackQuoteForShow() { @@ -691,9 +722,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithBackQuoteFromSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithBackQuoteFromSchemaForShow(), "SHOW COLUMNS FROM `table_x` FROM 'sharding_db'", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1` FROM 'sharding_db'")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithBackQuoteFromSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM `table_x` FROM 'sharding_db'", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SHOW COLUMNS FROM `table_1` FROM 'sharding_db'")); } private SQLRouteResult createSQLRouteResultForTableTokenWithBackQuoteFromSchemaForShow() { @@ -708,8 +740,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultForTableTokenWithSchemaForShow(), "SHOW COLUMNS FROM sharding_db.table_x", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_1")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM sharding_db.table_x", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_1")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForShow() { @@ -724,9 +757,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaFromSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaFromSchemaForShow(), "SHOW COLUMNS FROM sharding_db.table_x FROM sharding_db", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM table_1 FROM sharding_db")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaFromSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM sharding_db.table_x FROM sharding_db", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SHOW COLUMNS FROM table_1 FROM sharding_db")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaFromSchemaForShow() { @@ -741,9 +775,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithBackQuoteWithSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithBackQuoteWithSchemaForShow(), "SHOW COLUMNS FROM sharding_db.`table_x`", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithBackQuoteWithSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM sharding_db.`table_x`", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); } private SQLRouteResult createSQLRouteResultForTableTokenWithBackQuoteWithSchemaForShow() { @@ -758,9 +792,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithBackQuoteWithSchemaFromSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithBackQuoteWithSchemaFromSchemaForShow(), "SHOW COLUMNS FROM sharding_db.`table_x` FROM sharding_db", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1` FROM sharding_db")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithBackQuoteWithSchemaFromSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM sharding_db.`table_x` FROM sharding_db", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SHOW COLUMNS FROM `table_1` FROM sharding_db")); } private SQLRouteResult createSQLRouteResultForTableTokenWithBackQuoteWithSchemaFromSchemaForShow() { @@ -775,9 +810,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaWithBackQuoteForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaWithBackQuoteForShow(), "SHOW COLUMNS FROM `sharding_db`.`table_x`", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaWithBackQuoteForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM `sharding_db`.`table_x`", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1`")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaWithBackQuoteForShow() { @@ -792,9 +827,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaWithBackQuoteFromSchemaForShow() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaWithBackQuoteFromSchemaForShow(), "SHOW COLUMNS FROM `sharding_db`.`table_x` FROM sharding_db", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SHOW COLUMNS FROM `table_1` FROM sharding_db")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaWithBackQuoteFromSchemaForShow(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SHOW COLUMNS FROM `sharding_db`.`table_x` FROM sharding_db", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SHOW COLUMNS FROM `table_1` FROM sharding_db")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaWithBackQuoteFromSchemaForShow() { @@ -809,8 +845,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaForSelect() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultForTableTokenWithSchemaForSelect(), "SELECT * FROM sharding_db.table_x", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM table_1")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaForSelect(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT * FROM sharding_db.table_x", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT * FROM table_1")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForSelect() { @@ -830,9 +867,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaForInsert() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaForInsert(), "INSERT INTO sharding_db.table_x (order_id, user_id, status) values (1, 1, 'OK')", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO table_1 (order_id, user_id, status) values (1, 1, 'OK')")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaForInsert(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO sharding_db.table_x (order_id, user_id, status) values (1, 1, 'OK')", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("INSERT INTO table_1 (order_id, user_id, status) values (1, 1, 'OK')")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForInsert() { @@ -849,9 +887,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaForUpdate() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaForUpdate(), "UPDATE `sharding_db`.table_x SET user_id=1 WHERE order_id=1", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("UPDATE table_1 SET user_id=1 WHERE order_id=1")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaForUpdate(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "UPDATE `sharding_db`.table_x SET user_id=1 WHERE order_id=1", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("UPDATE table_1 SET user_id=1 WHERE order_id=1")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForUpdate() { @@ -866,9 +905,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteTableTokenWithSchemaForDelete() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForTableTokenWithSchemaForDelete(), "DELETE FROM `sharding_db`.`table_x` WHERE user_id=1", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("DELETE FROM `table_1` WHERE user_id=1")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForTableTokenWithSchemaForDelete(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "DELETE FROM `sharding_db`.`table_x` WHERE user_id=1", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("DELETE FROM `table_1` WHERE user_id=1")); } private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForDelete() { @@ -883,16 +923,18 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectInWithShardingEncryptorWithCipher() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultForSelectInWithShardingEncryptor(), "SELECT id FROM table_z WHERE id in (3,5)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id in (3,5)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT cipher FROM table_z WHERE cipher IN ('encryptValue', 'encryptValue')")); } @Test public void assertRewriteSelectInWithShardingEncryptorWithPlain() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectInWithShardingEncryptor(), "SELECT id FROM table_z WHERE id in (3,5)", Collections.emptyList(), false); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT plain FROM table_z WHERE plain IN ('3', '5')")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id in (3,5)", Collections.emptyList(), false); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT plain FROM table_z WHERE plain IN ('3', '5')")); } private SQLRouteResult createSQLRouteResultForSelectInWithShardingEncryptor() { @@ -917,9 +959,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectInWithQueryAssistedShardingEncryptorWithQuery() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectInWithQueryAssistedShardingEncryptor(), "SELECT id, name FROM table_k WHERE id in (3,5)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithQueryAssistedShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id, name FROM table_k WHERE id in (3,5)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT cipher, name FROM table_k WHERE query IN ('assistedEncryptValue', 'assistedEncryptValue')")); } @@ -945,8 +987,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteUpdateWithShardingEncryptor() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultForUpdateWithShardingEncryptor(), "UPDATE table_z SET id = 1 WHERE id = 2", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createSQLRouteResultForUpdateWithShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "UPDATE table_z SET id = 1 WHERE id = 2", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("UPDATE table_z SET plain = 1, cipher = 'encryptValue' WHERE cipher = 'encryptValue'")); } @@ -967,9 +1010,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteInsertWithGeneratedKeyAndQueryAssistedShardingEncryptor() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(createSQLRouteResultForInsertWithGeneratedKeyAndQueryAssistedShardingEncryptor(), - "INSERT INTO `table_w` set name = 10 ON DUPLICATE KEY UPDATE name = VALUES(name)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createSQLRouteResultForInsertWithGeneratedKeyAndQueryAssistedShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "INSERT INTO `table_w` set name = 10 ON DUPLICATE KEY UPDATE name = VALUES(name)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), routingUnit, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("INSERT INTO `table_w` set cipher = 'encryptValue', id = 1, query = 'assistedEncryptValue', plain = 10 ON DUPLICATE KEY UPDATE name = VALUES(name)")); } @@ -995,9 +1038,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectInWithAggregationDistinct() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectInWithAggregationDistinct(), "SELECT COUNT(DISTINCT id), SUM(DISTINCT id) FROM table_z WHERE id in (3,5)", Collections.emptyList()); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT DISTINCT id, id FROM table_z WHERE id in (3,5)")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithAggregationDistinct(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT COUNT(DISTINCT id), SUM(DISTINCT id) FROM table_z WHERE id in (3,5)", Collections.emptyList()); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT DISTINCT id, id FROM table_z WHERE id in (3,5)")); } private SQLRouteResult createSQLRouteResultForSelectInWithAggregationDistinct() { @@ -1016,17 +1060,19 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectEqualWithShardingEncryptorWithCipher() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectEqualWithShardingEncryptor(), "SELECT id FROM table_z WHERE id=? AND name=?", Arrays.asList(1, "x")); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT cipher FROM table_z WHERE cipher = ? AND name=?")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectEqualWithShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id=? AND name=?", Arrays.asList(1, "x")); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT cipher FROM table_z WHERE cipher = ? AND name=?")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(0), is((Object) "encryptValue")); } @Test public void assertRewriteSelectEqualWithShardingEncryptorWithPlain() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectEqualWithShardingEncryptor(), "SELECT id FROM table_z WHERE id=? AND name=?", Arrays.asList(1, "x"), false); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT plain FROM table_z WHERE plain = ? AND name=?")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectEqualWithShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id=? AND name=?", Arrays.asList(1, "x"), false); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT plain FROM table_z WHERE plain = ? AND name=?")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(0), is((Object) 1)); } @@ -1051,9 +1097,9 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectInWithShardingEncryptorWithParameterWithCipher() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectInWithShardingEncryptorWithParameter(), "SELECT id FROM table_z WHERE id in (?, ?) or id = 3", Arrays.asList(1, 2)); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithShardingEncryptorWithParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id in (?, ?) or id = 3", Arrays.asList(1, 2)); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT cipher FROM table_z WHERE cipher IN (?, ?) or cipher = 'encryptValue'")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(0), is((Object) "encryptValue")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(1), is((Object) "encryptValue")); @@ -1061,9 +1107,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectInWithShardingEncryptorWithParameterWithPlain() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectInWithShardingEncryptorWithParameter(), "SELECT id FROM table_z WHERE id in (?, ?) or id = 3", Arrays.asList(1, 2), false); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT plain FROM table_z WHERE plain IN (?, ?) or plain = '3'")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectInWithShardingEncryptorWithParameter(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id FROM table_z WHERE id in (?, ?) or id = 3", Arrays.asList(1, 2), false); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT plain FROM table_z WHERE plain IN (?, ?) or plain = '3'")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(0), is((Object) 1)); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(1), is((Object) 2)); } @@ -1092,9 +1139,10 @@ public final class ShardingSQLRewriteEngineTest { @Test public void assertRewriteSelectEqualWithQueryAssistedShardingEncryptor() { - SQLRewriteContext sqlRewriteContext = createSQLRewriteContext( - createSQLRouteResultForSelectEqualWithQueryAssistedShardingEncryptor(), "SELECT id as alias FROM table_k WHERE id=? AND name=?", Arrays.asList(1, "k")); - assertThat(new ShardingSQLRewriteEngine(null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), is("SELECT cipher as alias FROM table_k WHERE query = ? AND name=?")); + SQLRouteResult sqlRouteResult = createSQLRouteResultForSelectEqualWithQueryAssistedShardingEncryptor(); + SQLRewriteContext sqlRewriteContext = createSQLRewriteContext(sqlRouteResult, "SELECT id as alias FROM table_k WHERE id=? AND name=?", Arrays.asList(1, "k")); + assertThat(new ShardingSQLRewriteEngine(sqlRouteResult.getShardingConditions(), null, logicTableAndActualTables).rewrite(sqlRewriteContext).getSql(), + is("SELECT cipher as alias FROM table_k WHERE query = ? AND name=?")); assertThat(sqlRewriteContext.getParameterBuilder().getParameters().get(0), is((Object) "assistedEncryptValue")); } diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilderTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilderTest.java index 7cebd65243..d43373b723 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilderTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/parameter/builder/impl/GroupedParameterBuilderTest.java @@ -17,12 +17,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; -import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingCondition; -import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingConditions; -import org.apache.shardingsphere.core.route.type.RoutingUnit; -import org.apache.shardingsphere.core.route.type.TableUnit; -import org.apache.shardingsphere.core.rule.DataNode; -import org.junit.Before; import org.junit.Test; import java.util.Arrays; @@ -34,12 +28,10 @@ import static org.junit.Assert.assertThat; public final class GroupedParameterBuilderTest { - private GroupedParameterBuilder parameterBuilder; - - @Before - public void setUp() { - parameterBuilder = new GroupedParameterBuilder(createGroupedParameters()); - parameterBuilder.setShardingConditions(createShardingConditions()); + @Test + public void assertGetParameters() { + GroupedParameterBuilder actual = new GroupedParameterBuilder(createGroupedParameters()); + assertThat(actual.getParameters(), is(Arrays.asList(3, 4, 5, 6))); } private List> createGroupedParameters() { @@ -48,24 +40,4 @@ public final class GroupedParameterBuilderTest { result.add(Arrays.asList(5, 6)); return result; } - - private ShardingConditions createShardingConditions() { - ShardingCondition shardingCondition1 = new ShardingCondition(); - shardingCondition1.getDataNodes().add(new DataNode("db1.tb1")); - ShardingCondition shardingCondition2 = new ShardingCondition(); - shardingCondition2.getDataNodes().add(new DataNode("db2.tb2")); - return new ShardingConditions(Arrays.asList(shardingCondition1, shardingCondition2)); - } - - @Test - public void assertGetParameters() { - assertThat(parameterBuilder.getParameters(), is(Arrays.asList(3, 4, 5, 6))); - } - - @Test - public void assertGetParametersWithRoutingUnit() { - RoutingUnit routingUnit = new RoutingUnit("db1"); - routingUnit.getTableUnits().add(new TableUnit("tb1", "tb1")); - assertThat(parameterBuilder.getParameters(routingUnit), is(Arrays.asList(3, 4))); - } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingResult.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingResult.java index 21974e6e78..1430fec7f5 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingResult.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingResult.java @@ -35,7 +35,7 @@ import java.util.Set; * @author zhangliang */ @Getter -public class RoutingResult { +public final class RoutingResult { private final Collection routingUnits = new LinkedHashSet<>(); diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutor.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutor.java index 773b7f238b..46a203bf27 100644 --- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutor.java +++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutor.java @@ -117,8 +117,7 @@ public final class PreparedStatementExecutor extends AbstractStatementExecutor { ShardingRule shardingRule = getConnection().getRuntimeContext().getRule(); ShardingProperties properties = getConnection().getRuntimeContext().getProps(); getResultSets().add(resultSet); - return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new StreamQueryResult(resultSet, shardingRule, properties) - : new MemoryQueryResult(resultSet, shardingRule, properties); + return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new StreamQueryResult(resultSet, shardingRule, properties) : new MemoryQueryResult(resultSet, shardingRule, properties); } /** -- GitLab