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

Merge pull request #2501 from tristaZero/dev

Split InsertSetAddItemsToken
......@@ -103,7 +103,7 @@ public abstract class BaseShardingEngine {
private Collection<RouteUnit> rewriteAndConvert(final List<Object> parameters, final SQLRouteResult sqlRouteResult) {
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, sqlRouteResult.getSqlStatement(), parameters);
ShardingSQLRewriter shardingSQLRewriter = new ShardingSQLRewriter(shardingRule, databaseType, sqlRouteResult);
ShardingSQLRewriter shardingSQLRewriter = new ShardingSQLRewriter(shardingRule, databaseType, sqlRouteResult, sqlRouteResult.getOptimizeResult());
EncryptSQLRewriter encryptSQLRewriter = new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), sqlRouteResult.getSqlStatement(), sqlRouteResult.getOptimizeResult());
rewriteEngine.init(shardingSQLRewriter, encryptSQLRewriter);
Collection<RouteUnit> result = new LinkedHashSet<>();
......
......@@ -17,26 +17,17 @@
package org.apache.shardingsphere.core.parse.filler.encrypt.dml;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.filler.api.EncryptRuleAwareFiller;
import org.apache.shardingsphere.core.parse.filler.api.SQLSegmentFiller;
import org.apache.shardingsphere.core.parse.sql.context.condition.Column;
import org.apache.shardingsphere.core.parse.sql.context.insertvalue.InsertValue;
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.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetAddItemsToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetEncryptValueToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
......@@ -46,9 +37,7 @@ import java.util.List;
* @author zhangliang
*/
@Setter
public final class EncryptSetAssignmentsFiller implements SQLSegmentFiller<SetAssignmentsSegment>, EncryptRuleAwareFiller {
private EncryptRule encryptRule;
public final class EncryptSetAssignmentsFiller implements SQLSegmentFiller<SetAssignmentsSegment> {
@Override
public void fill(final SetAssignmentsSegment sqlSegment, final SQLStatement sqlStatement) {
......@@ -66,45 +55,16 @@ public final class EncryptSetAssignmentsFiller implements SQLSegmentFiller<SetAs
InsertValue insertValue = getInsertValue(sqlSegment, insertStatement);
insertStatement.getValues().add(insertValue);
insertStatement.setParametersIndex(insertValue.getParametersCount());
fillWithInsertSetAddItemsToken(insertStatement, sqlSegment);
}
private InsertValue getInsertValue(final SetAssignmentsSegment sqlSegment, final InsertStatement insertStatement) {
List<ExpressionSegment> columnValues = new LinkedList<>();
for (AssignmentSegment each : sqlSegment.getAssignments()) {
columnValues.add(each.getValue());
fillWithInsertSetEncryptValueToken(insertStatement, each, each.getValue());
}
return new InsertValue(columnValues);
}
private void fillWithInsertSetEncryptValueToken(final InsertStatement insertStatement, final AssignmentSegment segment, final ExpressionSegment columnValue) {
Optional<ShardingEncryptor> shardingEncryptor = encryptRule.getEncryptorEngine().getShardingEncryptor(insertStatement.getTables().getSingleTableName(), segment.getColumn().getName());
if (shardingEncryptor.isPresent() && !(columnValue instanceof ParameterMarkerExpressionSegment)) {
insertStatement.getSQLTokens().add(new InsertSetEncryptValueToken(segment.getValue().getStartIndex(), segment.getValue().getStopIndex(), segment.getColumn().getName()));
}
}
private void fillWithInsertSetAddItemsToken(final InsertStatement insertStatement, final SetAssignmentsSegment sqlSegment) {
Collection<String> columnNames = getQueryAssistedColumn(insertStatement);
if (columnNames.isEmpty()) {
return;
}
List<AssignmentSegment> assignments = new ArrayList<>(sqlSegment.getAssignments());
insertStatement.getSQLTokens().add(new InsertSetAddItemsToken(assignments.get(assignments.size() - 1).getStopIndex() + 1, columnNames));
}
private Collection<String> getQueryAssistedColumn(final InsertStatement insertStatement) {
Collection<String> result = new LinkedList<>();
for (String each : insertStatement.getColumnNames()) {
Optional<String> assistedColumnName = encryptRule.getEncryptorEngine().getAssistedQueryColumn(insertStatement.getTables().getSingleTableName(), each);
if (assistedColumnName.isPresent()) {
result.add(assistedColumnName.get());
}
}
return result;
}
private void fillUpdate(final SetAssignmentsSegment sqlSegment, final UpdateStatement updateStatement) {
String tableName = updateStatement.getTables().getSingleTableName();
for (AssignmentSegment each : sqlSegment.getAssignments()) {
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.core.parse.filler.encrypt.dml.insert;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.filler.api.EncryptRuleAwareFiller;
import org.apache.shardingsphere.core.parse.filler.api.SQLSegmentFiller;
......@@ -25,7 +24,6 @@ import org.apache.shardingsphere.core.parse.sql.context.insertvalue.InsertValue;
import org.apache.shardingsphere.core.parse.sql.segment.dml.InsertValuesSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertValuesToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.Collection;
......@@ -53,7 +51,6 @@ public final class EncryptInsertValuesFiller implements SQLSegmentFiller<InsertV
private void reviseInsertStatement(final InsertStatement insertStatement, final InsertValuesSegment sqlSegment) {
reviseInsertColumnNames(insertStatement);
setNeededToAppendAssistedColumns(insertStatement);
fillWithInsertValuesToken(insertStatement, sqlSegment);
}
......@@ -67,16 +64,4 @@ public final class EncryptInsertValuesFiller implements SQLSegmentFiller<InsertV
insertStatement.setNeededToAppendAssistedColumns(true);
}
}
private void fillWithInsertValuesToken(final InsertStatement insertStatement, final InsertValuesSegment sqlSegment) {
Optional<InsertValuesToken> insertValuesToken = insertStatement.findSQLToken(InsertValuesToken.class);
if (insertValuesToken.isPresent()) {
int startIndex = insertValuesToken.get().getStartIndex() < sqlSegment.getStartIndex() ? insertValuesToken.get().getStartIndex() : sqlSegment.getStartIndex();
int stopIndex = insertValuesToken.get().getStopIndex() > sqlSegment.getStopIndex() ? insertValuesToken.get().getStopIndex() : sqlSegment.getStopIndex();
insertStatement.getSQLTokens().remove(insertValuesToken.get());
insertStatement.getSQLTokens().add(new InsertValuesToken(startIndex, stopIndex));
} else {
insertStatement.getSQLTokens().add(new InsertValuesToken(sqlSegment.getStartIndex(), sqlSegment.getStopIndex()));
}
}
}
......@@ -31,7 +31,6 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.SimpleEx
import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.PredicateSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertValuesToken;
import org.apache.shardingsphere.core.rule.ShardingRule;
import java.util.ArrayList;
......@@ -87,7 +86,6 @@ public final class ShardingInsertValuesFiller implements SQLSegmentFiller<Insert
reviseInsertColumnNames(insertStatement, sqlSegment);
setNeededToAppendGeneratedKey(insertStatement);
setNeededToAppendAssistedColumns(insertStatement);
fillWithInsertValuesToken(insertStatement, sqlSegment);
}
private void reviseInsertColumnNames(final InsertStatement insertStatement, final InsertValuesSegment sqlSegment) {
......@@ -123,16 +121,4 @@ public final class ShardingInsertValuesFiller implements SQLSegmentFiller<Insert
}
return result;
}
private void fillWithInsertValuesToken(final InsertStatement insertStatement, final InsertValuesSegment sqlSegment) {
Optional<InsertValuesToken> insertValuesToken = insertStatement.findSQLToken(InsertValuesToken.class);
if (insertValuesToken.isPresent()) {
int startIndex = insertValuesToken.get().getStartIndex() < sqlSegment.getStartIndex() ? insertValuesToken.get().getStartIndex() : sqlSegment.getStartIndex();
int stopIndex = insertValuesToken.get().getStopIndex() > sqlSegment.getStopIndex() ? insertValuesToken.get().getStopIndex() : sqlSegment.getStopIndex();
insertStatement.getSQLTokens().remove(insertValuesToken.get());
insertStatement.getSQLTokens().add(new InsertValuesToken(startIndex, stopIndex));
} else {
insertStatement.getSQLTokens().add(new InsertValuesToken(sqlSegment.getStartIndex(), sqlSegment.getStopIndex()));
}
}
}
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.core.parse.filler.sharding.dml.update;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData;
import org.apache.shardingsphere.core.parse.exception.SQLParsingException;
......@@ -31,19 +30,13 @@ import org.apache.shardingsphere.core.parse.sql.context.insertvalue.InsertValue;
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.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.SimpleExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.PredicateSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetAddItemsToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetEncryptValueToken;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
......@@ -86,50 +79,11 @@ public final class ShardingSetAssignmentsFiller implements SQLSegmentFiller<SetA
fillShardingCondition(andCondition, columnNames.next(), insertStatement.getTables().getSingleTableName(), null, (SimpleExpressionSegment) each.getValue());
}
columnValues.add(each.getValue());
fillWithInsertSetEncryptValueToken(insertStatement, each, each.getValue());
}
InsertValue insertValue = new InsertValue(columnValues);
insertStatement.getValues().add(insertValue);
insertStatement.getRouteCondition().getOrConditions().add(andCondition);
insertStatement.setParametersIndex(insertValue.getParametersCount());
fillWithInsertSetAddItemsToken(insertStatement, sqlSegment);
}
private void fillWithInsertSetEncryptValueToken(final InsertStatement insertStatement, final AssignmentSegment segment, final ExpressionSegment expressionSegment) {
Optional<ShardingEncryptor> shardingEncryptor =
shardingRule.getEncryptRule().getEncryptorEngine().getShardingEncryptor(insertStatement.getTables().getSingleTableName(), segment.getColumn().getName());
if (shardingEncryptor.isPresent() && !(expressionSegment instanceof ParameterMarkerExpressionSegment)) {
insertStatement.getSQLTokens().add(new InsertSetEncryptValueToken(segment.getValue().getStartIndex(), segment.getValue().getStopIndex(), segment.getColumn().getName()));
}
}
private void fillWithInsertSetAddItemsToken(final InsertStatement insertStatement, final SetAssignmentsSegment sqlSegment) {
Collection<String> columnNames = getQueryAssistedColumn(insertStatement);
if (getGeneratedKeyColumn(insertStatement).isPresent()) {
columnNames.add(getGeneratedKeyColumn(insertStatement).get());
}
if (columnNames.isEmpty()) {
return;
}
List<AssignmentSegment> assignments = new ArrayList<>(sqlSegment.getAssignments());
insertStatement.getSQLTokens().add(new InsertSetAddItemsToken(assignments.get(assignments.size() - 1).getStopIndex() + 1, columnNames));
}
private Optional<String> getGeneratedKeyColumn(final InsertStatement insertStatement) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<String> generateKeyColumn = shardingRule.findGenerateKeyColumnName(tableName);
return generateKeyColumn.isPresent() && !insertStatement.getColumnNames().contains(generateKeyColumn.get()) ? generateKeyColumn : Optional.<String>absent();
}
private Collection<String> getQueryAssistedColumn(final InsertStatement insertStatement) {
Collection<String> result = new LinkedList<>();
for (String each : insertStatement.getColumnNames()) {
Optional<String> assistedColumnName = shardingRule.getEncryptRule().getEncryptorEngine().getAssistedQueryColumn(insertStatement.getTables().getSingleTableName(), each);
if (assistedColumnName.isPresent()) {
result.add(assistedColumnName.get());
}
}
return result;
}
private int getColumnCountExcludeAssistedQueryColumns(final InsertStatement insertStatement) {
......
......@@ -68,17 +68,6 @@ public abstract class AbstractSQLStatement implements SQLStatement {
sqlTokens.add(sqlToken);
}
@Override
@SuppressWarnings("unchecked")
public final <T extends SQLToken> Optional<T> findSQLToken(final Class<T> sqlTokenType) {
for (SQLToken each : sqlTokens) {
if (each.getClass().equals(sqlTokenType)) {
return Optional.of((T) each);
}
}
return Optional.absent();
}
@Override
public final List<SQLToken> getSQLTokens() {
Collections.sort(sqlTokens);
......@@ -95,4 +84,16 @@ public abstract class AbstractSQLStatement implements SQLStatement {
}
return Optional.absent();
}
@Override
@SuppressWarnings("unchecked")
public final <T extends SQLSegment> Collection<T> findSQLSegments(final Class<T> sqlSegmentType) {
Collection<T> result = new LinkedList<>();
for (SQLSegment each : sqlSegments) {
if (each.getClass().equals(sqlSegmentType)) {
result.add((T) each);
}
}
return result;
}
}
......@@ -76,15 +76,6 @@ public interface SQLStatement {
*/
void addSQLToken(SQLToken sqlToken);
/**
* Find SQL token.
*
* @param sqlTokenType SQL token type
* @param <T> type of SQL token
* @return SQL token
*/
<T extends SQLToken> Optional<T> findSQLToken(Class<T> sqlTokenType);
/**
* Get SQL tokens.
*
......@@ -128,4 +119,13 @@ public interface SQLStatement {
* @return SQL segment
*/
<T extends SQLSegment> Optional<T> findSQLSegment(Class<T> sqlSegmentType);
/**
* Find SQL segment.
*
* @param sqlSegmentType SQL segment type
* @param <T> type of SQL segment
* @return SQL segments
*/
<T extends SQLSegment> Collection<T> findSQLSegments(Class<T> sqlSegmentType);
}
......@@ -26,7 +26,6 @@ import org.apache.shardingsphere.core.parse.integrate.asserts.meta.TableMetaData
import org.apache.shardingsphere.core.parse.integrate.asserts.orderby.OrderByAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.table.AlterTableAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.table.TableAssert;
import org.apache.shardingsphere.core.parse.integrate.asserts.token.TokenAssert;
import org.apache.shardingsphere.core.parse.integrate.jaxb.root.ParserResult;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.AlterTableStatement;
......@@ -54,8 +53,6 @@ public final class SQLStatementAssert {
private final ConditionAssert conditionAssert;
private final TokenAssert tokenAssert;
private final IndexAssert indexAssert;
private final ItemAssert itemAssert;
......@@ -83,7 +80,6 @@ public final class SQLStatementAssert {
expected = parserResultSetLoader.getParserResult(sqlCaseId);
tableAssert = new TableAssert(assertMessage);
conditionAssert = new ConditionAssert(assertMessage);
tokenAssert = new TokenAssert(sqlCaseType, assertMessage);
indexAssert = new IndexAssert(sqlCaseType, assertMessage);
itemAssert = new ItemAssert(assertMessage);
groupByAssert = new GroupByAssert(assertMessage);
......@@ -103,7 +99,6 @@ public final class SQLStatementAssert {
if ("MySQL".equals(databaseType)) {
conditionAssert.assertConditions(actual.getEncryptCondition(), expected.getEncryptCondition());
}
tokenAssert.assertTokens(actual.getSQLTokens(), expected.getTokens());
indexAssert.assertParametersIndex(actual.getParametersIndex(), expected.getParameters().size());
if (actual instanceof SelectStatement) {
assertSelectStatement((SelectStatement) actual);
......
/*
* 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.parse.integrate.asserts.token;
import com.google.common.base.Optional;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.integrate.asserts.SQLStatementAssertMessage;
import org.apache.shardingsphere.core.parse.integrate.jaxb.token.ExpectedInsertValuesToken;
import org.apache.shardingsphere.core.parse.integrate.jaxb.token.ExpectedTokens;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertValuesToken;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
/**
* Multiple insert values token assert.
*
* @author maxiaoguang
*/
@RequiredArgsConstructor
final class InsertValuesTokenAssert {
private final SQLStatementAssertMessage assertMessage;
void assertInsertValuesToken(final Collection<SQLToken> actual, final ExpectedTokens expected) {
Optional<InsertValuesToken> insertValuesToken = getInsertValuesToken(actual);
if (insertValuesToken.isPresent()) {
assertInsertValuesToken(insertValuesToken.get(), expected.getInsertValuesToken());
} else {
assertNull(assertMessage.getFullAssertMessage("Insert values token should not exist: "), expected.getInsertValuesToken());
}
}
private void assertInsertValuesToken(final InsertValuesToken actual, final ExpectedInsertValuesToken expected) {
assertThat(assertMessage.getFullAssertMessage("Insert values token begin position assertion error: "), actual.getStartIndex(), is(expected.getBeginPosition()));
}
private Optional<InsertValuesToken> getInsertValuesToken(final Collection<SQLToken> actual) {
for (SQLToken each : actual) {
if (each instanceof InsertValuesToken) {
return Optional.of((InsertValuesToken) each);
}
}
return Optional.absent();
}
}
/*
* 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.parse.integrate.jaxb.token;
import lombok.Getter;
import lombok.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public final class ExpectedInsertValuesToken {
@XmlAttribute(name = "begin-position")
private int beginPosition;
}
......@@ -40,9 +40,6 @@ public final class ExpectedTokens {
@XmlElement(name = "generated-key-token")
private ExpectedGeneratedKeyToken generatedKeyToken;
@XmlElement(name = "insert-values-token")
private ExpectedInsertValuesToken insertValuesToken;
@XmlElement(name = "insert-set-token")
private ExpectedInsertSetToken insertSetToken;
......
......@@ -23,7 +23,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -43,7 +42,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="67" />
</tokens>
<or-condition>
<and-condition>
......@@ -63,7 +61,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -83,7 +80,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -111,7 +107,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" left-delimiter="`" right-delimiter="`" length="9" />
<insert-values-token begin-position="63" />
</tokens>
<or-condition>
<and-condition>
......@@ -131,7 +126,6 @@
</tables>
<tokens>
<table-token start-index="33" table-name="t_order" length="7" />
<insert-values-token begin-position="76" />
</tokens>
<or-condition>
<and-condition>
......@@ -154,7 +148,6 @@
<table-token start-index="21" table-name="t_order" length="7" />
<table-token start-index="39" table-name="t_order" length="7" />
<table-token start-index="56" table-name="t_order" length="7" />
<insert-values-token begin-position="79" />
</tokens>
<or-condition>
<and-condition>
......@@ -174,7 +167,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="27" />
</tokens>
<or-condition>
<and-condition>
......@@ -214,7 +206,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -254,7 +245,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order_item" length="12" />
<insert-values-token begin-position="83" />
</tokens>
<or-condition>
<and-condition>
......@@ -277,7 +267,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order_item" length="12" />
<insert-values-token begin-position="74" />
</tokens>
<or-condition>
<and-condition>
......@@ -340,7 +329,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -386,7 +374,6 @@
<!--<table-token start-index="21" table-name="t_order" length="7" />-->
<!--<table-token start-index="39" table-name="t_order" length="7" />-->
<!--<table-token start-index="56" table-name="t_order" length="7" />-->
<!--<insert-values-token begin-position="79" table-name="t_order"/>-->
<!--<table-token start-index="113" table-name="t_order" length="7" />-->
<!--<table-token start-index="137" table-name="t_order" length="7" />-->
<!--</tokens>-->
......@@ -408,7 +395,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -436,7 +422,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order" length="7" />
<insert-values-token begin-position="55" />
</tokens>
<or-condition>
<and-condition>
......@@ -464,7 +449,6 @@
<!--</tables>-->
<!--<tokens>-->
<!--<table-token start-index="12" table-name="t_order" length="7" />-->
<!--<insert-values-token begin-position="55" table-name="t_order"/>-->
<!--</tokens>-->
<!--<or-condition>-->
<!--<and-condition>-->
......@@ -492,7 +476,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order_item" length="12" />
<insert-values-token begin-position="83" />
</tokens>
<or-condition>
<and-condition>
......@@ -526,7 +509,6 @@
<!--</tables>-->
<!--<tokens>-->
<!--<table-token start-index="12" table-name="t_order_item" length="12" />-->
<!--<insert-values-token begin-position="74" table-name="t_order_item"/>-->
<!--</tokens>-->
<!--<or-condition>-->
<!--<and-condition>-->
......@@ -554,7 +536,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_place" length="7" />
<insert-values-token begin-position="64" />
</tokens>
<or-condition>
<and-condition>
......@@ -574,7 +555,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order_item" length="12" />
<insert-values-token begin-position="31" />
</tokens>
<or-condition>
<and-condition>
......@@ -597,7 +577,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_order_item" length="12" />
<insert-values-token begin-position="31" />
</tokens>
<or-condition>
<and-condition>
......@@ -627,7 +606,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_auto_increment_table" length="22" />
<insert-values-token begin-position="41" />
</tokens>
<or-condition>
<and-condition/>
......@@ -639,7 +617,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_double_test" length="13" />
<insert-values-token begin-position="38" />
</tokens>
<or-condition>
<and-condition/>
......@@ -652,7 +629,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_null_value_test" length="17" />
<insert-values-token begin-position="42" />
</tokens>
<or-condition>
<and-condition/>
......@@ -665,7 +641,6 @@
</tables>
<tokens>
<table-token start-index="12" table-name="t_blob_value_test" length="17" />
<insert-values-token begin-position="42" />
</tokens>
<or-condition>
<and-condition/>
......
/*
* 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.placeholder;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.complex.ComplexExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
/**
* Insert set add items placeholder for rewrite.
*
* @author panjuan
*/
@RequiredArgsConstructor
public final class InsertSetAddGeneratedKeyPlaceholder implements ShardingPlaceholder {
private final String columnName;
private final ExpressionSegment columnValue;
@Override
public String toString() {
return String.format(", %s = %s", columnName, getColumnValue());
}
private String getColumnValue() {
if (columnValue instanceof ParameterMarkerExpressionSegment) {
return "?";
} else if (columnValue instanceof LiteralExpressionSegment) {
Object literals = ((LiteralExpressionSegment) columnValue).getLiterals();
return literals instanceof String ? String.format("'%s'", literals) : literals.toString();
}
return ((ComplexExpressionSegment) columnValue).getText();
}
}
......@@ -20,7 +20,7 @@ package org.apache.shardingsphere.core.rewrite.rewriter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
import org.apache.shardingsphere.core.rewrite.token.pojo.Substitutable;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder;
......
......@@ -31,9 +31,9 @@ import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertAssistedColumnsToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetAddItemsToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertSetEncryptValueToken;
import org.apache.shardingsphere.core.parse.sql.token.impl.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddAssistedColumnsToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetEncryptValueToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder;
import org.apache.shardingsphere.core.rewrite.placeholder.InsertAssistedColumnsPlaceholder;
......@@ -119,8 +119,8 @@ public final class EncryptSQLRewriter implements SQLRewriter {
appendInsertValuesPlaceholder(sqlBuilder, insertOptimizeResult);
} else if (sqlToken instanceof InsertSetEncryptValueToken) {
appendInsertSetEncryptValuePlaceholder(sqlBuilder, (InsertSetEncryptValueToken) sqlToken, insertOptimizeResult);
} else if (sqlToken instanceof InsertSetAddItemsToken) {
appendInsertSetAddItemsPlaceholder(sqlBuilder, (InsertSetAddItemsToken) sqlToken, insertOptimizeResult);
} else if (sqlToken instanceof InsertSetAddAssistedColumnsToken) {
appendInsertSetAddItemsPlaceholder(sqlBuilder, (InsertSetAddAssistedColumnsToken) sqlToken, insertOptimizeResult);
} else if (sqlToken instanceof InsertAssistedColumnsToken) {
appendInsertAssistedColumnsPlaceholder(sqlBuilder, (InsertAssistedColumnsToken) sqlToken);
} else if (sqlToken instanceof EncryptColumnToken) {
......@@ -140,12 +140,12 @@ public final class EncryptSQLRewriter implements SQLRewriter {
sqlBuilder.appendPlaceholder(new InsertSetEncryptValuePlaceholder(insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(insertSetEncryptValueToken.getColumnName())));
}
private void appendInsertSetAddItemsPlaceholder(final SQLBuilder sqlBuilder, final InsertSetAddItemsToken insertSetAddItemsToken, final InsertOptimizeResult insertOptimizeResult) {
private void appendInsertSetAddItemsPlaceholder(final SQLBuilder sqlBuilder, final InsertSetAddAssistedColumnsToken insertSetAddAssistedColumnsToken, final InsertOptimizeResult insertOptimizeResult) {
List<ExpressionSegment> columnValues = new LinkedList<>();
for (String each : insertSetAddItemsToken.getColumnNames()) {
for (String each : insertSetAddAssistedColumnsToken.getColumnNames()) {
columnValues.add(insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(each));
}
sqlBuilder.appendPlaceholder(new InsertSetAddItemsPlaceholder(new LinkedList<>(insertSetAddItemsToken.getColumnNames()), columnValues));
sqlBuilder.appendPlaceholder(new InsertSetAddItemsPlaceholder(new LinkedList<>(insertSetAddAssistedColumnsToken.getColumnNames()), columnValues));
}
private void appendInsertAssistedColumnsPlaceholder(final SQLBuilder sqlBuilder, final InsertAssistedColumnsToken insertAssistedColumnsToken) {
......
......@@ -17,21 +17,22 @@
package org.apache.shardingsphere.core.rewrite.rewriter;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.constant.DatabaseType;
import org.apache.shardingsphere.core.optimize.result.OptimizeResult;
import org.apache.shardingsphere.core.optimize.result.insert.InsertOptimizeResult;
import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.OrderByItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.TextOrderByItemSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertGeneratedKeyToken;
import org.apache.shardingsphere.core.rewrite.placeholder.InsertGeneratedKeyPlaceholder;
import org.apache.shardingsphere.core.rewrite.token.pojo.OffsetToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.RowCountToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddGeneratedKeyToken;
import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder;
import org.apache.shardingsphere.core.rewrite.placeholder.AggregationDistinctPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.IndexPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.InsertGeneratedKeyPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.InsertSetAddGeneratedKeyPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.LimitOffsetPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.LimitRowCountPlaceholder;
import org.apache.shardingsphere.core.rewrite.placeholder.OrderByPlaceholder;
......@@ -40,7 +41,10 @@ import org.apache.shardingsphere.core.rewrite.placeholder.SelectItemsPlaceholder
import org.apache.shardingsphere.core.rewrite.placeholder.TablePlaceholder;
import org.apache.shardingsphere.core.rewrite.token.pojo.AggregationDistinctToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.IndexToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertGeneratedKeyToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.OffsetToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.OrderByToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.RowCountToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemPrefixToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.SelectItemsToken;
import org.apache.shardingsphere.core.rewrite.token.pojo.TableToken;
......@@ -55,7 +59,6 @@ import org.apache.shardingsphere.core.rule.ShardingRule;
* @author maxiaoguang
* @author panjuan
*/
@RequiredArgsConstructor
public final class ShardingSQLRewriter implements SQLRewriter {
private final ShardingRule shardingRule;
......@@ -64,6 +67,26 @@ public final class ShardingSQLRewriter implements SQLRewriter {
private final SQLRouteResult sqlRouteResult;
private final InsertOptimizeResult insertOptimizeResult;
public ShardingSQLRewriter(final ShardingRule shardingRule, final DatabaseType databaseType, final SQLRouteResult sqlRouteResult, final OptimizeResult optimizeResult) {
this.shardingRule = shardingRule;
this.databaseType = databaseType;
this.sqlRouteResult = sqlRouteResult;
this.insertOptimizeResult = getInsertOptimizeResult(optimizeResult);
}
private InsertOptimizeResult getInsertOptimizeResult(final OptimizeResult optimizeResult) {
if (null == optimizeResult) {
return null;
}
Optional<InsertOptimizeResult> insertOptimizeResult = optimizeResult.getInsertOptimizeResult();
if (!insertOptimizeResult.isPresent()) {
return null;
}
return insertOptimizeResult.get();
}
@Override
public void rewrite(final SQLBuilder sqlBuilder, final ParameterBuilder parameterBuilder, final SQLToken sqlToken) {
if (sqlToken instanceof SelectItemPrefixToken) {
......@@ -84,6 +107,8 @@ public final class ShardingSQLRewriter implements SQLRewriter {
appendAggregationDistinctPlaceholder(sqlBuilder, (AggregationDistinctToken) sqlToken);
} else if (sqlToken instanceof InsertGeneratedKeyToken) {
appendInsertGeneratedKeyPlaceholder(sqlBuilder, (InsertGeneratedKeyToken) sqlToken);
} else if (sqlToken instanceof InsertSetAddGeneratedKeyToken) {
appendInsertSetAddGeneratedKeyPlaceholder(sqlBuilder, (InsertSetAddGeneratedKeyToken) sqlToken, insertOptimizeResult);
}
}
......@@ -161,6 +186,11 @@ public final class ShardingSQLRewriter implements SQLRewriter {
sqlBuilder.appendPlaceholder(new InsertGeneratedKeyPlaceholder(insertGeneratedKeyToken.getColumn(), insertGeneratedKeyToken.isToAddCloseParenthesis()));
}
private void appendInsertSetAddGeneratedKeyPlaceholder(final SQLBuilder sqlBuilder, final InsertSetAddGeneratedKeyToken insertSetAddGeneratedKeyToken, final InsertOptimizeResult insertOptimizeResult) {
String columnName = insertSetAddGeneratedKeyToken.getColumnName();
sqlBuilder.appendPlaceholder(new InsertSetAddGeneratedKeyPlaceholder(columnName, insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(columnName)));
}
private boolean isRewrite() {
return !sqlRouteResult.getRoutingResult().isSingleRouting();
}
......
......@@ -18,6 +18,7 @@
package org.apache.shardingsphere.core.rewrite.token;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertValuesTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.SQLTokenGenerator;
import org.apache.shardingsphere.core.rule.BaseRule;
......@@ -35,6 +36,7 @@ public final class BaseTokenGenerateEngine extends SQLTokenGenerateEngine<BaseRu
static {
SQL_TOKEN_GENERATORS.add(new InsertColumnsTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertValuesTokenGenerator());
}
@Override
......
......@@ -19,6 +19,8 @@ package org.apache.shardingsphere.core.rewrite.token;
import org.apache.shardingsphere.core.rewrite.token.generator.EncryptColumnTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertAssistedColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertSetAddAssistedColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertSetEncryptValueTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.SQLTokenGenerator;
import org.apache.shardingsphere.core.rule.EncryptRule;
......@@ -37,6 +39,8 @@ public final class EncryptTokenGenerateEngine extends SQLTokenGenerateEngine<Enc
static {
SQL_TOKEN_GENERATORS.add(new EncryptColumnTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertAssistedColumnsTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertSetEncryptValueTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertSetAddAssistedColumnsTokenGenerator());
}
@Override
......
......@@ -20,6 +20,7 @@ package org.apache.shardingsphere.core.rewrite.token;
import org.apache.shardingsphere.core.rewrite.token.generator.AggregationDistinctTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.IndexTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertGeneratedKeyTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.InsertSetAddGeneratedKeyTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.OffsetTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.OrderByTokenGenerator;
import org.apache.shardingsphere.core.rewrite.token.generator.RemoveTokenGenerator;
......@@ -53,6 +54,7 @@ public final class ShardingTokenGenerateEngine extends SQLTokenGenerateEngine<Sh
SQL_TOKEN_GENERATORS.add(new OffsetTokenGenerator());
SQL_TOKEN_GENERATORS.add(new RowCountTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertGeneratedKeyTokenGenerator());
SQL_TOKEN_GENERATORS.add(new InsertSetAddGeneratedKeyTokenGenerator());
}
@Override
......
/*
* 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.token.generator;
import com.google.common.base.Optional;
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.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddAssistedColumnsToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
/**
* Insert set add items token generator.
*
* @author panjuan
*/
public final class InsertSetAddAssistedColumnsTokenGenerator implements OptionalSQLTokenGenerator<EncryptRule> {
@Override
public Optional<InsertSetAddAssistedColumnsToken> generateSQLToken(final SQLStatement sqlStatement, final EncryptRule encryptRule) {
Optional<SetAssignmentsSegment> setAssignmentsSegment = sqlStatement.findSQLSegment(SetAssignmentsSegment.class);
if (!(sqlStatement instanceof InsertStatement && setAssignmentsSegment.isPresent())) {
return Optional.absent();
}
return createInsertSetAddItemsToken((InsertStatement) sqlStatement, encryptRule, setAssignmentsSegment.get());
}
private Optional<InsertSetAddAssistedColumnsToken> createInsertSetAddItemsToken(final InsertStatement insertStatement, final EncryptRule encryptRule, final SetAssignmentsSegment segment) {
Collection<String> columnNames = getQueryAssistedColumn(insertStatement, encryptRule);
if (columnNames.isEmpty()) {
return Optional.absent();
}
List<AssignmentSegment> assignments = new ArrayList<>(segment.getAssignments());
return Optional.of(new InsertSetAddAssistedColumnsToken(assignments.get(assignments.size() - 1).getStopIndex() + 1, columnNames));
}
private Collection<String> getQueryAssistedColumn(final InsertStatement insertStatement, final EncryptRule encryptRule) {
Collection<String> result = new LinkedList<>();
for (String each : insertStatement.getColumnNames()) {
Optional<String> assistedColumnName = encryptRule.getEncryptorEngine().getAssistedQueryColumn(insertStatement.getTables().getSingleTableName(), each);
if (assistedColumnName.isPresent()) {
result.add(assistedColumnName.get());
}
}
return result;
}
}
/*
* 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.token.generator;
import com.google.common.base.Optional;
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.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddGeneratedKeyToken;
import org.apache.shardingsphere.core.rule.ShardingRule;
import java.util.ArrayList;
import java.util.List;
/**
* Insert set add items token generator.
*
* @author panjuan
*/
public final class InsertSetAddGeneratedKeyTokenGenerator implements OptionalSQLTokenGenerator<ShardingRule> {
@Override
public Optional<InsertSetAddGeneratedKeyToken> generateSQLToken(final SQLStatement sqlStatement, final ShardingRule shardingRule) {
Optional<SetAssignmentsSegment> setAssignmentsSegment = sqlStatement.findSQLSegment(SetAssignmentsSegment.class);
if (!(sqlStatement instanceof InsertStatement && setAssignmentsSegment.isPresent())) {
return Optional.absent();
}
return createInsertSetAddGeneratedKeyToken((InsertStatement) sqlStatement, shardingRule, setAssignmentsSegment.get());
}
private Optional<InsertSetAddGeneratedKeyToken> createInsertSetAddGeneratedKeyToken(final InsertStatement insertStatement, final ShardingRule shardingRule, final SetAssignmentsSegment segment) {
Optional<String> generatedKeyColumn = getGeneratedKeyColumn(insertStatement, shardingRule);
if (generatedKeyColumn.isPresent()) {
List<AssignmentSegment> assignments = new ArrayList<>(segment.getAssignments());
return Optional.of(new InsertSetAddGeneratedKeyToken(assignments.get(assignments.size() - 1).getStopIndex() + 1, generatedKeyColumn.get()));
}
return Optional.absent();
}
private Optional<String> getGeneratedKeyColumn(final InsertStatement insertStatement, final ShardingRule shardingRule) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<String> generateKeyColumn = shardingRule.findGenerateKeyColumnName(tableName);
return generateKeyColumn.isPresent() && !insertStatement.getColumnNames().contains(generateKeyColumn.get()) ? generateKeyColumn : Optional.<String>absent();
}
}
/*
* 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.token.generator;
import com.google.common.base.Optional;
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.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetEncryptValueToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
/**
* Insert set encrypt value token generator.
*
* @author panjuan
*/
public final class InsertSetEncryptValueTokenGenerator implements CollectionSQLTokenGenerator<EncryptRule> {
@Override
public Collection<InsertSetEncryptValueToken> generateSQLTokens(final SQLStatement sqlStatement, final EncryptRule encryptRule) {
Optional<SetAssignmentsSegment> setAssignmentsSegment = sqlStatement.findSQLSegment(SetAssignmentsSegment.class);
if (!(sqlStatement instanceof InsertStatement && setAssignmentsSegment.isPresent())) {
return Collections.emptyList();
}
return createInsertSetEncryptValueTokens((InsertStatement) sqlStatement, encryptRule, setAssignmentsSegment.get());
}
private Collection<InsertSetEncryptValueToken> createInsertSetEncryptValueTokens(final InsertStatement insertStatement, final EncryptRule encryptRule, final SetAssignmentsSegment segment) {
Collection<InsertSetEncryptValueToken> result = new LinkedList<>();
for (AssignmentSegment each : segment.getAssignments()) {
Optional<InsertSetEncryptValueToken> insertSetEncryptValueToken = getInsertSetEncryptValueToken(insertStatement, encryptRule, each);
if (insertSetEncryptValueToken.isPresent()) {
result.add(insertSetEncryptValueToken.get());
}
}
return result;
}
private Optional<InsertSetEncryptValueToken> getInsertSetEncryptValueToken(final InsertStatement insertStatement, final EncryptRule encryptRule, final AssignmentSegment segment) {
Optional<ShardingEncryptor> shardingEncryptor = encryptRule.getEncryptorEngine().getShardingEncryptor(insertStatement.getTables().getSingleTableName(), segment.getColumn().getName());
if (shardingEncryptor.isPresent() && !(segment.getValue() instanceof ParameterMarkerExpressionSegment)) {
return Optional.of(new InsertSetEncryptValueToken(segment.getValue().getStartIndex(), segment.getValue().getStopIndex(), segment.getColumn().getName()));
}
return Optional.absent();
}
}
......@@ -15,36 +15,40 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.integrate.asserts.token;
package org.apache.shardingsphere.core.rewrite.token.generator;
import org.apache.shardingsphere.core.parse.integrate.asserts.SQLStatementAssertMessage;
import org.apache.shardingsphere.core.parse.integrate.jaxb.token.ExpectedTokens;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.test.sql.SQLCaseType;
import com.google.common.base.Optional;
import org.apache.shardingsphere.core.parse.sql.segment.dml.InsertValuesSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.token.pojo.InsertValuesToken;
import org.apache.shardingsphere.core.rule.BaseRule;
import java.util.Collection;
/**
* Token assert.
* Insert values token generator.
*
* @author zhangliang
* @author panjuan
*/
public final class TokenAssert {
public final class InsertValuesTokenGenerator implements OptionalSQLTokenGenerator<BaseRule> {
private final InsertValuesTokenAssert insertValuesTokenAssert;
public TokenAssert(final SQLCaseType sqlCaseType, final SQLStatementAssertMessage assertMessage) {
insertValuesTokenAssert = new InsertValuesTokenAssert(assertMessage);
@Override
public Optional<InsertValuesToken> generateSQLToken(final SQLStatement sqlStatement, final BaseRule baseRule) {
Collection<InsertValuesSegment> insertValuesSegments = sqlStatement.findSQLSegments(InsertValuesSegment.class);
if (!(sqlStatement instanceof InsertStatement) || insertValuesSegments.isEmpty()) {
return Optional.absent();
}
return createInsertValuesToken(insertValuesSegments);
}
/**
* Assert tokens.
*
* @param actual actual tokens
* @param expected expected tokens
*/
public void assertTokens(final Collection<SQLToken> actual, final ExpectedTokens expected) {
// TODO do not assert table token and index, will assert table segment in future
insertValuesTokenAssert.assertInsertValuesToken(actual, expected);
private Optional<InsertValuesToken> createInsertValuesToken(final Collection<InsertValuesSegment> insertValuesSegments) {
int startIndex = insertValuesSegments.iterator().next().getStartIndex();
int stopIndex = insertValuesSegments.iterator().next().getStopIndex();
for (InsertValuesSegment each : insertValuesSegments) {
startIndex = startIndex > each.getStartIndex() ? each.getStartIndex() : startIndex;
stopIndex = stopIndex < each.getStopIndex() ? each.getStopIndex() : stopIndex;
}
return Optional.of(new InsertValuesToken(startIndex, stopIndex));
}
}
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import com.google.common.base.Optional;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Aggregation distinct token.
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.token;
package org.apache.shardingsphere.core.rewrite.token.pojo;
/**
* Attach available.
......
......@@ -21,7 +21,6 @@ import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.context.condition.Column;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Encrypt column token.
......
......@@ -21,7 +21,6 @@ import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.constant.QuoteCharacter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Index token.
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import java.util.Collection;
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import java.util.Collection;
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
/**
......
......@@ -15,10 +15,9 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.token.impl;
package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import java.util.Collection;
......@@ -29,11 +28,11 @@ import java.util.Collection;
* @author panjuan
*/
@Getter
public final class InsertSetAddItemsToken extends SQLToken implements Attachable {
public final class InsertSetAddAssistedColumnsToken extends SQLToken implements Attachable {
private final Collection<String> columnNames;
public InsertSetAddItemsToken(final int startIndex, final Collection<String> columnNames) {
public InsertSetAddAssistedColumnsToken(final int startIndex, final Collection<String> columnNames) {
super(startIndex);
this.columnNames = columnNames;
}
......
/*
* 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.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
/**
* Insert set add generated key token.
*
* @author panjuan
*/
@Getter
public final class InsertSetAddGeneratedKeyToken extends SQLToken implements Attachable {
private final String columnName;
public InsertSetAddGeneratedKeyToken(final int startIndex, final String columnName) {
super(startIndex);
this.columnName = columnName;
}
}
......@@ -15,11 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.token.impl;
package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Insert set encrypt value token.
......
......@@ -15,11 +15,10 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.token.impl;
package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Insert values token.
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Offset token for limit.
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.core.rewrite.token.pojo;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
/**
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Remove token.
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
/**
* Row count token for limit.
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
/**
......
......@@ -20,7 +20,6 @@ package org.apache.shardingsphere.core.rewrite.token.pojo;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.sql.token.Attachable;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import java.util.Collection;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.parse.sql.token;
package org.apache.shardingsphere.core.rewrite.token.pojo;
/**
* Substitute available.
......
......@@ -21,7 +21,6 @@ import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.parse.constant.QuoteCharacter;
import org.apache.shardingsphere.core.parse.sql.token.SQLToken;
import org.apache.shardingsphere.core.parse.sql.token.Substitutable;
import org.apache.shardingsphere.core.parse.util.SQLUtil;
/**
......
......@@ -30,6 +30,7 @@ import org.apache.shardingsphere.core.parse.sql.context.condition.Column;
import org.apache.shardingsphere.core.parse.sql.context.condition.Condition;
import org.apache.shardingsphere.core.parse.sql.context.table.Table;
import org.apache.shardingsphere.core.parse.sql.segment.common.TableSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.InsertValuesSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.SelectItemsSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.AssignmentSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.SetAssignmentsSegment;
......@@ -49,7 +50,6 @@ import org.apache.shardingsphere.core.parse.sql.statement.dml.DeleteStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
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.parse.sql.token.impl.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine;
import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder;
......@@ -179,9 +179,9 @@ public final class ShardingSQLRewriterTest {
insertStatement.getColumnNames().add("age");
insertStatement.setNeededToAppendGeneratedKey(true);
insertStatement.getSqlSegments().add(new InsertColumnsSegment(30, 30, Collections.singleton(mock(ColumnSegment.class))));
insertStatement.getSqlSegments().add(new InsertValuesSegment(39, 44, Collections.<ExpressionSegment>emptyList()));
insertStatement.setParametersIndex(2);
insertStatement.addSQLToken(new TableToken(12, 18, "table_x", QuoteCharacter.NONE));
insertStatement.addSQLToken(new InsertValuesToken(39, 44));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "age", "id"));
Object[] parameters = {"x", 1, 1};
ExpressionSegment[] expressionSegments = {new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1), new ParameterMarkerExpressionSegment(0, 0, 2)};
......@@ -202,10 +202,10 @@ public final class ShardingSQLRewriterTest {
insertStatement.getColumnNames().add("name");
insertStatement.setNeededToAppendGeneratedKey(true);
insertStatement.getSqlSegments().add(new InsertColumnsSegment(21, 21, Collections.<ColumnSegment>emptyList()));
insertStatement.getSqlSegments().add(new InsertValuesSegment(29, 31, Collections.<ExpressionSegment>emptyList()));
insertStatement.getTables().add(new Table("table_x", null));
insertStatement.setParametersIndex(1);
insertStatement.addSQLToken(new TableToken(12, 20, "`table_x`", QuoteCharacter.BACK_QUOTE));
insertStatement.addSQLToken(new InsertValuesToken(29, 31));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id"));
Object[] parameters = {"Bill", 1};
ExpressionSegment[] expressionSegments = {new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1)};
......@@ -226,9 +226,9 @@ public final class ShardingSQLRewriterTest {
insertStatement.getColumnNames().add("name");
insertStatement.setNeededToAppendGeneratedKey(true);
insertStatement.getSqlSegments().add(new InsertColumnsSegment(21, 21, Collections.<ColumnSegment>emptyList()));
insertStatement.getSqlSegments().add(new InsertValuesSegment(29, 32, Collections.<ExpressionSegment>emptyList()));
insertStatement.getTables().add(new Table("table_x", null));
insertStatement.addSQLToken(new TableToken(12, 20, "`table_x`", QuoteCharacter.BACK_QUOTE));
insertStatement.addSQLToken(new InsertValuesToken(29, 32));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id"));
ExpressionSegment[] expressionSegments = {new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)};
insertOptimizeResult.addUnit(expressionSegments, new Object[0], 0);
......@@ -248,9 +248,9 @@ public final class ShardingSQLRewriterTest {
insertStatement.getColumnNames().add("name");
insertStatement.setNeededToAppendGeneratedKey(true);
insertStatement.getSqlSegments().add(new InsertColumnsSegment(21, 21, Collections.<ColumnSegment>emptyList()));
insertStatement.getSqlSegments().add(new InsertValuesSegment(29, 32, Collections.<ExpressionSegment>emptyList()));
insertStatement.getTables().add(new Table("table_x", null));
insertStatement.addSQLToken(new TableToken(12, 20, "`table_x`", QuoteCharacter.BACK_QUOTE));
insertStatement.addSQLToken(new InsertValuesToken(29, 32));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id"));
ExpressionSegment[] expressionSegments = {new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)};
insertOptimizeResult.addUnit(expressionSegments, new Object[0], 0);
......@@ -294,8 +294,8 @@ public final class ShardingSQLRewriterTest {
parameters.add("x");
parameters.add(1);
insertStatement.addSQLToken(new TableToken(12, 20, "`table_x`", QuoteCharacter.BACK_QUOTE));
insertStatement.addSQLToken(new InsertValuesToken(29, 35));
insertStatement.getSqlSegments().add(new InsertColumnsSegment(21, 21, Collections.<ColumnSegment>emptyList()));
insertStatement.getSqlSegments().add(new InsertValuesSegment(29, 35, Collections.<ExpressionSegment>emptyList()));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id"));
ExpressionSegment[] expressionSegments = {new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1)};
insertOptimizeResult.addUnit(expressionSegments, new Object[0], 0);
......@@ -315,9 +315,9 @@ public final class ShardingSQLRewriterTest {
insertStatement.getColumnNames().add("name");
insertStatement.setNeededToAppendGeneratedKey(true);
insertStatement.getSqlSegments().add(new InsertColumnsSegment(21, 21, Collections.<ColumnSegment>emptyList()));
insertStatement.getSqlSegments().add(new InsertValuesSegment(29, 34, Collections.<ExpressionSegment>emptyList()));
insertStatement.getTables().add(new Table("table_x", null));
insertStatement.addSQLToken(new TableToken(12, 20, "`table_x`", QuoteCharacter.BACK_QUOTE));
insertStatement.addSQLToken(new InsertValuesToken(29, 34));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id"));
ExpressionSegment[] expressionSegments = {new ParameterMarkerExpressionSegment(0, 0, 0), new ParameterMarkerExpressionSegment(0, 0, 1)};
Object[] parameters = {"x", 1};
......@@ -533,9 +533,6 @@ public final class ShardingSQLRewriterTest {
List<Object> parameters = new ArrayList<>(2);
parameters.add(1);
parameters.add("x");
selectStatement.addSQLToken(new TableToken(7, 13, "table_x", QuoteCharacter.NONE));
selectStatement.addSQLToken(new TableToken(31, 37, "table_x", QuoteCharacter.NONE));
selectStatement.addSQLToken(new TableToken(58, 64, "table_x", QuoteCharacter.NONE));
selectStatement.getTables().add(new Table("table_x", "x"));
selectStatement.getTables().add(new Table("table_y", "y"));
routeResult = new SQLRouteResult(selectStatement);
......@@ -543,7 +540,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLogicSQL("SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?");
SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters);
rewriteEngine.init(
new ShardingSQLRewriter(shardingRule, DatabaseType.MySQL, routeResult),
new ShardingSQLRewriter(shardingRule, DatabaseType.MySQL, routeResult, null),
new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()));
RoutingUnit routingUnit = new RoutingUnit("db0");
routingUnit.getTableUnits().add(new TableUnit("table_x", "table_x"));
......@@ -863,6 +860,29 @@ public final class ShardingSQLRewriterTest {
assertThat(getSQLBuilder(rewriteEngine).toSQL(null, tableTokens), is("UPDATE table_z SET id = 'encryptValue' WHERE id = 'encryptValue'"));
}
@Test
public void assertInsertWithQueryAssistedShardingEncryptor() {
insertStatement.getColumnNames().add("name");
ColumnSegment columnSegment = new ColumnSegment(26, 29, "name");
LiteralExpressionSegment expressionSegment = new LiteralExpressionSegment(33, 34, 10);
insertStatement.getSqlSegments().add(new SetAssignmentsSegment(22, 34, Collections.singleton(new AssignmentSegment(22, 34, columnSegment, expressionSegment))));
insertStatement.getTables().add(new Table("table_w", null));
insertStatement.addSQLToken(new TableToken(12, 20, "`table_w`", QuoteCharacter.BACK_QUOTE));
InsertOptimizeResult insertOptimizeResult = new InsertOptimizeResult(Arrays.asList("name", "id", "query_name"));
ExpressionSegment[] expressionSegments = {new LiteralExpressionSegment(0, 0, 10), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 10)};
insertOptimizeResult.addUnit(expressionSegments, new Object[0], 0);
insertOptimizeResult.getUnits().get(0).getDataNodes().add(new DataNode("db0.table_1"));
RoutingUnit routingUnit = new RoutingUnit("db0");
routingUnit.getTableUnits().add(new TableUnit("table_w", "table_1"));
routeResult = new SQLRouteResult(insertStatement);
routeResult.setOptimizeResult(new OptimizeResult(insertOptimizeResult));
routeResult.setRoutingResult(new RoutingResult());
insertStatement.setLogicSQL("INSERT INTO `table_w` set name = 10 ON DUPLICATE KEY UPDATE name = VALUES(name)");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.MySQL, Collections.emptyList());
assertThat(getSQLBuilder(rewriteEngine).toSQL(routingUnit, tableTokens),
is("INSERT INTO `table_w` set name = 'encryptValue', id = 1, query_name = 'assistedEncryptValue' ON DUPLICATE KEY UPDATE name = VALUES(name)"));
}
@Test
public void assertSelectInWithAggregationDistinct() {
selectStatement.addSQLToken(new TableToken(49, 55, "table_z", QuoteCharacter.NONE));
......@@ -883,7 +903,7 @@ public final class ShardingSQLRewriterTest {
private SQLRewriteEngine createSQLRewriteEngine(final DatabaseType databaseType, final List<Object> parameters) {
SQLRewriteEngine result = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters);
result.init(
new ShardingSQLRewriter(shardingRule, databaseType, routeResult),
new ShardingSQLRewriter(shardingRule, databaseType, routeResult, routeResult.getOptimizeResult()),
new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()));
return result;
}
......
......@@ -42,6 +42,11 @@ shardingRule:
actualDataNodes: db${0..1}.table_z
table_k:
actualDataNodes: db${0..1}.table_k
table_w:
actualDataNodes: db${0..1}.table_w
keyGenerator:
type: SNOWFLAKE
column: id
bindingTables:
- table_x, table_y
encryptRule:
......@@ -51,5 +56,5 @@ shardingRule:
qualifiedColumns: table_z.id
k_encryptor:
type: ASSISTEDTEST
qualifiedColumns: table_k.id, table_k.id1
assistedQueryColumns: table_k.query_id, table_k.query_id1
qualifiedColumns: table_k.id, table_k.id1, table_w.name
assistedQueryColumns: table_k.query_id, table_k.query_id1, table_w.query_name
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册