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

Add basic encrypt token generator to simplify code (#3403)

* add BaseEncryptSQLTokenGenerator

* add aware package
上级 c7fcb4cb
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator;
package org.apache.shardingsphere.core.rewrite.feature.encrypt.aware;
import org.apache.shardingsphere.core.rule.EncryptRule;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator;
package org.apache.shardingsphere.core.rewrite.feature.encrypt.aware;
/**
* Query with cipher column aware.
......
......@@ -22,8 +22,8 @@ import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptAssignmentParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptInsertValueParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.parameter.impl.EncryptPredicateParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
......
......@@ -28,7 +28,7 @@ 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.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder;
......
......@@ -23,7 +23,7 @@ import lombok.Setter;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder;
......
......@@ -25,8 +25,8 @@ import org.apache.shardingsphere.core.rewrite.feature.encrypt.EncryptConditionEn
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.rule.EncryptRule;
......
......@@ -18,8 +18,8 @@
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.AssistQueryAndPlainInsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptAssignmentTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptForUseDefaultInsertColumnsTokenGenerator;
......
/*
* 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.feature.encrypt.token.generator;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.SQLTokenGenerator;
import org.apache.shardingsphere.core.rule.EncryptRule;
/**
* Base SQL token generator for encrypt.
*
* @author zhangliang
*/
@Getter
@Setter
public abstract class BaseEncryptSQLTokenGenerator implements SQLTokenGenerator, EncryptRuleAware {
private EncryptRule encryptRule;
@Override
public final boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return isGenerateSQLTokenForEncrypt(sqlStatementContext) && needEncrypt(sqlStatementContext);
}
protected abstract boolean isGenerateSQLTokenForEncrypt(SQLStatementContext sqlStatementContext);
private boolean needEncrypt(final SQLStatementContext sqlStatementContext) {
for (String each : sqlStatementContext.getTablesContext().getTableNames()) {
if (encryptRule.findEncryptTable(each).isPresent()) {
return true;
}
}
return false;
}
}
......@@ -19,16 +19,14 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
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.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertColumnsToken;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Collection;
......@@ -41,22 +39,18 @@ import java.util.List;
* @author panjuan
* @author zhangliang
*/
@Setter
public final class AssistQueryAndPlainInsertColumnsTokenGenerator implements CollectionSQLTokenGenerator, EncryptRuleAware {
private EncryptRule encryptRule;
public final class AssistQueryAndPlainInsertColumnsTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator {
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class).isPresent()
&& !((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns()
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
&& !((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns();
}
@Override
public Collection<InsertColumnsToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<InsertColumnsToken> result = new LinkedList<>();
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName());
Optional<EncryptTable> encryptTable = getEncryptRule().findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName());
Preconditions.checkState(encryptTable.isPresent());
for (ColumnSegment each : ((InsertStatement) sqlStatementContext.getSqlStatement()).getColumns()) {
List<String> columns = getColumns(encryptTable.get(), each);
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
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.LiteralExpressionSegment;
......@@ -29,12 +28,11 @@ 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.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptAssignmentToken;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptLiteralAssignmentToken;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptParameterAssignmentToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.Collection;
import java.util.Collections;
......@@ -45,17 +43,10 @@ import java.util.LinkedList;
*
* @author panjuan
*/
@Setter
public final class EncryptAssignmentTokenGenerator implements CollectionSQLTokenGenerator, EncryptRuleAware {
private EncryptRule encryptRule;
public final class EncryptAssignmentTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator {
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return isSetAssignmentStatement(sqlStatementContext);
}
private boolean isSetAssignmentStatement(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext.getSqlStatement() instanceof UpdateStatement
|| sqlStatementContext instanceof InsertSQLStatementContext && sqlStatementContext.getSqlStatement().findSQLSegment(SetAssignmentsSegment.class).isPresent();
}
......@@ -65,7 +56,7 @@ public final class EncryptAssignmentTokenGenerator implements CollectionSQLToken
Collection<EncryptAssignmentToken> result = new LinkedList<>();
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
for (AssignmentSegment each : getSetAssignmentsSegment(sqlStatementContext.getSqlStatement()).getAssignments()) {
if (encryptRule.findShardingEncryptor(tableName, each.getColumn().getName()).isPresent()) {
if (getEncryptRule().findShardingEncryptor(tableName, each.getColumn().getName()).isPresent()) {
Optional<EncryptAssignmentToken> sqlToken = generateSQLToken(tableName, each);
if (sqlToken.isPresent()) {
result.add(sqlToken.get());
......@@ -104,18 +95,18 @@ public final class EncryptAssignmentTokenGenerator implements CollectionSQLToken
}
private void addCipherColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
token.addColumnName(encryptRule.getCipherColumn(tableName, columnName));
token.addColumnName(getEncryptRule().getCipherColumn(tableName, columnName));
}
private void addAssistedQueryColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, columnName);
Optional<String> assistedQueryColumn = getEncryptRule().findAssistedQueryColumn(tableName, columnName);
if (assistedQueryColumn.isPresent()) {
token.addColumnName(assistedQueryColumn.get());
}
}
private void addPlainColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, columnName);
Optional<String> plainColumn = getEncryptRule().findPlainColumn(tableName, columnName);
if (plainColumn.isPresent()) {
token.addColumnName(plainColumn.get());
}
......@@ -131,22 +122,22 @@ public final class EncryptAssignmentTokenGenerator implements CollectionSQLToken
private void addCipherAssignment(final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
Object cipherValue = encryptRule.getEncryptValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next();
token.addAssignment(encryptRule.getCipherColumn(tableName, assignmentSegment.getColumn().getName()), cipherValue);
Object cipherValue = getEncryptRule().getEncryptValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next();
token.addAssignment(getEncryptRule().getCipherColumn(tableName, assignmentSegment.getColumn().getName()), cipherValue);
}
private void addAssistedQueryAssignment(final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, assignmentSegment.getColumn().getName());
Optional<String> assistedQueryColumn = getEncryptRule().findAssistedQueryColumn(tableName, assignmentSegment.getColumn().getName());
if (assistedQueryColumn.isPresent()) {
Object assistedQueryValue = encryptRule.getEncryptAssistedQueryValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next();
Object assistedQueryValue = getEncryptRule().getEncryptAssistedQueryValues(tableName, assignmentSegment.getColumn().getName(), Collections.singletonList(originalValue)).iterator().next();
token.addAssignment(assistedQueryColumn.get(), assistedQueryValue);
}
}
private void addPlainAssignment(final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, assignmentSegment.getColumn().getName());
Optional<String> plainColumn = getEncryptRule().findPlainColumn(tableName, assignmentSegment.getColumn().getName());
if (plainColumn.isPresent()) {
token.addAssignment(plainColumn.get(), originalValue);
}
......
......@@ -24,12 +24,11 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumns
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Iterator;
......@@ -43,16 +42,13 @@ import java.util.List;
* @author zhangliang
*/
@Setter
public final class EncryptForUseDefaultInsertColumnsTokenGenerator implements OptionalSQLTokenGenerator, EncryptRuleAware, PreviousSQLTokensAware {
private EncryptRule encryptRule;
public final class EncryptForUseDefaultInsertColumnsTokenGenerator extends BaseEncryptSQLTokenGenerator implements OptionalSQLTokenGenerator, PreviousSQLTokensAware {
private List<SQLToken> previousSQLTokens;
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && ((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns()
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && ((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns();
}
@Override
......@@ -76,7 +72,7 @@ public final class EncryptForUseDefaultInsertColumnsTokenGenerator implements Op
}
private void processPreviousSQLToken(final UseDefaultInsertColumnsToken previousSQLToken, final InsertSQLStatementContext sqlStatementContext, final String tableName) {
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
Optional<EncryptTable> encryptTable = getEncryptRule().findEncryptTable(tableName);
Preconditions.checkState(encryptTable.isPresent());
List<String> columnNames = getColumnNames(sqlStatementContext, encryptTable.get(), previousSQLToken.getColumns());
previousSQLToken.getColumns().clear();
......@@ -86,7 +82,7 @@ public final class EncryptForUseDefaultInsertColumnsTokenGenerator implements Op
private UseDefaultInsertColumnsToken generateNewSQLToken(final InsertSQLStatementContext sqlStatementContext, final String tableName) {
Optional<InsertColumnsSegment> insertColumnsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(insertColumnsSegment.isPresent());
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
Optional<EncryptTable> encryptTable = getEncryptRule().findEncryptTable(tableName);
Preconditions.checkState(encryptTable.isPresent());
return new UseDefaultInsertColumnsToken(insertColumnsSegment.get().getStopIndex(), getColumnNames(sqlStatementContext, encryptTable.get(), sqlStatementContext.getColumnNames()));
}
......
......@@ -29,7 +29,7 @@ import org.apache.shardingsphere.core.preprocessor.segment.insert.expression.Der
import org.apache.shardingsphere.core.preprocessor.segment.insert.expression.DerivedSimpleExpressionSegment;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
......@@ -37,7 +37,6 @@ import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValue
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken.InsertValueToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
import org.apache.shardingsphere.core.rule.DataNode;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor;
......@@ -52,16 +51,13 @@ import java.util.List;
* @author panjuan
*/
@Setter
public final class EncryptInsertValuesTokenGenerator implements OptionalSQLTokenGenerator, EncryptRuleAware, PreviousSQLTokensAware {
private EncryptRule encryptRule;
public final class EncryptInsertValuesTokenGenerator extends BaseEncryptSQLTokenGenerator implements OptionalSQLTokenGenerator, PreviousSQLTokensAware {
private List<SQLToken> previousSQLTokens;
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && !sqlStatementContext.getSqlStatement().findSQLSegments(InsertValuesSegment.class).isEmpty()
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && !sqlStatementContext.getSqlStatement().findSQLSegments(InsertValuesSegment.class).isEmpty();
}
@Override
......@@ -125,7 +121,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
Iterator<String> descendingColumnNames = sqlStatementContext.getDescendingColumnNames();
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
Optional<ShardingEncryptor> encryptor = encryptRule.findShardingEncryptor(tableName, columnName);
Optional<ShardingEncryptor> encryptor = getEncryptRule().findShardingEncryptor(tableName, columnName);
if (encryptor.isPresent()) {
int columnIndex = useDefaultInsertColumnsToken.isPresent()
? ((UseDefaultInsertColumnsToken) useDefaultInsertColumnsToken.get()).getColumns().indexOf(columnName) : sqlStatementContext.getColumnNames().indexOf(columnName);
......@@ -139,7 +135,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
private void addPlainColumn(final InsertValueToken insertValueToken, final int columnIndex,
final String tableName, final String columnName, final InsertValueContext insertValueContext, final Object originalValue) {
if (encryptRule.findPlainColumn(tableName, columnName).isPresent()) {
if (getEncryptRule().findPlainColumn(tableName, columnName).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(originalValue) : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
insertValueToken.getValues().add(columnIndex + 1, derivedExpressionSegment);
......@@ -148,7 +144,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
private void addAssistedQueryColumn(final InsertValueToken insertValueToken, final ShardingEncryptor encryptor, final int columnIndex,
final String tableName, final String columnName, final InsertValueContext insertValueContext, final Object originalValue) {
if (encryptRule.findAssistedQueryColumn(tableName, columnName).isPresent()) {
if (getEncryptRule().findAssistedQueryColumn(tableName, columnName).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(((ShardingQueryAssistedEncryptor) encryptor).queryAssistedEncrypt(null == originalValue ? null : originalValue.toString()))
: new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
......
......@@ -25,12 +25,11 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.AndPredica
import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.PredicateSegment;
import org.apache.shardingsphere.core.parse.sql.statement.generic.WhereSegmentAvailable;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Collection;
......@@ -43,16 +42,14 @@ import java.util.LinkedList;
* @author zhangliang
*/
@Setter
public final class EncryptPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator, TableMetasAware, EncryptRuleAware, QueryWithCipherColumnAware {
public final class EncryptPredicateColumnTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator, TableMetasAware, QueryWithCipherColumnAware {
private TableMetas tableMetas;
private EncryptRule encryptRule;
private boolean queryWithCipherColumn;
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext.getSqlStatement() instanceof WhereSegmentAvailable && ((WhereSegmentAvailable) sqlStatementContext.getSqlStatement()).getWhere().isPresent();
}
......@@ -92,6 +89,6 @@ public final class EncryptPredicateColumnTokenGenerator implements CollectionSQL
private Optional<EncryptTable> findEncryptTable(final SQLStatementContext sqlStatementContext, final PredicateSegment segment) {
Optional<String> tableName = sqlStatementContext.getTablesContext().findTableName(segment.getColumn(), tableMetas);
return tableName.isPresent() ? encryptRule.findEncryptTable(tableName.get()) : Optional.<EncryptTable>absent();
return tableName.isPresent() ? getEncryptRule().findEncryptTable(tableName.get()) : Optional.<EncryptTable>absent();
}
}
......@@ -24,13 +24,12 @@ import org.apache.shardingsphere.core.parse.sql.statement.generic.WhereSegmentAv
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.EncryptCondition;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.EncryptConditionEngine;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptPredicateRightValueToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.ParametersAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.Collection;
import java.util.Collections;
......@@ -46,24 +45,22 @@ import java.util.Map;
* @author zhangliang
*/
@Setter
public final class EncryptPredicateRightValueTokenGenerator implements CollectionSQLTokenGenerator, TableMetasAware, EncryptRuleAware, ParametersAware, QueryWithCipherColumnAware {
public final class EncryptPredicateRightValueTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator, TableMetasAware, ParametersAware, QueryWithCipherColumnAware {
private TableMetas tableMetas;
private EncryptRule encryptRule;
private List<Object> parameters;
private boolean queryWithCipherColumn;
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext.getSqlStatement() instanceof WhereSegmentAvailable && ((WhereSegmentAvailable) sqlStatementContext.getSqlStatement()).getWhere().isPresent();
}
@Override
public Collection<EncryptPredicateRightValueToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
List<EncryptCondition> encryptConditions = new EncryptConditionEngine(encryptRule, tableMetas).createEncryptConditions(sqlStatementContext);
List<EncryptCondition> encryptConditions = new EncryptConditionEngine(getEncryptRule(), tableMetas).createEncryptConditions(sqlStatementContext);
return encryptConditions.isEmpty() ? Collections.<EncryptPredicateRightValueToken>emptyList() : generateSQLTokens(encryptConditions);
}
......@@ -87,10 +84,10 @@ public final class EncryptPredicateRightValueTokenGenerator implements Collectio
}
private List<Object> getEncryptedValues(final EncryptCondition encryptCondition, final List<Object> originalValues) {
Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(encryptCondition.getTableName(), encryptCondition.getColumnName());
Optional<String> assistedQueryColumn = getEncryptRule().findAssistedQueryColumn(encryptCondition.getTableName(), encryptCondition.getColumnName());
return assistedQueryColumn.isPresent()
? encryptRule.getEncryptAssistedQueryValues(encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues)
: encryptRule.getEncryptValues(encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues);
? getEncryptRule().getEncryptAssistedQueryValues(encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues)
: getEncryptRule().getEncryptValues(encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues);
}
private EncryptPredicateRightValueToken generateSQLTokenForQueryWithoutCipherColumn(final EncryptCondition encryptCondition, final List<Object> originalValues) {
......
......@@ -25,11 +25,10 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemSegme
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemsSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.aware.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Collection;
......@@ -37,19 +36,17 @@ import java.util.Collections;
import java.util.LinkedList;
/**
* Encrypt projection token generator.
* Projection token generator for encrypt.
*
* @author panjuan
*/
@Setter
public final class EncryptProjectionTokenGenerator implements CollectionSQLTokenGenerator, EncryptRuleAware, QueryWithCipherColumnAware {
private EncryptRule encryptRule;
public final class EncryptProjectionTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator, QueryWithCipherColumnAware {
private boolean queryWithCipherColumn;
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
if (!(sqlStatementContext.getSqlStatement() instanceof SelectStatement && !sqlStatementContext.getTablesContext().isEmpty())) {
return false;
}
......@@ -63,7 +60,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
Optional<SelectItemsSegment> selectItemsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(SelectItemsSegment.class);
Preconditions.checkState(selectItemsSegment.isPresent());
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
Optional<EncryptTable> encryptTable = getEncryptRule().findEncryptTable(tableName);
if (!encryptTable.isPresent()) {
return Collections.emptyList();
}
......@@ -80,8 +77,8 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
}
private SubstitutableColumnNameToken generateSQLToken(final ColumnSelectItemSegment segment, final String tableName) {
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, segment.getName());
String columnName = plainColumn.isPresent() && !queryWithCipherColumn ? plainColumn.get() : encryptRule.getCipherColumn(tableName, segment.getName());
Optional<String> plainColumn = getEncryptRule().findPlainColumn(tableName, segment.getName());
String columnName = plainColumn.isPresent() && !queryWithCipherColumn ? plainColumn.get() : getEncryptRule().getCipherColumn(tableName, segment.getName());
return segment.getOwner().isPresent() ? new SubstitutableColumnNameToken(segment.getOwner().get().getStopIndex() + 2, segment.getStopIndex(), columnName)
: new SubstitutableColumnNameToken(segment.getStartIndex(), segment.getStopIndex(), columnName);
}
......
......@@ -19,15 +19,13 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
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.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.BaseEncryptSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.Collection;
import java.util.LinkedList;
......@@ -38,13 +36,10 @@ import java.util.Map;
*
* @author panjuan
*/
@Setter
public final class InsertCipherNameTokenGenerator implements CollectionSQLTokenGenerator, EncryptRuleAware {
private EncryptRule encryptRule;
public final class InsertCipherNameTokenGenerator extends BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator {
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
protected boolean isGenerateSQLTokenForEncrypt(final SQLStatementContext sqlStatementContext) {
Optional<InsertColumnsSegment> insertColumnsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
return sqlStatementContext instanceof InsertSQLStatementContext && insertColumnsSegment.isPresent() && !insertColumnsSegment.get().getColumns().isEmpty();
}
......@@ -53,7 +48,7 @@ public final class InsertCipherNameTokenGenerator implements CollectionSQLTokenG
public Collection<SubstitutableColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Optional<InsertColumnsSegment> sqlSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(sqlSegment.isPresent());
Map<String, String> logicAndCipherColumns = encryptRule.getLogicAndCipherColumns(sqlStatementContext.getTablesContext().getSingleTableName());
Map<String, String> logicAndCipherColumns = getEncryptRule().getLogicAndCipherColumns(sqlStatementContext.getTablesContext().getSingleTableName());
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
for (ColumnSegment each : sqlSegment.get().getColumns()) {
if (logicAndCipherColumns.keySet().contains(each.getName())) {
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator;
package org.apache.shardingsphere.core.rewrite.feature.sharding.aware;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator;
package org.apache.shardingsphere.core.rewrite.feature.sharding.aware;
import org.apache.shardingsphere.core.rule.ShardingRule;
......
......@@ -21,8 +21,8 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.rewrite.feature.sharding.parameter.impl.ShardingGeneratedKeyInsertValueParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.sharding.parameter.impl.ShardingPaginationParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriterBuilder;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
......
......@@ -21,7 +21,7 @@ import com.google.common.collect.Lists;
import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter;
......
......@@ -25,7 +25,7 @@ import org.apache.shardingsphere.core.preprocessor.statement.impl.SelectSQLState
import org.apache.shardingsphere.core.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.builder.impl.StandardParameterBuilder;
import org.apache.shardingsphere.core.rewrite.parameter.rewriter.ParameterRewriter;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import java.util.List;
......
......@@ -20,9 +20,9 @@ package org.apache.shardingsphere.core.rewrite.feature.sharding.token;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.builder.SQLTokenGeneratorBuilder;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.IgnoreForSingleRoute;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.SQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.AggregationDistinctTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.IndexTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.TableTokenGenerator;
......
......@@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.segment.insert.InsertValueContext;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken.InsertValueToken;
......
......@@ -32,7 +32,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.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.ShardingRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.pojo.TableToken;
import org.apache.shardingsphere.core.rule.ShardingRule;
......
......@@ -22,7 +22,7 @@ import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.feature.sharding.aware.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册