diff --git a/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/metadata/table/TableMetaData.java b/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/metadata/table/TableMetaData.java index 574a4004b0fe5..d98e8fc2725da 100644 --- a/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/metadata/table/TableMetaData.java +++ b/sharding-core/sharding-core-common/src/main/java/org/apache/shardingsphere/core/metadata/table/TableMetaData.java @@ -50,7 +50,7 @@ public TableMetaData(final Collection columnMetaDataList, final private Map getColumns(final Collection columnMetaDataList) { Map columns = new LinkedHashMap<>(columnMetaDataList.size(), 1); for (ColumnMetaData each : columnMetaDataList) { - columns.put(each.getName(), each); + columns.put(each.getName().toLowerCase(), each); } return Collections.synchronizedMap(columns); } diff --git a/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/core/merge/MergeEngineFactoryTest.java b/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/core/merge/MergeEngineFactoryTest.java index 747123d3c312c..3b626c6a79373 100644 --- a/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/core/merge/MergeEngineFactoryTest.java +++ b/sharding-core/sharding-core-merge/src/test/java/org/apache/shardingsphere/core/merge/MergeEngineFactoryTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.core.merge.dal.DALMergeEngine; import org.apache.shardingsphere.core.merge.dql.DQLMergeEngine; import org.apache.shardingsphere.core.merge.fixture.TestQueryResult; +import org.apache.shardingsphere.core.optimize.api.segment.InsertValue; import org.apache.shardingsphere.core.optimize.encrypt.condition.EncryptCondition; import org.apache.shardingsphere.core.optimize.encrypt.statement.EncryptTransparentOptimizedStatement; import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; @@ -89,8 +90,9 @@ public void assertNewInstanceWithDALStatement() throws SQLException { @Test public void assertNewInstanceWithOtherStatement() throws SQLException { - SQLRouteResult routeResult = new SQLRouteResult(new ShardingInsertOptimizedStatement(new InsertStatement(), - Collections.emptyList(), Collections.emptyList(), null), new EncryptTransparentOptimizedStatement(new InsertStatement())); + SQLRouteResult routeResult = new SQLRouteResult( + new ShardingInsertOptimizedStatement(new InsertStatement(), Collections.emptyList(), Collections.emptyList(), null, Collections.emptyList()), + new EncryptTransparentOptimizedStatement(new InsertStatement())); assertThat(MergeEngineFactory.newInstance(DatabaseTypes.getActualDatabaseType("MySQL"), null, routeResult, null, queryResults), instanceOf(TransparentMergeEngine.class)); } } diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/api/segment/InsertValue.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/api/segment/InsertValue.java index f162939930476..5d2247e81ad32 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/api/segment/InsertValue.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/api/segment/InsertValue.java @@ -25,12 +25,10 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment; -import org.apache.shardingsphere.core.rule.DataNode; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** @@ -40,7 +38,7 @@ * @author zhangliang */ @Getter -@ToString(exclude = "dataNodes") +@ToString public final class InsertValue { private final int parametersCount; @@ -49,8 +47,6 @@ public final class InsertValue { private final List parameters; - private final List dataNodes = new LinkedList<>(); - public InsertValue(final Collection assignments, final int derivedColumnsCount, final List parameters, final int parametersOffset) { parametersCount = calculateParametersCount(assignments); valueExpressions = getValueExpressions(assignments, derivedColumnsCount); diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/engine/dml/EncryptInsertOptimizeEngine.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/engine/dml/EncryptInsertOptimizeEngine.java index c095b16110caf..553e4eec0d309 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/engine/dml/EncryptInsertOptimizeEngine.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/engine/dml/EncryptInsertOptimizeEngine.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.core.rule.EncryptRule; import java.util.Collection; +import java.util.LinkedList; import java.util.List; /** @@ -37,13 +38,20 @@ public final class EncryptInsertOptimizeEngine implements EncryptOptimizeEngine< @Override public EncryptInsertOptimizedStatement optimize(final EncryptRule encryptRule, final TableMetas tableMetas, final String sql, final List parameters, final InsertStatement sqlStatement) { - String tableName = sqlStatement.getTable().getTableName(); - EncryptInsertOptimizedStatement result = new EncryptInsertOptimizedStatement(sqlStatement, tableMetas); - int derivedColumnsCount = encryptRule.getAssistedQueryAndPlainColumns(tableName).size(); + int derivedColumnsCount = getDerivedColumnsCount(encryptRule, sqlStatement.getTable().getTableName()); + return new EncryptInsertOptimizedStatement(sqlStatement, tableMetas, getInsertValues(parameters, sqlStatement, derivedColumnsCount)); + } + + private int getDerivedColumnsCount(final EncryptRule encryptRule, final String tableName) { + return encryptRule.getAssistedQueryAndPlainColumns(tableName).size(); + } + + private List getInsertValues(final List parameters, final InsertStatement sqlStatement, final int derivedColumnsCount) { + List result = new LinkedList<>(); int parametersOffset = 0; for (Collection each : sqlStatement.getAllValueExpressions()) { InsertValue insertValue = new InsertValue(each, derivedColumnsCount, parameters, parametersOffset); - result.getInsertValues().add(insertValue); + result.add(insertValue); parametersOffset += insertValue.getParametersCount(); } return result; diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/statement/EncryptInsertOptimizedStatement.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/statement/EncryptInsertOptimizedStatement.java index 3ec02f7ef8b76..435c676724197 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/statement/EncryptInsertOptimizedStatement.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/encrypt/statement/EncryptInsertOptimizedStatement.java @@ -27,7 +27,6 @@ import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement; -import java.util.LinkedList; import java.util.List; /** @@ -46,12 +45,13 @@ public final class EncryptInsertOptimizedStatement implements InsertOptimizedSta private final List columnNames; - private final List insertValues = new LinkedList<>(); + private final List insertValues; - public EncryptInsertOptimizedStatement(final InsertStatement sqlStatement, final TableMetas tableMetas) { + public EncryptInsertOptimizedStatement(final InsertStatement sqlStatement, final TableMetas tableMetas, final List insertValues) { this.sqlStatement = sqlStatement; tables = new Tables(sqlStatement); columnNames = sqlStatement.useDefaultColumns() ? tableMetas.getAllColumnNames(sqlStatement.getTable().getTableName()) : sqlStatement.getColumnNames(); + this.insertValues = insertValues; } @Override diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/engnie/dml/ShardingInsertOptimizeEngine.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/engnie/dml/ShardingInsertOptimizeEngine.java index d02eae830cca0..e0c39de3f7c85 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/engnie/dml/ShardingInsertOptimizeEngine.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/engnie/dml/ShardingInsertOptimizeEngine.java @@ -46,41 +46,15 @@ public final class ShardingInsertOptimizeEngine implements ShardingOptimizeEngine { @Override - public ShardingInsertOptimizedStatement optimize(final ShardingRule shardingRule, + public ShardingInsertOptimizedStatement optimize(final ShardingRule shardingRule, final TableMetas tableMetas, final String sql, final List parameters, final InsertStatement sqlStatement) { - String tableName = sqlStatement.getTable().getTableName(); - List columnNames = sqlStatement.useDefaultColumns() ? tableMetas.getAllColumnNames(tableName) : sqlStatement.getColumnNames(); - Optional generatedKey = GeneratedKey.getGenerateKey(shardingRule, parameters, sqlStatement, columnNames); - boolean isGeneratedValue = generatedKey.isPresent() && generatedKey.get().isGenerated(); - if (isGeneratedValue) { - columnNames.remove(generatedKey.get().getColumnName()); - } - List allColumnNames = getAllColumnNames(columnNames, generatedKey.orNull(), shardingRule.getEncryptRule().getAssistedQueryAndPlainColumns(tableName)); - List shardingConditions = new InsertClauseShardingConditionEngine(shardingRule).createShardingConditions(sqlStatement, parameters, allColumnNames, generatedKey.orNull()); - ShardingInsertOptimizedStatement result = new ShardingInsertOptimizedStatement(sqlStatement, shardingConditions, columnNames, generatedKey.orNull()); - checkDuplicateKeyForShardingKey(shardingRule, sqlStatement, tableName); - int derivedColumnsCount = getDerivedColumnsCount(shardingRule, tableName, isGeneratedValue); - int parametersOffset = 0; - for (Collection each : sqlStatement.getAllValueExpressions()) { - InsertValue insertValue = new InsertValue(each, derivedColumnsCount, parameters, parametersOffset); - result.getInsertValues().add(insertValue); - parametersOffset += insertValue.getParametersCount(); - } - return result; - } - - private int getDerivedColumnsCount(final ShardingRule shardingRule, final String tableName, final boolean isGeneratedValue) { - int encryptDerivedColumnsCount = shardingRule.getEncryptRule().getAssistedQueryAndPlainColumns(tableName).size(); - return isGeneratedValue ? encryptDerivedColumnsCount + 1 : encryptDerivedColumnsCount; - } - - private List getAllColumnNames(final Collection columnNames, final GeneratedKey generatedKey, final Collection derivedColumnNames) { - List result = new LinkedList<>(columnNames); - if (null != generatedKey && generatedKey.isGenerated()) { - result.add(generatedKey.getColumnName()); - } - result.addAll(derivedColumnNames); - return result; + checkDuplicateKeyForShardingKey(shardingRule, sqlStatement, sqlStatement.getTable().getTableName()); + Optional generatedKey = GeneratedKey.getGenerateKey(shardingRule, tableMetas, parameters, sqlStatement); + List columnNames = getColumnNames(tableMetas, sqlStatement, generatedKey.orNull()); + List shardingConditions = new InsertClauseShardingConditionEngine(shardingRule).createShardingConditions(sqlStatement, parameters, columnNames, generatedKey.orNull()); + int derivedColumnsCount = getDerivedColumnsCount(shardingRule, sqlStatement.getTable().getTableName(), generatedKey.isPresent() && generatedKey.get().isGenerated()); + List insertValues = getInsertValues(parameters, sqlStatement, derivedColumnsCount); + return new ShardingInsertOptimizedStatement(sqlStatement, shardingConditions, columnNames, generatedKey.orNull(), insertValues); } private void checkDuplicateKeyForShardingKey(final ShardingRule shardingRule, final InsertStatement sqlStatement, final String tableName) { @@ -98,4 +72,29 @@ private boolean isUpdateShardingKey(final ShardingRule shardingRule, final OnDup } return false; } + + private List getColumnNames(final TableMetas tableMetas, final InsertStatement sqlStatement, final GeneratedKey generatedKey) { + List result = sqlStatement.useDefaultColumns() ? tableMetas.getAllColumnNames(sqlStatement.getTable().getTableName()) : sqlStatement.getColumnNames(); + if (null != generatedKey && generatedKey.isGenerated()) { + result.remove(generatedKey.getColumnName()); + result.add(generatedKey.getColumnName()); + } + return result; + } + + private int getDerivedColumnsCount(final ShardingRule shardingRule, final String tableName, final boolean isGeneratedValue) { + int encryptDerivedColumnsCount = shardingRule.getEncryptRule().getAssistedQueryAndPlainColumns(tableName).size(); + return isGeneratedValue ? encryptDerivedColumnsCount + 1 : encryptDerivedColumnsCount; + } + + private List getInsertValues(final List parameters, final InsertStatement sqlStatement, final int derivedColumnsCount) { + List result = new LinkedList<>(); + int parametersOffset = 0; + for (Collection each : sqlStatement.getAllValueExpressions()) { + InsertValue insertValue = new InsertValue(each, derivedColumnsCount, parameters, parametersOffset); + result.add(insertValue); + parametersOffset += insertValue.getParametersCount(); + } + return result; + } } diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/condition/ShardingCondition.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/condition/ShardingCondition.java index 2f181ba968bce..0d979983041e3 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/condition/ShardingCondition.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/condition/ShardingCondition.java @@ -19,8 +19,10 @@ import lombok.Getter; import lombok.ToString; +import org.apache.shardingsphere.core.rule.DataNode; import org.apache.shardingsphere.core.strategy.route.value.RouteValue; +import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -35,4 +37,6 @@ public class ShardingCondition { private final List routeValues = new LinkedList<>(); + + private final Collection dataNodes = new LinkedList<>(); } diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/GeneratedKey.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/GeneratedKey.java index 8a2712bd6de8b..07ba68df32b7d 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/GeneratedKey.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/GeneratedKey.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import org.apache.shardingsphere.core.metadata.table.TableMetas; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment; @@ -28,7 +29,6 @@ import org.apache.shardingsphere.core.rule.ShardingRule; import java.util.Collection; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -54,60 +54,49 @@ public final class GeneratedKey { * Get generate key. * * @param shardingRule sharding rule + * @param tableMetas table metas * @param parameters SQL parameters * @param insertStatement insert statement - * @param columnNames column names * @return generate key */ - public static Optional getGenerateKey(final ShardingRule shardingRule, - final List parameters, final InsertStatement insertStatement, final Collection columnNames) { + public static Optional getGenerateKey(final ShardingRule shardingRule, final TableMetas tableMetas, final List parameters, final InsertStatement insertStatement) { Optional generateKeyColumnName = shardingRule.findGenerateKeyColumnName(insertStatement.getTable().getTableName()); if (!generateKeyColumnName.isPresent()) { return Optional.absent(); } - return containsGenerateKey(columnNames, insertStatement.getValueCountForPerGroup(), generateKeyColumnName.get()) - ? findGeneratedKey(parameters, insertStatement, columnNames, generateKeyColumnName.get()) - : Optional.of(createGeneratedKey(shardingRule, insertStatement, generateKeyColumnName.get())); + return Optional.of(containsGenerateKey(tableMetas, insertStatement, generateKeyColumnName.get()) + ? findGeneratedKey(tableMetas, parameters, insertStatement, generateKeyColumnName.get()) : createGeneratedKey(shardingRule, insertStatement, generateKeyColumnName.get())); } - private static boolean containsGenerateKey(final Collection columnNames, final int valueCountForPerGroup, final String generateKeyColumnName) { - return columnNames.contains(generateKeyColumnName) && columnNames.size() == valueCountForPerGroup; + private static boolean containsGenerateKey(final TableMetas tableMetas, final InsertStatement insertStatement, final String generateKeyColumnName) { + return insertStatement.getColumnNames().isEmpty() + ? tableMetas.getAllColumnNames(insertStatement.getTable().getTableName()).size() == insertStatement.getValueCountForPerGroup() + : insertStatement.getColumnNames().contains(generateKeyColumnName); } - private static Optional findGeneratedKey( - final List parameters, final InsertStatement insertStatement, final Collection columnNames, final String generateKeyColumnName) { - GeneratedKey result = null; - for (ExpressionSegment each : findGenerateKeyExpressions(insertStatement, columnNames, generateKeyColumnName)) { - if (null == result) { - result = new GeneratedKey(generateKeyColumnName, false); - } + private static GeneratedKey findGeneratedKey(final TableMetas tableMetas, final List parameters, final InsertStatement insertStatement, final String generateKeyColumnName) { + GeneratedKey result = new GeneratedKey(generateKeyColumnName, false); + for (ExpressionSegment each : findGenerateKeyExpressions(tableMetas, insertStatement, generateKeyColumnName)) { if (each instanceof ParameterMarkerExpressionSegment) { result.getGeneratedValues().add((Comparable) parameters.get(((ParameterMarkerExpressionSegment) each).getParameterMarkerIndex())); } else if (each instanceof LiteralExpressionSegment) { result.getGeneratedValues().add((Comparable) ((LiteralExpressionSegment) each).getLiterals()); } } - return Optional.fromNullable(result); + return result; } - private static Collection findGenerateKeyExpressions(final InsertStatement insertStatement, final Collection columnNames, final String generateKeyColumnName) { + private static Collection findGenerateKeyExpressions(final TableMetas tableMetas, final InsertStatement insertStatement, final String generateKeyColumnName) { Collection result = new LinkedList<>(); - for (Collection each : insertStatement.getAllValueExpressions()) { - Optional generateKeyExpression = findGenerateKeyExpression(columnNames.iterator(), generateKeyColumnName, each); - if (generateKeyExpression.isPresent()) { - result.add(generateKeyExpression.get()); - } + for (List each : insertStatement.getAllValueExpressions()) { + result.add(each.get(findGenerateKeyIndex(tableMetas, insertStatement, generateKeyColumnName.toLowerCase()))); } return result; } - private static Optional findGenerateKeyExpression(final Iterator columnNames, final String generateKeyColumnName, final Collection expressions) { - for (ExpressionSegment each : expressions) { - if (generateKeyColumnName.equalsIgnoreCase(columnNames.next())) { - return Optional.of(each); - } - } - return Optional.absent(); + private static int findGenerateKeyIndex(final TableMetas tableMetas, final InsertStatement insertStatement, final String generateKeyColumnName) { + return insertStatement.getColumnNames().isEmpty() + ? tableMetas.getAllColumnNames(insertStatement.getTable().getTableName()).indexOf(generateKeyColumnName) : insertStatement.getColumnNames().indexOf(generateKeyColumnName); } private static GeneratedKey createGeneratedKey(final ShardingRule shardingRule, final InsertStatement insertStatement, final String generateKeyColumnName) { diff --git a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/statement/dml/ShardingInsertOptimizedStatement.java b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/statement/dml/ShardingInsertOptimizedStatement.java index ebeea39c193f6..b4298c9b089c6 100644 --- a/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/statement/dml/ShardingInsertOptimizedStatement.java +++ b/sharding-core/sharding-core-optimize/src/main/java/org/apache/shardingsphere/core/optimize/sharding/statement/dml/ShardingInsertOptimizedStatement.java @@ -31,7 +31,6 @@ import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** @@ -49,13 +48,15 @@ public final class ShardingInsertOptimizedStatement extends ShardingConditionOpt private final GeneratedKey generatedKey; - private final List insertValues = new LinkedList<>(); + private final List insertValues; - public ShardingInsertOptimizedStatement(final SQLStatement sqlStatement, final List shardingConditions, final List columnNames, final GeneratedKey generatedKey) { + public ShardingInsertOptimizedStatement(final SQLStatement sqlStatement, final List shardingConditions, + final List columnNames, final GeneratedKey generatedKey, final List insertValues) { super(sqlStatement, new ShardingConditions(shardingConditions), new EncryptConditions(Collections.emptyList())); tables = new Tables(sqlStatement); this.columnNames = columnNames; this.generatedKey = generatedKey; + this.insertValues = insertValues; } /** diff --git a/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/InsertOptimizedStatementTest.java b/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/InsertOptimizedStatementTest.java index 26a4208d84f52..5bf9cce21e633 100644 --- a/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/InsertOptimizedStatementTest.java +++ b/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/InsertOptimizedStatementTest.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -36,18 +37,17 @@ public final class InsertOptimizedStatementTest { @Test public void assertAddInsertValueWithSet() { - ShardingInsertOptimizedStatement actual = new ShardingInsertOptimizedStatement( - new InsertStatement(), Collections.emptyList(), Arrays.asList("id", "value", "status"), null); ExpressionSegment assignment1 = new LiteralExpressionSegment(0, 0, 1); ExpressionSegment assignment2 = new ParameterMarkerExpressionSegment(0, 0, 1); ExpressionSegment assignment3 = new LiteralExpressionSegment(0, 0, "test"); - actual.getInsertValues().add(new InsertValue(Arrays.asList(assignment1, assignment2, assignment3), 1, Collections.singletonList("parameter"), 0)); + List insertValues = Collections.singletonList(new InsertValue(Arrays.asList(assignment1, assignment2, assignment3), 1, Collections.singletonList("parameter"), 0)); + ShardingInsertOptimizedStatement actual = new ShardingInsertOptimizedStatement( + new InsertStatement(), Collections.emptyList(), Arrays.asList("id", "value", "status"), null, insertValues); assertThat(actual.getInsertValues().get(0).getValueExpressions().size(), is(3)); assertThat(actual.getInsertValues().get(0).getValueExpressions().get(0), is(assignment1)); assertThat(actual.getInsertValues().get(0).getValueExpressions().get(1), is(assignment2)); assertThat(actual.getInsertValues().get(0).getValueExpressions().get(2), is(assignment3)); assertThat(actual.getInsertValues().get(0).getParameters().get(0), is((Object) "parameter")); - assertThat(actual.getInsertValues().get(0).getDataNodes().size(), is(0)); assertThat(actual.getInsertValues().get(0).getValue(1), is((Object) "parameter")); assertThat(actual.getInsertValues().get(0).getValue(2), is((Object) "test")); actual.getInsertValues().get(0).setValue(0, 2); diff --git a/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/keygen/GeneratedKeyTest.java b/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/keygen/GeneratedKeyTest.java index 308a828a04cad..8f19698cfe83a 100644 --- a/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/keygen/GeneratedKeyTest.java +++ b/sharding-core/sharding-core-optimize/src/test/java/org/apache/shardingsphere/core/optimize/sharding/segment/insert/keygen/GeneratedKeyTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.core.optimize.sharding.segment.insert.keygen; import com.google.common.base.Optional; +import org.apache.shardingsphere.core.metadata.table.TableMetas; import org.apache.shardingsphere.core.optimize.sharding.segment.insert.GeneratedKey; import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.InsertValuesSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.ColumnSegment; @@ -34,7 +35,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import java.util.Collection; import java.util.Collections; import static org.hamcrest.CoreMatchers.is; @@ -51,7 +51,8 @@ public final class GeneratedKeyTest { @Mock private ShardingRule shardingRule; - private final Collection columnNames = Collections.singletonList("id"); + @Mock + private TableMetas tableMetas; @Before public void setUp() { @@ -62,14 +63,14 @@ public void setUp() { @Test public void assertGetGenerateKeyWithoutGenerateKeyColumnConfiguration() { when(shardingRule.findGenerateKeyColumnName("tbl")).thenReturn(Optional.absent()); - assertFalse(GeneratedKey.getGenerateKey(shardingRule, Collections.singletonList(1), insertStatement, columnNames).isPresent()); + assertFalse(GeneratedKey.getGenerateKey(shardingRule, tableMetas, Collections.singletonList(1), insertStatement).isPresent()); } @Test public void assertGetGenerateKeyWhenCreateWithGenerateKeyColumnConfiguration() { insertStatement.getValues().add(new InsertValuesSegment(0, 0, Collections.singletonList(new LiteralExpressionSegment(0, 0, 1)))); when(shardingRule.findGenerateKeyColumnName("tbl")).thenReturn(Optional.of("id1")); - Optional actual = GeneratedKey.getGenerateKey(shardingRule, Collections.singletonList(1), insertStatement, columnNames); + Optional actual = GeneratedKey.getGenerateKey(shardingRule, tableMetas, Collections.singletonList(1), insertStatement); assertTrue(actual.isPresent()); assertThat(actual.get().getGeneratedValues().size(), is(1)); } @@ -81,12 +82,12 @@ public void assertGetGenerateKeyWhenFind() { insertStatement.getValues().add(new InsertValuesSegment(0, 0, Collections.singletonList(new LiteralExpressionSegment(1, 2, "value")))); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Collections.singletonList(new CommonExpressionSegment(1, 2, "ignored value")))); when(shardingRule.findGenerateKeyColumnName("tbl")).thenReturn(Optional.of("id")); - Optional actual = GeneratedKey.getGenerateKey(shardingRule, Collections.singletonList(1), insertStatement, columnNames); + Optional actual = GeneratedKey.getGenerateKey(shardingRule, tableMetas, Collections.singletonList(1), insertStatement); assertTrue(actual.isPresent()); assertThat(actual.get().getGeneratedValues().size(), is(3)); assertThat(actual.get().getGeneratedValues().get(0), is((Comparable) 1)); assertThat(actual.get().getGeneratedValues().get(1), is((Comparable) 100)); assertThat(actual.get().getGeneratedValues().get(2), is((Comparable) "value")); - assertTrue(GeneratedKey.getGenerateKey(shardingRule, Collections.singletonList(1), insertStatement, columnNames).isPresent()); + assertTrue(GeneratedKey.getGenerateKey(shardingRule, tableMetas, Collections.singletonList(1), insertStatement).isPresent()); } } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/core/extractor/impl/dml/insert/InsertValuesExtractor.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/core/extractor/impl/dml/insert/InsertValuesExtractor.java index fec7aef75de3b..9f4e0193f47af 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/core/extractor/impl/dml/insert/InsertValuesExtractor.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/core/extractor/impl/dml/insert/InsertValuesExtractor.java @@ -26,9 +26,11 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.InsertValuesSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; +import java.util.List; import java.util.Map; /** @@ -53,9 +55,10 @@ public Collection extract(final ParserRuleContext ancestorN return result; } - private Collection extractExpressionSegments(final ParserRuleContext assignmentValuesNode, final Map parameterMarkerIndexes) { - Collection result = new LinkedList<>(); - for (ParserRuleContext each : ExtractorUtils.getAllDescendantNodes(assignmentValuesNode, RuleName.ASSIGNMENT_VALUE)) { + private List extractExpressionSegments(final ParserRuleContext assignmentValuesNode, final Map parameterMarkerIndexes) { + Collection parserRuleContexts = ExtractorUtils.getAllDescendantNodes(assignmentValuesNode, RuleName.ASSIGNMENT_VALUE); + List result = new ArrayList<>(parserRuleContexts.size()); + for (ParserRuleContext each : parserRuleContexts) { Optional expressionSegment = expressionExtractor.extract(each, parameterMarkerIndexes); if (expressionSegment.isPresent()) { result.add(expressionSegment.get()); diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/segment/dml/assignment/InsertValuesSegment.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/segment/dml/assignment/InsertValuesSegment.java index f90bc158e5a20..8824864674246 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/segment/dml/assignment/InsertValuesSegment.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/segment/dml/assignment/InsertValuesSegment.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.SQLSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; -import java.util.Collection; +import java.util.List; /** * Insert values segment. @@ -38,5 +38,5 @@ public final class InsertValuesSegment implements SQLSegment { private final int stopIndex; - private final Collection values; + private final List values; } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/statement/dml/InsertStatement.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/statement/dml/InsertStatement.java index a5afdecb9bc43..cdf27dc0722d5 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/statement/dml/InsertStatement.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/sql/statement/dml/InsertStatement.java @@ -28,6 +28,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment; import org.apache.shardingsphere.core.parse.sql.statement.generic.TableSegmentAvailable; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; @@ -82,7 +83,7 @@ public List getColumnNames() { private List getColumnNamesForInsertColumns() { List result = new LinkedList<>(); for (ColumnSegment each : columns) { - result.add(each.getName()); + result.add(each.getName().toLowerCase()); } return result; } @@ -90,7 +91,7 @@ private List getColumnNamesForInsertColumns() { private List getColumnNamesForSetAssignment() { List result = new LinkedList<>(); for (AssignmentSegment each : setAssignment.getAssignments()) { - result.add(each.getColumn().getName()); + result.add(each.getColumn().getName().toLowerCase()); } return result; } @@ -124,20 +125,20 @@ public int getValueCountForPerGroup() { * * @return all value expressions */ - public Collection> getAllValueExpressions() { + public List> getAllValueExpressions() { return null == setAssignment ? getAllValueExpressionsFromValues() : Collections.singletonList(getAllValueExpressionsFromSetAssignment()); } - private Collection> getAllValueExpressionsFromValues() { - Collection> result = new LinkedList<>(); + private List> getAllValueExpressionsFromValues() { + List> result = new ArrayList<>(values.size()); for (InsertValuesSegment each : values) { result.add(each.getValues()); } return result; } - private Collection getAllValueExpressionsFromSetAssignment() { - List result = new LinkedList<>(); + private List getAllValueExpressionsFromSetAssignment() { + List result = new ArrayList<>(setAssignment.getAssignments().size()); for (AssignmentSegment each : setAssignment.getAssignments()) { result.add(each.getValue()); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java index 0fc35d35ab7f2..b497b56218c61 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java @@ -27,10 +27,10 @@ import org.apache.shardingsphere.core.optimize.sharding.constant.ShardingDerivedColumnType; import org.apache.shardingsphere.core.optimize.sharding.segment.insert.GeneratedKey; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingInsertOptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.BaseParameterBuilder; -import org.apache.shardingsphere.core.rewrite.builder.InsertParameterBuilder; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; -import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.standard.StandardParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.group.GroupedParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.sql.SQLBuilder; import org.apache.shardingsphere.core.rewrite.token.BaseTokenGenerateEngine; import org.apache.shardingsphere.core.rewrite.token.EncryptTokenGenerateEngine; import org.apache.shardingsphere.core.rewrite.token.ShardingTokenGenerateEngine; @@ -75,7 +75,9 @@ public SQLRewriteEngine(final ShardingRule shardingRule, baseRule = shardingRule; optimizedStatement = sqlRouteResult.getShardingStatement(); processGeneratedKey(); - encryptOptimizedStatement(shardingRule.getEncryptRule()); + if (optimizedStatement instanceof InsertOptimizedStatement && !shardingRule.getEncryptRule().getEncryptTableNames().isEmpty()) { + encryptInsertOptimizedStatement(shardingRule.getEncryptRule(), (InsertOptimizedStatement) optimizedStatement); + } parameterBuilder = createParameterBuilder(parameters, sqlRouteResult); sqlTokens = createSQLTokens(isSingleRoute, isQueryWithCipherColumn); sqlBuilder = new SQLBuilder(sql, sqlTokens); @@ -84,7 +86,9 @@ public SQLRewriteEngine(final ShardingRule shardingRule, public SQLRewriteEngine(final EncryptRule encryptRule, final EncryptOptimizedStatement encryptStatement, final String sql, final List parameters, final boolean isQueryWithCipherColumn) { baseRule = encryptRule; optimizedStatement = encryptStatement; - encryptOptimizedStatement(encryptRule); + if (optimizedStatement instanceof InsertOptimizedStatement && !encryptRule.getEncryptTableNames().isEmpty()) { + encryptInsertOptimizedStatement(encryptRule, (InsertOptimizedStatement) optimizedStatement); + } parameterBuilder = createParameterBuilder(parameters); sqlTokens = createSQLTokens(false, isQueryWithCipherColumn); sqlBuilder = new SQLBuilder(sql, sqlTokens); @@ -111,12 +115,6 @@ private void processGeneratedKey() { } } - private void encryptOptimizedStatement(final EncryptRule encryptRule) { - if (optimizedStatement instanceof InsertOptimizedStatement && !encryptRule.getEncryptTableNames().isEmpty()) { - encryptInsertOptimizedStatement(encryptRule, (InsertOptimizedStatement) optimizedStatement); - } - } - private void encryptInsertOptimizedStatement(final EncryptRule encryptRule, final InsertOptimizedStatement insertOptimizedStatement) { String tableName = insertOptimizedStatement.getTables().getSingleTableName(); Optional encryptTable = encryptRule.findEncryptTable(tableName); @@ -124,16 +122,21 @@ private void encryptInsertOptimizedStatement(final EncryptRule encryptRule, fina return; } for (String each : encryptTable.get().getLogicColumns()) { - int columnIndex = insertOptimizedStatement.getColumnNames().indexOf(each); Optional shardingEncryptor = encryptRule.findShardingEncryptor(tableName, each); if (shardingEncryptor.isPresent()) { - for (InsertValue insertValue : insertOptimizedStatement.getInsertValues()) { - encryptInsertValue(encryptRule, shardingEncryptor.get(), tableName, columnIndex, insertValue, each); - } + encryptInsertValues(encryptRule, shardingEncryptor.get(), insertOptimizedStatement, tableName, each); } } } + private void encryptInsertValues(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, + final InsertOptimizedStatement insertOptimizedStatement, final String tableName, final String encryptLogicColumnName) { + int columnIndex = insertOptimizedStatement.getColumnNames().indexOf(encryptLogicColumnName); + for (InsertValue each : insertOptimizedStatement.getInsertValues()) { + encryptInsertValue(encryptRule, shardingEncryptor, tableName, columnIndex, each, encryptLogicColumnName); + } + } + private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final InsertValue insertValue, final String encryptLogicColumnName) { Object originalValue = insertValue.getValue(columnIndex); @@ -149,17 +152,21 @@ private void encryptInsertValue(final EncryptRule encryptRule, final ShardingEnc } private ParameterBuilder createParameterBuilder(final List parameters, final SQLRouteResult sqlRouteResult) { - if (optimizedStatement instanceof InsertOptimizedStatement) { - return new InsertParameterBuilder(parameters, ((InsertOptimizedStatement) optimizedStatement).getInsertValues()); - } - return new BaseParameterBuilder(parameters, sqlRouteResult); + return optimizedStatement instanceof ShardingInsertOptimizedStatement + ? new GroupedParameterBuilder(parameters, getGroupedParameters(), ((ShardingInsertOptimizedStatement) optimizedStatement).getShardingConditions()) + : new StandardParameterBuilder(parameters, sqlRouteResult); } private ParameterBuilder createParameterBuilder(final List parameters) { - if (optimizedStatement instanceof InsertOptimizedStatement) { - return new InsertParameterBuilder(parameters, ((InsertOptimizedStatement) optimizedStatement).getInsertValues()); + return optimizedStatement instanceof InsertOptimizedStatement ? new GroupedParameterBuilder(parameters, getGroupedParameters(), null) : new StandardParameterBuilder(parameters); + } + + private List> getGroupedParameters() { + List> result = new LinkedList<>(); + for (InsertValue each : ((InsertOptimizedStatement) optimizedStatement).getInsertValues()) { + result.add(each.getParameters()); } - return new BaseParameterBuilder(parameters); + return result; } private List createSQLTokens(final boolean isSingleRoute, final boolean isQueryWithCipherColumn) { diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilder.java deleted file mode 100644 index 529d3cb30ffcd..0000000000000 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilder.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.core.rewrite.builder; - -import lombok.Getter; -import org.apache.shardingsphere.core.optimize.api.segment.InsertValue; -import org.apache.shardingsphere.core.route.type.RoutingUnit; -import org.apache.shardingsphere.core.rule.DataNode; - -import java.util.LinkedList; -import java.util.List; - -/** - * Insert parameter builder. - * - * @author panjuan - */ -@Getter -public final class InsertParameterBuilder implements ParameterBuilder { - - private final List originalParameters; - - private final List insertParameterUnits; - - public InsertParameterBuilder(final List parameters, final List insertValues) { - originalParameters = new LinkedList<>(parameters); - insertParameterUnits = createInsertParameterUnits(insertValues); - } - - private List createInsertParameterUnits(final List insertValues) { - List result = new LinkedList<>(); - for (InsertValue each : insertValues) { - result.add(new InsertParameterUnit(each.getParameters(), each.getDataNodes())); - } - return result; - } - - @Override - public List getParameters() { - List result = new LinkedList<>(); - for (InsertParameterUnit each : insertParameterUnits) { - result.addAll(each.getParameters()); - } - return result; - } - - @Override - public List getParameters(final RoutingUnit routingUnit) { - List result = new LinkedList<>(); - for (InsertParameterUnit each : insertParameterUnits) { - if (isAppendInsertParameter(each, routingUnit)) { - result.addAll(each.getParameters()); - } - } - return result; - } - - private boolean isAppendInsertParameter(final InsertParameterUnit unit, final RoutingUnit routingUnit) { - return unit.getDataNodes().isEmpty() || isInSameDataNode(unit, routingUnit); - } - - private boolean isInSameDataNode(final InsertParameterUnit unit, final RoutingUnit routingUnit) { - for (DataNode each : unit.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/builder/ParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/ParameterBuilder.java similarity index 95% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/ParameterBuilder.java index f094398c68220..1c056e66ea82b 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/ParameterBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.parameter; import org.apache.shardingsphere.core.route.type.RoutingUnit; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilder.java new file mode 100644 index 0000000000000..9755bb14d049b --- /dev/null +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilder.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.core.rewrite.builder.parameter.group; + +import lombok.Getter; +import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; +import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingConditions; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; +import org.apache.shardingsphere.core.route.type.RoutingUnit; +import org.apache.shardingsphere.core.rule.DataNode; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +/** + * Grouped Parameter builder. + * + * @author panjuan + * @author zhangliang + */ +public final class GroupedParameterBuilder implements ParameterBuilder { + + @Getter + private final List originalParameters; + + private final Collection parametersGroups; + + public GroupedParameterBuilder(final List originalParameters, final List> rewritedGroupedParameters, final ShardingConditions shardingConditions) { + this.originalParameters = new LinkedList<>(originalParameters); + parametersGroups = createParametersGroup(rewritedGroupedParameters, shardingConditions); + } + + private Collection createParametersGroup(final List> rewritedGroupedParameters, final ShardingConditions shardingConditions) { + Collection result = new LinkedList<>(); + Iterator shardingConditionIterator = null == shardingConditions ? null : shardingConditions.getConditions().iterator(); + for (List each : rewritedGroupedParameters) { + Collection dataNodes = null == shardingConditions ? Collections.emptyList() : shardingConditionIterator.next().getDataNodes(); + result.add(new ParametersGroup(each, dataNodes)); + } + return result; + } + + @Override + public List getParameters() { + List result = new LinkedList<>(); + for (ParametersGroup each : parametersGroups) { + result.addAll(each.getParameters()); + } + return result; + } + + @Override + public List getParameters(final RoutingUnit routingUnit) { + List result = new LinkedList<>(); + for (ParametersGroup each : parametersGroups) { + if (isAppendParameter(each, routingUnit)) { + result.addAll(each.getParameters()); + } + } + return result; + } + + private boolean isAppendParameter(final ParametersGroup parametersGroup, final RoutingUnit routingUnit) { + return parametersGroup.getDataNodes().isEmpty() || isInSameDataNode(parametersGroup, routingUnit); + } + + private boolean isInSameDataNode(final ParametersGroup parametersGroup, final RoutingUnit routingUnit) { + for (DataNode each : parametersGroup.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/builder/InsertParameterUnit.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/ParametersGroup.java similarity index 82% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterUnit.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/ParametersGroup.java index 4e6b3dcedf653..002024eee84d9 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterUnit.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/ParametersGroup.java @@ -15,24 +15,26 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.parameter.group; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.rule.DataNode; +import java.util.Collection; import java.util.List; /** - * Insert parameter unit. + * Parameters group. * * @author panjuan + * @author zhangliang */ @RequiredArgsConstructor @Getter -public final class InsertParameterUnit { +final class ParametersGroup { private final List parameters; - private final List dataNodes; + private final Collection dataNodes; } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilder.java similarity index 87% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilder.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilder.java index 7ed5945c3c25b..00301279ebb33 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilder.java @@ -15,12 +15,13 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.parameter.standard; import com.google.common.base.Optional; import lombok.Getter; import org.apache.shardingsphere.core.optimize.sharding.segment.select.pagination.Pagination; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.type.RoutingUnit; @@ -32,12 +33,12 @@ import java.util.TreeMap; /** - * Base parameter builder. + * standard parameter builder. * * @author panjuan */ @Getter -public final class BaseParameterBuilder implements ParameterBuilder { +public final class StandardParameterBuilder implements ParameterBuilder { private final List originalParameters = new LinkedList<>(); @@ -45,12 +46,12 @@ public final class BaseParameterBuilder implements ParameterBuilder { private final Map replacedIndexAndParameters = new HashMap<>(); - public BaseParameterBuilder(final List parameters) { - originalParameters.addAll(parameters); + public StandardParameterBuilder(final List originalParameters) { + this.originalParameters.addAll(originalParameters); } - public BaseParameterBuilder(final List parameters, final SQLRouteResult sqlRouteResult) { - this(parameters); + public StandardParameterBuilder(final List originalParameters, final SQLRouteResult sqlRouteResult) { + this(originalParameters); setReplacedIndexAndParameters(sqlRouteResult); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilder.java similarity index 98% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilder.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilder.java index b307c548ebbb0..2fa99ea28cf8a 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.sql; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.rewrite.token.pojo.Alterable; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java index 1f1704e7c305e..d440de09576af 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java @@ -19,7 +19,7 @@ import com.google.common.base.Optional; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.generator.CollectionSQLTokenGenerator; import org.apache.shardingsphere.core.rewrite.token.generator.IgnoreForSingleRoute; import org.apache.shardingsphere.core.rewrite.token.generator.OptionalSQLTokenGenerator; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/AggregationDistinctTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/AggregationDistinctTokenGenerator.java index 157aa17ff34f5..56664b93abe4d 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/AggregationDistinctTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/AggregationDistinctTokenGenerator.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationDistinctSelectItem; import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.DerivedColumn; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.AggregationDistinctToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/CollectionSQLTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/CollectionSQLTokenGenerator.java index 50fd628bb0034..527593d06505f 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/CollectionSQLTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/CollectionSQLTokenGenerator.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.core.rewrite.token.generator; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; import org.apache.shardingsphere.core.rule.BaseRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IndexTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IndexTokenGenerator.java index 0f68b80e2478e..ea9cfb64dde6e 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IndexTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IndexTokenGenerator.java @@ -20,7 +20,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.SQLSegment; import org.apache.shardingsphere.core.parse.sql.segment.ddl.index.IndexSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.IndexToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertCipherNameTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertCipherNameTokenGenerator.java index e16933d7e0897..267614b892b09 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertCipherNameTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertCipherNameTokenGenerator.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertCipherNameToken; import org.apache.shardingsphere.core.rule.EncryptRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertGeneratedKeyNameTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertGeneratedKeyNameTokenGenerator.java index 83d222d090cac..fece824c3c5e2 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertGeneratedKeyNameTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertGeneratedKeyNameTokenGenerator.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingInsertOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertGeneratedKeyNameToken; import org.apache.shardingsphere.core.rule.ShardingRule; @@ -36,17 +36,20 @@ public final class InsertGeneratedKeyNameTokenGenerator implements OptionalSQLTo public Optional generateSQLToken( final OptimizedStatement optimizedStatement, final ParameterBuilder parameterBuilder, final ShardingRule shardingRule, final boolean isQueryWithCipherColumn) { Optional insertColumnsSegment = optimizedStatement.getSQLStatement().findSQLSegment(InsertColumnsSegment.class); - if (!(optimizedStatement instanceof ShardingInsertOptimizedStatement && insertColumnsSegment.isPresent())) { + if (!insertColumnsSegment.isPresent() || insertColumnsSegment.get().getColumns().isEmpty()) { return Optional.absent(); } - return createInsertGeneratedKeyToken((ShardingInsertOptimizedStatement) optimizedStatement, insertColumnsSegment.get(), shardingRule); + if (optimizedStatement instanceof ShardingInsertOptimizedStatement) { + return createInsertGeneratedKeyToken((ShardingInsertOptimizedStatement) optimizedStatement, insertColumnsSegment.get(), shardingRule); + } + return Optional.absent(); } private Optional createInsertGeneratedKeyToken( final ShardingInsertOptimizedStatement optimizedStatement, final InsertColumnsSegment segment, final ShardingRule shardingRule) { String tableName = optimizedStatement.getTables().getSingleTableName(); Optional generatedKeyColumnName = shardingRule.findGenerateKeyColumnName(tableName); - return generatedKeyColumnName.isPresent() && !optimizedStatement.getColumnNames().contains(generatedKeyColumnName.get()) + return generatedKeyColumnName.isPresent() && optimizedStatement.getGeneratedKey().isPresent() && optimizedStatement.getGeneratedKey().get().isGenerated() ? Optional.of(new InsertGeneratedKeyNameToken(segment.getStopIndex(), generatedKeyColumnName.get(), isToAddCloseParenthesis(tableName, segment, shardingRule))) : Optional.absent(); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertQueryAndPlainNamesTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertQueryAndPlainNamesTokenGenerator.java index 1a38e32a7a2d5..4ead7115dfae5 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertQueryAndPlainNamesTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertQueryAndPlainNamesTokenGenerator.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.InsertOptimizedStatement; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertQueryAndPlainNamesToken; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertRegularNamesTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertRegularNamesTokenGenerator.java index aae4536166da5..6418d3804bade 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertRegularNamesTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertRegularNamesTokenGenerator.java @@ -20,10 +20,8 @@ import com.google.common.base.Optional; import org.apache.shardingsphere.core.optimize.api.statement.InsertOptimizedStatement; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; -import org.apache.shardingsphere.core.optimize.encrypt.statement.EncryptInsertOptimizedStatement; -import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingInsertOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertRegularNamesToken; import org.apache.shardingsphere.core.rule.BaseRule; import org.apache.shardingsphere.core.rule.EncryptRule; @@ -67,9 +65,7 @@ private Optional createInsertColumnsToken(final Optimiz private Collection getActualInsertColumns(final InsertOptimizedStatement optimizedStatement, final BaseRule baseRule) { Collection result = new LinkedList<>(); Map logicAndCipherColumns = getEncryptRule(baseRule).getLogicAndCipherColumns(optimizedStatement.getTables().getSingleTableName()); - Collection columnNames = optimizedStatement instanceof ShardingInsertOptimizedStatement - ? ((ShardingInsertOptimizedStatement) optimizedStatement).getColumnNames() : ((EncryptInsertOptimizedStatement) optimizedStatement).getColumnNames(); - for (String each : columnNames) { + for (String each : optimizedStatement.getColumnNames()) { result.add(getCipherColumn(each, logicAndCipherColumns)); } return result; @@ -89,14 +85,7 @@ private boolean isNeedToAppendColumns(final InsertOptimizedStatement optimizedSt } private boolean isNeedToAppendColumns(final InsertOptimizedStatement optimizedStatement, final ShardingRule shardingRule) { - return isNeedToAppendGeneratedKey(optimizedStatement, shardingRule) || isNeedToAppendAssistedQueryAndPlainColumns(optimizedStatement, shardingRule.getEncryptRule()); - } - - private boolean isNeedToAppendGeneratedKey(final InsertOptimizedStatement optimizedStatement, final ShardingRule shardingRule) { - Optional generateKeyColumnName = shardingRule.findGenerateKeyColumnName(optimizedStatement.getTables().getSingleTableName()); - Collection columnNames = optimizedStatement instanceof ShardingInsertOptimizedStatement - ? ((ShardingInsertOptimizedStatement) optimizedStatement).getColumnNames() : ((EncryptInsertOptimizedStatement) optimizedStatement).getColumnNames(); - return generateKeyColumnName.isPresent() && !columnNames.contains(generateKeyColumnName.get()); + return isNeedToAppendAssistedQueryAndPlainColumns(optimizedStatement, shardingRule.getEncryptRule()); } private boolean isNeedToAppendAssistedQueryAndPlainColumns(final OptimizedStatement optimizedStatement, final EncryptRule encryptRule) { diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetCipherColumnTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetCipherColumnTokenGenerator.java index 37c852793e8ef..b27c87771589f 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetCipherColumnTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetCipherColumnTokenGenerator.java @@ -25,7 +25,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment; import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetCipherColumnToken; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetGeneratedKeyColumnTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetGeneratedKeyColumnTokenGenerator.java index b61b8ee67a531..0ba3c9d615185 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetGeneratedKeyColumnTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetGeneratedKeyColumnTokenGenerator.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.SetAssignmentsSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetGeneratedKeyColumnToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetQueryAndPlainColumnsTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetQueryAndPlainColumnsTokenGenerator.java index 1012108a42fb5..4387c294bec83 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetQueryAndPlainColumnsTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertSetQueryAndPlainColumnsTokenGenerator.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.SetAssignmentsSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetQueryAndPlainColumnsToken; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertValuesTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertValuesTokenGenerator.java index b0b05c2cd92ec..09087857f7174 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertValuesTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/InsertValuesTokenGenerator.java @@ -21,13 +21,18 @@ import org.apache.shardingsphere.core.optimize.api.segment.InsertValue; import org.apache.shardingsphere.core.optimize.api.statement.InsertOptimizedStatement; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; +import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; +import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingInsertOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.InsertValuesSegment; import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertValuesToken; +import org.apache.shardingsphere.core.rule.DataNode; import org.apache.shardingsphere.core.rule.EncryptRule; import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; /** * Insert values token generator. @@ -50,8 +55,13 @@ private boolean isNeedToGenerateSQLToken(final OptimizedStatement optimizedState private InsertValuesToken createInsertValuesToken(final InsertOptimizedStatement optimizedStatement, final Collection insertValuesSegments) { InsertValuesToken result = new InsertValuesToken(getStartIndex(insertValuesSegments), getStopIndex(insertValuesSegments)); + Iterator shardingConditions = null; + if (optimizedStatement instanceof ShardingInsertOptimizedStatement) { + shardingConditions = ((ShardingInsertOptimizedStatement) optimizedStatement).getShardingConditions().getConditions().iterator(); + } for (InsertValue each : optimizedStatement.getInsertValues()) { - result.addInsertValueToken(each.getValueExpressions(), each.getDataNodes()); + Collection dataNodes = null == shardingConditions ? Collections.emptyList() : shardingConditions.next().getDataNodes(); + result.addInsertValueToken(each.getValueExpressions(), dataNodes); } return result; } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java index 6c0b985323e07..b3b4ecfc00274 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.optimize.sharding.segment.select.pagination.Pagination; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.NumberLiteralPaginationValueSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.OffsetToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OptionalSQLTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OptionalSQLTokenGenerator.java index aaf7c53fd82d5..016fe62b84017 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OptionalSQLTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OptionalSQLTokenGenerator.java @@ -19,7 +19,7 @@ import com.google.common.base.Optional; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; import org.apache.shardingsphere.core.rule.BaseRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OrderByTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OrderByTokenGenerator.java index ea3e72b36c1c0..1e8b60740a2c6 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OrderByTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OrderByTokenGenerator.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parse.core.constant.QuoteCharacter; import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.ColumnOrderByItemSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.ExpressionOrderByItemSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.OrderByToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RemoveTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RemoveTokenGenerator.java index 3aa53f273521e..43cd7d71d49db 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RemoveTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RemoveTokenGenerator.java @@ -20,7 +20,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.SQLSegment; import org.apache.shardingsphere.core.parse.sql.segment.generic.RemoveAvailable; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.RemoveToken; import org.apache.shardingsphere.core.rule.BaseRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java index e2442730e94dc..e329413bc2144 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.optimize.sharding.segment.select.pagination.Pagination; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.segment.dml.pagination.NumberLiteralPaginationValueSegment; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.RowCountToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectEncryptItemTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectEncryptItemTokenGenerator.java index ca8d1005ec3e9..60fb996ea1c05 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectEncryptItemTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectEncryptItemTokenGenerator.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemsSegment; import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment; import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.SelectEncryptItemToken; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemPrefixTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemPrefixTokenGenerator.java index 857992af24726..c5e02335ded76 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemPrefixTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemPrefixTokenGenerator.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItems; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemPrefixToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemsTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemsTokenGenerator.java index 790fa33053f2f..312c967cbed6b 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemsTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/SelectItemsTokenGenerator.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.DerivedSelectItem; import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItem; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemsToken; import org.apache.shardingsphere.core.rule.ShardingRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/TableTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/TableTokenGenerator.java index 584d161dba3cd..7c9ee57c69c68 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/TableTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/TableTokenGenerator.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.TableToken; import org.apache.shardingsphere.core.rule.BaseRule; import org.apache.shardingsphere.core.rule.MasterSlaveRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/UpdateEncryptColumnTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/UpdateEncryptColumnTokenGenerator.java index 71938eed0b54d..bdbce700adbc4 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/UpdateEncryptColumnTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/UpdateEncryptColumnTokenGenerator.java @@ -23,8 +23,8 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment; import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement; -import org.apache.shardingsphere.core.rewrite.builder.BaseParameterBuilder; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.standard.StandardParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.EncryptColumnToken; import org.apache.shardingsphere.core.rewrite.token.pojo.UpdateEncryptLiteralColumnToken; import org.apache.shardingsphere.core.rewrite.token.pojo.UpdateEncryptParameterColumnToken; @@ -86,14 +86,14 @@ private void addCipherValueToParameterBuilder(final ParameterBuilder parameterBu int valueIndex = ((ParameterMarkerExpressionSegment) assignmentSegment.getValue()).getParameterMarkerIndex(); Object originalValue = parameterBuilder.getOriginalParameters().get(valueIndex); Object cipherValue = encryptRule.getEncryptValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next(); - ((BaseParameterBuilder) parameterBuilder).getAddedIndexAndParameters().put(valueIndex + 1, cipherValue); + ((StandardParameterBuilder) parameterBuilder).getAddedIndexAndParameters().put(valueIndex + 1, cipherValue); } private void setCipherValueToParameterBuilder(final ParameterBuilder parameterBuilder, final EncryptRule encryptRule, final String tableName, final AssignmentSegment assignmentSegment) { int valueIndex = ((ParameterMarkerExpressionSegment) assignmentSegment.getValue()).getParameterMarkerIndex(); Object originalValue = parameterBuilder.getOriginalParameters().get(valueIndex); Object cipherValue = encryptRule.getEncryptValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next(); - ((BaseParameterBuilder) parameterBuilder).getReplacedIndexAndParameters().put(valueIndex, cipherValue); + ((StandardParameterBuilder) parameterBuilder).getReplacedIndexAndParameters().put(valueIndex, cipherValue); } private void addEncryptUpdateColumn(final ParameterBuilder parameterBuilder, final EncryptRule encryptRule, @@ -111,7 +111,7 @@ private void addEncryptColumnsToParameterBuilder(final ParameterBuilder paramete Object originalValue = parameterBuilder.getOriginalParameters().get(valueIndex); Object assistedQueryValue = encryptRule.getEncryptAssistedQueryValues( tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next(); - ((BaseParameterBuilder) parameterBuilder).getAddedIndexAndParameters().put(valueIndex + 2, assistedQueryValue); + ((StandardParameterBuilder) parameterBuilder).getAddedIndexAndParameters().put(valueIndex + 2, assistedQueryValue); } private EncryptColumnToken createUpdateEncryptLiteralColumnToken(final EncryptRule encryptRule, final String tableName, final AssignmentSegment assignmentSegment) { diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/WhereEncryptColumnTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/WhereEncryptColumnTokenGenerator.java index 5d8a1af3139e0..8d1cfaf3556ac 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/WhereEncryptColumnTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/WhereEncryptColumnTokenGenerator.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.ConditionOptimizedStatement; import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement; import org.apache.shardingsphere.core.optimize.encrypt.condition.EncryptCondition; -import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.token.pojo.EncryptColumnToken; import org.apache.shardingsphere.core.rewrite.token.pojo.WhereEncryptColumnToken; import org.apache.shardingsphere.core.rule.EncryptRule; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/pojo/InsertValuesToken.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/pojo/InsertValuesToken.java index 89c6e2603cb91..3f4896ef70a26 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/pojo/InsertValuesToken.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/pojo/InsertValuesToken.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.core.route.type.RoutingUnit; import org.apache.shardingsphere.core.rule.DataNode; +import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -55,7 +56,7 @@ public InsertValuesToken(final int startIndex, final int stopIndex) { * @param values values * @param dataNodes data nodes */ - public void addInsertValueToken(final List values, final List dataNodes) { + public void addInsertValueToken(final List values, final Collection dataNodes) { insertValueTokens.add(new InsertValueToken(values, dataNodes)); } @@ -93,7 +94,7 @@ private final class InsertValueToken { private final List values; @Getter - private final List dataNodes; + private final Collection dataNodes; @Override public String toString() { diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilderTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilderTest.java similarity index 50% rename from sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilderTest.java rename to sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilderTest.java index ac9cdd2c6b4f2..4d0142e1461da 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/InsertParameterBuilderTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/group/GroupedParameterBuilderTest.java @@ -15,9 +15,10 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.parameter.group; -import org.apache.shardingsphere.core.optimize.api.segment.InsertValue; +import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; +import org.apache.shardingsphere.core.optimize.sharding.segment.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; @@ -25,52 +26,50 @@ import org.junit.Test; import java.util.Arrays; -import java.util.Collections; +import java.util.LinkedList; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -public final class InsertParameterBuilderTest { +public final class GroupedParameterBuilderTest { - private InsertParameterBuilder insertParameterBuilder; + private GroupedParameterBuilder parameterBuilder; @Before public void setUp() { - insertParameterBuilder = new InsertParameterBuilder(Arrays.asList(1, 2), createInsertOptimizedStatement()); + parameterBuilder = new GroupedParameterBuilder(Arrays.asList(1, 2), createGroupedParameters(), createShardingConditions()); } - private List createInsertOptimizedStatement() { - InsertValue insertValue1 = mock(InsertValue.class); - when(insertValue1.getParameters()).thenReturn(Arrays.asList(3, 4)); - when(insertValue1.getDataNodes()).thenReturn(Collections.singletonList(new DataNode("db1.tb1"))); - InsertValue insertValue2 = mock(InsertValue.class); - when(insertValue2.getParameters()).thenReturn(Arrays.asList(5, 6)); - when(insertValue2.getDataNodes()).thenReturn(Collections.singletonList(new DataNode("db2.tb2"))); - return Arrays.asList(insertValue1, insertValue2); + private List> createGroupedParameters() { + List> result = new LinkedList<>(); + result.add(Arrays.asList(3, 4)); + 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(insertParameterBuilder.getParameters(), is(Arrays.asList(3, 4, 5, 6))); + 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(insertParameterBuilder.getParameters(routingUnit), is(Arrays.asList(3, 4))); + assertThat(parameterBuilder.getParameters(routingUnit), is(Arrays.asList(3, 4))); } @Test public void assertGetOriginalParameters() { - assertThat(insertParameterBuilder.getOriginalParameters(), is(Arrays.asList(1, 2))); - } - - @Test - public void assertGetInsertParameterUnits() { - assertThat(insertParameterBuilder.getInsertParameterUnits().size(), is(2)); + assertThat(parameterBuilder.getOriginalParameters(), is(Arrays.asList(1, 2))); } } diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilderTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilderTest.java similarity index 78% rename from sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilderTest.java rename to sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilderTest.java index d5a1bc32eee49..0d70094cd2023 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/BaseParameterBuilderTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/parameter/standard/StandardParameterBuilderTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.parameter.standard; import com.google.common.base.Optional; import org.apache.shardingsphere.core.optimize.encrypt.statement.EncryptOptimizedStatement; @@ -38,14 +38,14 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public final class BaseParameterBuilderTest { +public final class StandardParameterBuilderTest { - private BaseParameterBuilder baseParameterBuilder; + private StandardParameterBuilder parameterBuilder; @Before public void setUp() { - baseParameterBuilder = new BaseParameterBuilder(Arrays.asList(1, 2, 1, 5), createSQLRouteResult()); - baseParameterBuilder.getAddedIndexAndParameters().putAll(Collections.singletonMap(4, 7)); + parameterBuilder = new StandardParameterBuilder(Arrays.asList(1, 2, 1, 5), createSQLRouteResult()); + parameterBuilder.getAddedIndexAndParameters().putAll(Collections.singletonMap(4, 7)); } private SQLRouteResult createSQLRouteResult() { @@ -64,18 +64,18 @@ private SQLRouteResult createSQLRouteResult() { @Test public void assertGetParameters() { - assertThat(baseParameterBuilder.getParameters(), is(Arrays.asList(1, 2, 0L, 6L, 7))); - assertThat(baseParameterBuilder.getParameters(mock(RoutingUnit.class)), is(Arrays.asList(1, 2, 0L, 6L, 7))); + assertThat(parameterBuilder.getParameters(), is(Arrays.asList(1, 2, 0L, 6L, 7))); + assertThat(parameterBuilder.getParameters(mock(RoutingUnit.class)), is(Arrays.asList(1, 2, 0L, 6L, 7))); } @Test public void assertGetOriginalParameters() { - assertThat(baseParameterBuilder.getOriginalParameters(), is(Arrays.asList(1, 2, 1, 5))); + assertThat(parameterBuilder.getOriginalParameters(), is(Arrays.asList(1, 2, 1, 5))); } @Test public void assertGetAddedIndexAndParameters() { - assertThat(baseParameterBuilder.getAddedIndexAndParameters(), is(Collections.singletonMap(4, 7))); + assertThat(parameterBuilder.getAddedIndexAndParameters(), is(Collections.singletonMap(4, 7))); } @Test @@ -83,6 +83,6 @@ public void assertGetReplacedIndexAndParameters() { Map expected = new LinkedHashMap<>(); expected.put(2, 0L); expected.put(3, 6L); - assertThat(baseParameterBuilder.getReplacedIndexAndParameters(), is(expected)); + assertThat(parameterBuilder.getReplacedIndexAndParameters(), is(expected)); } } diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilderTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilderTest.java similarity index 97% rename from sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilderTest.java rename to sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilderTest.java index 1b30f951ca60a..1cd3587e0d6c6 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/SQLBuilderTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/builder/sql/SQLBuilderTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.builder; +package org.apache.shardingsphere.core.rewrite.builder.sql; import org.apache.shardingsphere.core.parse.core.constant.QuoteCharacter; import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriteEngineTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriteEngineTest.java index fce0d6c8a16ff..5b5389305b69d 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriteEngineTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriteEngineTest.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.core.optimize.encrypt.statement.EncryptTransparentOptimizedStatement; import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingConditions; +import org.apache.shardingsphere.core.optimize.sharding.segment.insert.GeneratedKey; import org.apache.shardingsphere.core.optimize.sharding.segment.select.groupby.GroupBy; import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationDistinctSelectItem; import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.AggregationSelectItem; @@ -65,7 +66,7 @@ import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.builder.BaseParameterBuilder; +import org.apache.shardingsphere.core.rewrite.builder.parameter.standard.StandardParameterBuilder; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.type.RoutingResult; import org.apache.shardingsphere.core.route.type.RoutingUnit; @@ -218,11 +219,15 @@ private SQLRouteResult createRouteResultForAutoGeneratedKeyColumn() { insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(30, 30, Collections.singleton(mock(ColumnSegment.class)))); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(39, 44, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new TableSegment(12, 18, "table_x")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Arrays.asList("name", "age"), null); - Collection assignments = Arrays.asList( - new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1), new ParameterMarkerExpressionSegment(0, 0, 2)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Arrays.asList("x", 1, 1), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + GeneratedKey generatedKey = new GeneratedKey("id", true); + generatedKey.getGeneratedValues().add(1); + Collection assignments = Arrays.asList(new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1)); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement( + insertStatement, new LinkedList(), Arrays.asList("name", "age"), + generatedKey, Collections.singletonList(new InsertValue(assignments, 0, Arrays.asList("x", 1), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -238,14 +243,20 @@ public void assertRewriteAutoGeneratedKeyColumnWithoutColumnsWithParameter() { private SQLRouteResult createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithParameter() { InsertStatement insertStatement = new InsertStatement(); insertStatement.getColumns().add(new ColumnSegment(0, 0, "name")); + insertStatement.getColumns().add(new ColumnSegment(0, 0, "id")); insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(21, 21, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(29, 31, Collections.emptyList())); insertStatement.setTable(new TableSegment(0, 0, "table_x")); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Collections.singletonList("name"), null); - Collection assignments = Arrays.asList(new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Arrays.asList("Bill", 1), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + GeneratedKey generatedKey = new GeneratedKey("id", true); + generatedKey.getGeneratedValues().add(1); + Collection assignments = Collections.singletonList(new ParameterMarkerExpressionSegment(0, 0, 0)); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement( + insertStatement, new LinkedList(), Arrays.asList("name", "id"), generatedKey, + Collections.singletonList(new InsertValue(assignments, 0, Collections.singletonList("Bill"), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -261,14 +272,19 @@ public void assertRewriteAutoGeneratedKeyColumnWithoutColumnsWithoutParameter() private SQLRouteResult createRouteResultForAutoGeneratedKeyColumnWithoutColumnsWithoutParameter() { InsertStatement insertStatement = new InsertStatement(); insertStatement.getColumns().add(new ColumnSegment(0, 0, "name")); + insertStatement.getColumns().add(new ColumnSegment(0, 0, "id")); insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(21, 21, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(29, 32, Collections.emptyList())); insertStatement.setTable(new TableSegment(0, 0, "table_x")); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Collections.singletonList("name"), null); - Collection assignments = Arrays.asList(new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Collections.emptyList(), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + GeneratedKey generatedKey = new GeneratedKey("id", true); + generatedKey.getGeneratedValues().add(1); + Collection assignments = Collections.singletonList(new LiteralExpressionSegment(0, 0, 10)); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, new LinkedList(), + Arrays.asList("name", "id"), generatedKey, Collections.singletonList(new InsertValue(assignments, 0, Collections.emptyList(), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -284,14 +300,19 @@ public void assertRewriteDuplicateKeyWithoutColumnsWithoutParameter() { private SQLRouteResult createRouteResultForDuplicateKeyWithoutColumnsWithoutParameter() { InsertStatement insertStatement = new InsertStatement(); insertStatement.getColumns().add(new ColumnSegment(0, 0, "name")); + insertStatement.getColumns().add(new ColumnSegment(0, 0, "id")); insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(21, 21, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(29, 32, Collections.emptyList())); insertStatement.setTable(new TableSegment(0, 0, "table_x")); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Collections.singletonList("name"), null); - Collection assignments = Arrays.asList(new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Collections.emptyList(), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + GeneratedKey generatedKey = new GeneratedKey("id", true); + generatedKey.getGeneratedValues().add(1); + Collection assignments = Collections.singletonList(new LiteralExpressionSegment(0, 0, 10)); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, new LinkedList(), Arrays.asList("name", "id"), + generatedKey, Collections.singletonList(new InsertValue(assignments, 0, Collections.emptyList(), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -310,10 +331,12 @@ private SQLRouteResult createRouteResultForDuplicateKeyWithSetWithoutParameter() insertStatement.getColumns().add(new ColumnSegment(0, 0, "id")); insertStatement.setTable(new TableSegment(0, 0, "table_x")); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Arrays.asList("name", "id"), null); Collection assignments = Arrays.asList(new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 1, Collections.emptyList(), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, new LinkedList(), + Arrays.asList("name", "id"), null, Collections.singletonList(new InsertValue(assignments, 1, Collections.emptyList(), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -333,10 +356,12 @@ private SQLRouteResult createRouteResultForColumnWithoutColumnsWithoutParameter( insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(21, 21, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(29, 35, Collections.emptyList())); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Arrays.asList("name", "id"), null); Collection assignments = Arrays.asList(new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Collections.emptyList(), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, new LinkedList(), + Arrays.asList("name", "id"), null, Collections.singletonList(new InsertValue(assignments, 0, Collections.emptyList(), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -351,14 +376,19 @@ public void assertRewriteColumnWithoutColumnsWithParameter() { private SQLRouteResult createRouteResultForColumnWithoutColumnsWithParameter() { InsertStatement insertStatement = new InsertStatement(); insertStatement.getColumns().add(new ColumnSegment(0, 0, "name")); + insertStatement.getColumns().add(new ColumnSegment(0, 0, "id")); insertStatement.getAllSQLSegments().add(new InsertColumnsSegment(21, 21, Collections.emptyList())); insertStatement.getAllSQLSegments().add(new InsertValuesSegment(29, 34, Collections.emptyList())); insertStatement.setTable(new TableSegment(0, 0, "table_x")); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_x`")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Collections.singletonList("name"), null); + GeneratedKey generatedKey = new GeneratedKey("id", false); + generatedKey.getGeneratedValues().add(1); Collection assignments = Arrays.asList(new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 0, Arrays.asList("x", 1), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, new LinkedList(), Arrays.asList("name", "id"), generatedKey, + Collections.singletonList(new InsertValue(assignments, 0, Arrays.asList("x", 1), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -821,7 +851,8 @@ private SQLRouteResult createSQLRouteResultForTableTokenWithSchemaForInsert() { InsertStatement insertStatement = new InsertStatement(); insertStatement.getAllSQLSegments().add(new TableSegment(12, 30, "table_x")); SQLRouteResult result = new SQLRouteResult(new ShardingInsertOptimizedStatement( - insertStatement, Collections.emptyList(), Arrays.asList("order_id", "user_id", "status", "id"), null), new EncryptTransparentOptimizedStatement(insertStatement)); + insertStatement, Collections.emptyList(), Arrays.asList("order_id", "user_id", "status", "id"), + null, Collections.emptyList()), new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; } @@ -957,10 +988,12 @@ private SQLRouteResult createSQLRouteResultForInsertWithQueryAssistedShardingEnc insertStatement.getAllSQLSegments().add(new SetAssignmentsSegment(26, 34, Collections.singleton(new AssignmentSegment(26, 34, columnSegment, expressionSegment)))); insertStatement.getAllSQLSegments().add(new TableSegment(12, 20, "`table_w`")); insertStatement.setTable(new TableSegment(0, 0, "table_w")); - ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement(insertStatement, Collections.emptyList(), Collections.singletonList("name"), null); Collection assignments = Arrays.asList(new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)); - shardingStatement.getInsertValues().add(new InsertValue(assignments, 3, Collections.emptyList(), 0)); - shardingStatement.getInsertValues().get(0).getDataNodes().add(new DataNode("db0.table_1")); + ShardingInsertOptimizedStatement shardingStatement = new ShardingInsertOptimizedStatement( + insertStatement, new LinkedList(), Collections.singletonList("name"), null, Collections.singletonList(new InsertValue(assignments, 3, Collections.emptyList(), 0))); + ShardingCondition shardingCondition = new ShardingCondition(); + shardingCondition.getDataNodes().add(new DataNode("db0.table_1")); + shardingStatement.getShardingConditions().getConditions().add(shardingCondition); SQLRouteResult result = new SQLRouteResult(shardingStatement, new EncryptTransparentOptimizedStatement(insertStatement)); result.setRoutingResult(new RoutingResult()); return result; @@ -1091,9 +1124,9 @@ private SQLRewriteEngine createSQLRewriteEngine(final SQLRouteResult routeResult } @SneakyThrows - private BaseParameterBuilder getParameterBuilder(final SQLRewriteEngine rewriteEngine) { + private StandardParameterBuilder getParameterBuilder(final SQLRewriteEngine rewriteEngine) { Field field = rewriteEngine.getClass().getDeclaredField("parameterBuilder"); field.setAccessible(true); - return (BaseParameterBuilder) field.get(rewriteEngine); + return (StandardParameterBuilder) field.get(rewriteEngine); } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/standard/StandardRoutingEngine.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/standard/StandardRoutingEngine.java index 8b633f44db5d6..838a267a9a823 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/standard/StandardRoutingEngine.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/standard/StandardRoutingEngine.java @@ -22,10 +22,8 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.api.hint.HintManager; import org.apache.shardingsphere.core.exception.ShardingException; -import org.apache.shardingsphere.core.optimize.api.segment.InsertValue; import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition; import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingConditionOptimizedStatement; -import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingInsertOptimizedStatement; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.DeleteStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement; @@ -116,7 +114,7 @@ private Collection routeByShardingConditionsWithCondition(final TableR for (ShardingCondition each : optimizedStatement.getShardingConditions().getConditions()) { Collection dataNodes = route0(tableRule, getShardingValuesFromShardingConditions(shardingRule.getDatabaseShardingStrategy(tableRule).getShardingColumns(), each), getShardingValuesFromShardingConditions(shardingRule.getTableShardingStrategy(tableRule).getShardingColumns(), each)); - reviseInsertValue(each, dataNodes); + each.getDataNodes().addAll(dataNodes); result.addAll(dataNodes); } return result; @@ -130,7 +128,7 @@ private Collection routeByMixedConditionsWithCondition(final TableRule Collection result = new LinkedList<>(); for (ShardingCondition each : optimizedStatement.getShardingConditions().getConditions()) { Collection dataNodes = route0(tableRule, getDatabaseShardingValues(tableRule, each), getTableShardingValues(tableRule, each)); - reviseInsertValue(each, dataNodes); + each.getDataNodes().addAll(dataNodes); result.addAll(dataNodes); } return result; @@ -213,25 +211,4 @@ private Collection routeTables(final TableRule tableRule, final String } return result; } - - private void reviseInsertValue(final ShardingCondition shardingCondition, final Collection dataNodes) { - if (optimizedStatement instanceof ShardingInsertOptimizedStatement) { - for (InsertValue each : ((ShardingInsertOptimizedStatement) optimizedStatement).getInsertValues()) { - if (match((ShardingInsertOptimizedStatement) optimizedStatement, each, shardingCondition)) { - each.getDataNodes().addAll(dataNodes); - } - } - } - } - - private boolean match(final ShardingInsertOptimizedStatement insertOptimizedStatement, final InsertValue insertValue, final ShardingCondition shardingCondition) { - for (RouteValue each : shardingCondition.getRouteValues()) { - Object value = insertOptimizedStatement.getGeneratedKey().isPresent() && insertOptimizedStatement.getGeneratedKey().get().isGenerated() - ? insertOptimizedStatement.getGeneratedKey().get().getGeneratedValues().getLast() : insertValue.getValue(insertOptimizedStatement.getColumnNames().indexOf(each.getColumnName())); - if (!value.equals(((ListRouteValue) each).getValues().iterator().next())) { - return false; - } - } - return true; - } }