未验证 提交 55b311ff 编写于 作者: L Liang Zhang 提交者: GitHub

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()
上级 70cc0b8e
...@@ -114,7 +114,8 @@ public abstract class BaseShardingEngine { ...@@ -114,7 +114,8 @@ public abstract class BaseShardingEngine {
new EncryptSQLRewriteContextDecorator(shardingRule.getEncryptRule(), isQueryWithCipherColumn).decorate(sqlRewriteContext); new EncryptSQLRewriteContextDecorator(shardingRule.getEncryptRule(), isQueryWithCipherColumn).decorate(sqlRewriteContext);
Collection<RouteUnit> result = new LinkedHashSet<>(); Collection<RouteUnit> result = new LinkedHashSet<>();
for (RoutingUnit each : sqlRouteResult.getRoutingResult().getRoutingUnits()) { 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); SQLRewriteResult sqlRewriteResult = sqlRewriteEngine.rewrite(sqlRewriteContext);
result.add(new RouteUnit(each.getDataSourceName(), new SQLUnit(sqlRewriteResult.getSql(), sqlRewriteResult.getParameters()))); result.add(new RouteUnit(each.getDataSourceName(), new SQLUnit(sqlRewriteResult.getSql(), sqlRewriteResult.getParameters())));
} }
......
...@@ -39,8 +39,7 @@ public final class EncryptSQLRewriteContextDecorator implements SQLRewriteContex ...@@ -39,8 +39,7 @@ public final class EncryptSQLRewriteContextDecorator implements SQLRewriteContex
@Override @Override
public void decorate(final SQLRewriteContext sqlRewriteContext) { public void decorate(final SQLRewriteContext sqlRewriteContext) {
for (ParameterRewriter each : new EncryptParameterRewriterBuilder(encryptRule, isQueryWithCipherColumn).getParameterRewriters( for (ParameterRewriter each : new EncryptParameterRewriterBuilder(encryptRule, isQueryWithCipherColumn).getParameterRewriters(sqlRewriteContext.getTableMetas())) {
sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getTableMetas())) {
each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters()); each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters());
} }
sqlRewriteContext.addSQLTokenGenerators(new EncryptTokenGenerateBuilder(encryptRule, isQueryWithCipherColumn).getSQLTokenGenerators()); sqlRewriteContext.addSQLTokenGenerators(new EncryptTokenGenerateBuilder(encryptRule, isQueryWithCipherColumn).getSQLTokenGenerators());
......
...@@ -22,11 +22,10 @@ import org.apache.shardingsphere.core.metadata.table.TableMetas; ...@@ -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.EncryptAssignmentParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptInsertValueParameterRewriter; 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.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.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware; 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.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.rule.EncryptRule;
...@@ -46,7 +45,7 @@ public final class EncryptParameterRewriterBuilder implements ParameterRewriterB ...@@ -46,7 +45,7 @@ public final class EncryptParameterRewriterBuilder implements ParameterRewriterB
private final boolean queryWithCipherColumn; private final boolean queryWithCipherColumn;
@Override @Override
public Collection<ParameterRewriter> getParameterRewriters(final ParameterBuilder parameterBuilder, final TableMetas tableMetas) { public Collection<ParameterRewriter> getParameterRewriters(final TableMetas tableMetas) {
Collection<ParameterRewriter> result = getParameterRewriters(); Collection<ParameterRewriter> result = getParameterRewriters();
for (ParameterRewriter each : result) { for (ParameterRewriter each : result) {
setUpParameterRewriters(each, tableMetas); setUpParameterRewriters(each, tableMetas);
......
...@@ -23,10 +23,11 @@ import lombok.Setter; ...@@ -23,10 +23,11 @@ import lombok.Setter;
import org.apache.shardingsphere.core.optimize.segment.insert.InsertValueContext; import org.apache.shardingsphere.core.optimize.segment.insert.InsertValueContext;
import org.apache.shardingsphere.core.optimize.statement.SQLStatementContext; import org.apache.shardingsphere.core.optimize.statement.SQLStatementContext;
import org.apache.shardingsphere.core.optimize.statement.impl.InsertSQLStatementContext; 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.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder; 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.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.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable; import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor; import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
...@@ -34,7 +35,6 @@ import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor; ...@@ -34,7 +35,6 @@ import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Insert value parameter rewriter for encrypt. * Insert value parameter rewriter for encrypt.
...@@ -64,33 +64,34 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri ...@@ -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) { final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final String encryptLogicColumnName) {
int columnIndex = insertSQLStatementContext.getColumnNames().indexOf(encryptLogicColumnName); int columnIndex = sqlStatementContext.getColumnNames().indexOf(encryptLogicColumnName);
Iterator<InsertValueContext> insertValueContexts = insertSQLStatementContext.getInsertValueContexts().iterator(); Iterator<InsertValueContext> insertValueContexts = sqlStatementContext.getInsertValueContexts().iterator();
int count = 0; int count = 0;
for (List<Object> each : parameterBuilder.getParameterGroups()) { for (List<Object> each : sqlStatementContext.getGroupedParameters()) {
if (!each.isEmpty()) { if (!each.isEmpty()) {
encryptInsertValue(encryptRule, shardingEncryptor, tableName, columnIndex, each.size(), insertValueContexts.next().getValue(columnIndex), encryptInsertValue(encryptRule, shardingEncryptor, tableName, columnIndex, each.size(),
parameterBuilder.getAddedIndexAndParameterGroups().get(count), parameterBuilder.getReplacedIndexAndParameterGroups().get(count), encryptLogicColumnName); insertValueContexts.next().getValue(columnIndex), parameterBuilder.getParameterBuilders().get(count), encryptLogicColumnName);
} }
count++; count++;
} }
} }
private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final int parameterSize, private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final int parameterSize,
final Object originalValue, final Map<Integer, Object> addedParameters, final Map<Integer, Object> replacedParameters, final String encryptLogicColumnName) { 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 // 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, 1) can process
// For example: values (?, 1), (?, 2) can not 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) { if (shardingEncryptor instanceof ShardingQueryAssistedEncryptor) {
Optional<String> assistedColumnName = encryptRule.findAssistedQueryColumn(tableName, encryptLogicColumnName); Optional<String> assistedColumnName = encryptRule.findAssistedQueryColumn(tableName, encryptLogicColumnName);
Preconditions.checkArgument(assistedColumnName.isPresent(), "Can not find assisted query Column Name"); 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()) { if (encryptRule.findPlainColumn(tableName, encryptLogicColumnName).isPresent()) {
addedParameters.put(parameterSize + addedParameters.size(), originalValue); parameterBuilder.getAddedIndexAndParameters().put(parameterSize + parameterBuilder.getAddedIndexAndParameters().size(), originalValue);
} }
} }
} }
...@@ -40,8 +40,7 @@ public final class ShardingSQLRewriteContextDecorator implements SQLRewriteConte ...@@ -40,8 +40,7 @@ public final class ShardingSQLRewriteContextDecorator implements SQLRewriteConte
@Override @Override
public void decorate(final SQLRewriteContext sqlRewriteContext) { public void decorate(final SQLRewriteContext sqlRewriteContext) {
for (ParameterRewriter each : new ShardingParameterRewriterBuilder(shardingRule, sqlRouteResult).getParameterRewriters( for (ParameterRewriter each : new ShardingParameterRewriterBuilder(shardingRule, sqlRouteResult).getParameterRewriters(sqlRewriteContext.getTableMetas())) {
sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getTableMetas())) {
each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters()); each.rewrite(sqlRewriteContext.getParameterBuilder(), sqlRewriteContext.getSqlStatementContext(), sqlRewriteContext.getParameters());
} }
sqlRewriteContext.addSQLTokenGenerators(new ShardingTokenGenerateBuilder(shardingRule, sqlRouteResult).getSQLTokenGenerators()); sqlRewriteContext.addSQLTokenGenerators(new ShardingTokenGenerateBuilder(shardingRule, sqlRouteResult).getSQLTokenGenerators());
......
...@@ -21,8 +21,17 @@ import lombok.RequiredArgsConstructor; ...@@ -21,8 +21,17 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rewrite.context.SQLRewriteContext; import org.apache.shardingsphere.core.rewrite.context.SQLRewriteContext;
import org.apache.shardingsphere.core.rewrite.engine.SQLRewriteEngine; import org.apache.shardingsphere.core.rewrite.engine.SQLRewriteEngine;
import org.apache.shardingsphere.core.rewrite.engine.SQLRewriteResult; 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.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; import java.util.Map;
/** /**
...@@ -33,12 +42,44 @@ import java.util.Map; ...@@ -33,12 +42,44 @@ import java.util.Map;
@RequiredArgsConstructor @RequiredArgsConstructor
public final class ShardingSQLRewriteEngine implements SQLRewriteEngine { public final class ShardingSQLRewriteEngine implements SQLRewriteEngine {
private final ShardingConditions shardingConditions;
private final RoutingUnit routingUnit; private final RoutingUnit routingUnit;
private final Map<String, String> logicAndActualTables; private final Map<String, String> logicAndActualTables;
@Override @Override
public SQLRewriteResult rewrite(final SQLRewriteContext sqlRewriteContext) { 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<Object> getParameters(final ParameterBuilder parameterBuilder) {
if (parameterBuilder instanceof StandardParameterBuilder || shardingConditions.getConditions().isEmpty()) {
return parameterBuilder.getParameters();
}
if (parameterBuilder.getParameters().isEmpty()) {
return Collections.emptyList();
}
List<Object> 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;
} }
} }
...@@ -19,14 +19,12 @@ package org.apache.shardingsphere.core.rewrite.feature.sharding.parameter; ...@@ -19,14 +19,12 @@ package org.apache.shardingsphere.core.rewrite.feature.sharding.parameter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.metadata.table.TableMetas; 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.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.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.ShardingRuleAware; 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.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.rule.ShardingRule; import org.apache.shardingsphere.core.rule.ShardingRule;
...@@ -47,10 +45,7 @@ public final class ShardingParameterRewriterBuilder implements ParameterRewriter ...@@ -47,10 +45,7 @@ public final class ShardingParameterRewriterBuilder implements ParameterRewriter
private final SQLRouteResult sqlRouteResult; private final SQLRouteResult sqlRouteResult;
@Override @Override
public Collection<ParameterRewriter> getParameterRewriters(final ParameterBuilder parameterBuilder, final TableMetas tableMetas) { public Collection<ParameterRewriter> getParameterRewriters(final TableMetas tableMetas) {
if (parameterBuilder instanceof GroupedParameterBuilder) {
((GroupedParameterBuilder) parameterBuilder).setShardingConditions(sqlRouteResult.getShardingConditions());
}
Collection<ParameterRewriter> result = getParameterRewriters(); Collection<ParameterRewriter> result = getParameterRewriters();
for (ParameterRewriter each : result) { for (ParameterRewriter each : result) {
setUpParameterRewriters(each, tableMetas); setUpParameterRewriters(each, tableMetas);
......
...@@ -44,10 +44,10 @@ public final class ShardingGeneratedKeyInsertValueParameterRewriter implements P ...@@ -44,10 +44,10 @@ public final class ShardingGeneratedKeyInsertValueParameterRewriter implements P
if (sqlStatementContext instanceof InsertSQLStatementContext && sqlRouteResult.getGeneratedKey().isPresent() && sqlRouteResult.getGeneratedKey().get().isGenerated()) { if (sqlStatementContext instanceof InsertSQLStatementContext && sqlRouteResult.getGeneratedKey().isPresent() && sqlRouteResult.getGeneratedKey().get().isGenerated()) {
Iterator<Comparable<?>> generatedValues = sqlRouteResult.getGeneratedKey().get().getGeneratedValues().descendingIterator(); Iterator<Comparable<?>> generatedValues = sqlRouteResult.getGeneratedKey().get().getGeneratedValues().descendingIterator();
int count = 0; int count = 0;
for (List<Object> each : ((GroupedParameterBuilder) parameterBuilder).getParameterGroups()) { for (List<Object> each : ((InsertSQLStatementContext) sqlStatementContext).getGroupedParameters()) {
Comparable<?> generatedValue = generatedValues.next(); Comparable<?> generatedValue = generatedValues.next();
if (!each.isEmpty()) { if (!each.isEmpty()) {
((GroupedParameterBuilder) parameterBuilder).getAddedIndexAndParameterGroups().get(count).put(each.size(), generatedValue); ((GroupedParameterBuilder) parameterBuilder).getParameterBuilders().get(count).getAddedIndexAndParameters().put(each.size(), generatedValue);
} }
count++; count++;
} }
......
...@@ -17,8 +17,6 @@ ...@@ -17,8 +17,6 @@
package org.apache.shardingsphere.core.rewrite.parameter.builder; package org.apache.shardingsphere.core.rewrite.parameter.builder;
import org.apache.shardingsphere.core.route.type.RoutingUnit;
import java.util.List; import java.util.List;
/** /**
...@@ -34,12 +32,4 @@ public interface ParameterBuilder { ...@@ -34,12 +32,4 @@ public interface ParameterBuilder {
* @return parameters * @return parameters
*/ */
List<Object> getParameters(); List<Object> getParameters();
/**
* Get parameters.
*
* @param routingUnit routing unit
* @return parameters
*/
List<Object> getParameters(RoutingUnit routingUnit);
} }
...@@ -18,20 +18,11 @@ ...@@ -18,20 +18,11 @@
package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; package org.apache.shardingsphere.core.rewrite.parameter.builder.impl;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; 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.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/** /**
* Grouped Parameter builder. * Grouped Parameter builder.
...@@ -39,85 +30,34 @@ import java.util.Map.Entry; ...@@ -39,85 +30,34 @@ import java.util.Map.Entry;
* @author panjuan * @author panjuan
* @author zhangliang * @author zhangliang
*/ */
@Getter
public final class GroupedParameterBuilder implements ParameterBuilder { public final class GroupedParameterBuilder implements ParameterBuilder {
@Getter private final List<StandardParameterBuilder> parameterBuilders;
private final List<List<Object>> parameterGroups;
@Setter public GroupedParameterBuilder(final List<List<Object>> groupedParameters) {
private ShardingConditions shardingConditions; parameterBuilders = new ArrayList<>(groupedParameters.size());
for (List<Object> each : groupedParameters) {
@Getter parameterBuilders.add(new StandardParameterBuilder(each));
private final List<Map<Integer, Object>> addedIndexAndParameterGroups;
@Getter
private final List<Map<Integer, Object>> replacedIndexAndParameterGroups;
public GroupedParameterBuilder(final List<List<Object>> parameterGroups) {
this.parameterGroups = parameterGroups;
addedIndexAndParameterGroups = createAdditionalParameterGroups();
replacedIndexAndParameterGroups = createAdditionalParameterGroups();
}
private List<Map<Integer, Object>> createAdditionalParameterGroups() {
List<Map<Integer, Object>> result = new ArrayList<>(parameterGroups.size());
for (int i = 0; i < parameterGroups.size(); i++) {
result.add(new HashMap<Integer, Object>());
} }
return result;
} }
@Override @Override
public List<Object> getParameters() { public List<Object> getParameters() {
List<Object> result = new LinkedList<>(); List<Object> result = new LinkedList<>();
int count = 0; for (int i = 0; i < parameterBuilders.size(); i++) {
for (List<Object> each : parameterGroups) { result.addAll(getParameters(i));
result.addAll(getParameters(each, count));
count++;
}
return result;
}
@Override
public List<Object> getParameters(final RoutingUnit routingUnit) {
List<Object> result = new LinkedList<>();
Iterator<ShardingCondition> shardingConditionIterator = shardingConditions.getConditions().iterator();
int count = 0;
for (List<Object> each : parameterGroups) {
if (!shardingConditionIterator.hasNext() || isInSameDataNode(shardingConditionIterator.next(), routingUnit)) {
result.addAll(getParameters(each, count));
}
count++;
}
return result;
}
private List<Object> getParameters(final List<Object> parameterGroup, final int count) {
List<Object> result = new LinkedList<>();
result.addAll(parameterGroup);
for (Entry<Integer, Object> entry : replacedIndexAndParameterGroups.get(count).entrySet()) {
result.set(entry.getKey(), entry.getValue());
}
for (Entry<Integer, Object> entry : addedIndexAndParameterGroups.get(count).entrySet()) {
int index = entry.getKey();
if (index < result.size()) {
result.add(index, entry.getValue());
} else {
result.add(entry.getValue());
}
} }
return result; return result;
} }
private boolean isInSameDataNode(final ShardingCondition shardingCondition, final RoutingUnit routingUnit) { /**
if (shardingCondition.getDataNodes().isEmpty()) { * Get parameters.
return true; *
} * @param count parameters group count
for (DataNode each : shardingCondition.getDataNodes()) { * @return parameters
if (routingUnit.getTableUnit(each.getDataSourceName(), each.getTableName()).isPresent()) { */
return true; public List<Object> getParameters(final int count) {
} return parameterBuilders.get(count).getParameters();
}
return false;
} }
} }
...@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; ...@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.parameter.builder.impl;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.route.type.RoutingUnit;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
...@@ -51,13 +50,13 @@ public final class StandardParameterBuilder implements ParameterBuilder { ...@@ -51,13 +50,13 @@ public final class StandardParameterBuilder implements ParameterBuilder {
result.set(entry.getKey(), entry.getValue()); result.set(entry.getKey(), entry.getValue());
} }
for (Entry<Integer, Object> entry : addedIndexAndParameters.entrySet()) { for (Entry<Integer, Object> 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; return result;
} }
@Override
public List<Object> getParameters(final RoutingUnit routingUnit) {
return getParameters();
}
} }
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
package org.apache.shardingsphere.core.rewrite.parameter.rewriter; package org.apache.shardingsphere.core.rewrite.parameter.rewriter;
import org.apache.shardingsphere.core.metadata.table.TableMetas; import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import java.util.Collection; import java.util.Collection;
...@@ -32,9 +31,8 @@ public interface ParameterRewriterBuilder { ...@@ -32,9 +31,8 @@ public interface ParameterRewriterBuilder {
/** /**
* Get parameter rewriters. * Get parameter rewriters.
* *
* @param parameterBuilder parameter builder
* @param tableMetas table metas * @param tableMetas table metas
* @return parameter rewriters * @return parameter rewriters
*/ */
Collection<ParameterRewriter> getParameterRewriters(ParameterBuilder parameterBuilder, TableMetas tableMetas); Collection<ParameterRewriter> getParameterRewriters(TableMetas tableMetas);
} }
...@@ -17,12 +17,6 @@ ...@@ -17,12 +17,6 @@
package org.apache.shardingsphere.core.rewrite.parameter.builder.impl; 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 org.junit.Test;
import java.util.Arrays; import java.util.Arrays;
...@@ -34,12 +28,10 @@ import static org.junit.Assert.assertThat; ...@@ -34,12 +28,10 @@ import static org.junit.Assert.assertThat;
public final class GroupedParameterBuilderTest { public final class GroupedParameterBuilderTest {
private GroupedParameterBuilder parameterBuilder; @Test
public void assertGetParameters() {
@Before GroupedParameterBuilder actual = new GroupedParameterBuilder(createGroupedParameters());
public void setUp() { assertThat(actual.getParameters(), is(Arrays.<Object>asList(3, 4, 5, 6)));
parameterBuilder = new GroupedParameterBuilder(createGroupedParameters());
parameterBuilder.setShardingConditions(createShardingConditions());
} }
private List<List<Object>> createGroupedParameters() { private List<List<Object>> createGroupedParameters() {
...@@ -48,24 +40,4 @@ public final class GroupedParameterBuilderTest { ...@@ -48,24 +40,4 @@ public final class GroupedParameterBuilderTest {
result.add(Arrays.<Object>asList(5, 6)); result.add(Arrays.<Object>asList(5, 6));
return result; 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.<Object>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.<Object>asList(3, 4)));
}
} }
...@@ -35,7 +35,7 @@ import java.util.Set; ...@@ -35,7 +35,7 @@ import java.util.Set;
* @author zhangliang * @author zhangliang
*/ */
@Getter @Getter
public class RoutingResult { public final class RoutingResult {
private final Collection<RoutingUnit> routingUnits = new LinkedHashSet<>(); private final Collection<RoutingUnit> routingUnits = new LinkedHashSet<>();
......
...@@ -117,8 +117,7 @@ public final class PreparedStatementExecutor extends AbstractStatementExecutor { ...@@ -117,8 +117,7 @@ public final class PreparedStatementExecutor extends AbstractStatementExecutor {
ShardingRule shardingRule = getConnection().getRuntimeContext().getRule(); ShardingRule shardingRule = getConnection().getRuntimeContext().getRule();
ShardingProperties properties = getConnection().getRuntimeContext().getProps(); ShardingProperties properties = getConnection().getRuntimeContext().getProps();
getResultSets().add(resultSet); getResultSets().add(resultSet);
return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new StreamQueryResult(resultSet, shardingRule, properties) return ConnectionMode.MEMORY_STRICTLY == connectionMode ? new StreamQueryResult(resultSet, shardingRule, properties) : new MemoryQueryResult(resultSet, shardingRule, properties);
: new MemoryQueryResult(resultSet, shardingRule, properties);
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册