You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/12 22:11:27 UTC
[shardingsphere] branch master updated: Refactor EncryptTokenGenerators (#26310)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 0db3f104a41 Refactor EncryptTokenGenerators (#26310)
0db3f104a41 is described below
commit 0db3f104a411d6148dfcd40c565796cf998234ef
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue Jun 13 06:11:10 2023 +0800
Refactor EncryptTokenGenerators (#26310)
* Refactor EncryptIndexColumnTokenGenerator
* Refactor EncryptInsertOnUpdateTokenGenerator
* Refactor EncryptProjectionTokenGenerator
---
.../EncryptIndexColumnTokenGenerator.java | 19 +++--
.../EncryptInsertOnUpdateTokenGenerator.java | 89 ++++++++++------------
.../generator/EncryptProjectionTokenGenerator.java | 60 +++++++--------
.../EncryptInsertOnUpdateTokenGeneratorTest.java | 14 +++-
.../EncryptProjectionTokenGeneratorTest.java | 7 +-
5 files changed, 96 insertions(+), 93 deletions(-)
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
index f2048c64f6d..5edab600cf5 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
@@ -21,6 +21,7 @@ import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -56,21 +57,25 @@ public final class EncryptIndexColumnTokenGenerator implements CollectionSQLToke
if (sqlStatementContext.getTablesContext().getTableNames().isEmpty()) {
return Collections.emptyList();
}
- Collection<SQLToken> result = new LinkedList<>();
String tableName = sqlStatementContext.getTablesContext().getTableNames().iterator().next();
+ Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
+ if (!encryptTable.isPresent()) {
+ return Collections.emptyList();
+ }
+ Collection<SQLToken> result = new LinkedList<>();
for (ColumnSegment each : ((IndexAvailable) sqlStatementContext).getIndexColumns()) {
- encryptRule.findStandardEncryptor(tableName, each.getIdentifier().getValue()).flatMap(optional -> getColumnToken(tableName, each)).ifPresent(result::add);
+ encryptRule.findStandardEncryptor(tableName, each.getIdentifier().getValue()).flatMap(optional -> getColumnToken(encryptTable.get(), each)).ifPresent(result::add);
}
return result;
}
- private Optional<SQLToken> getColumnToken(final String tableName, final ColumnSegment columnSegment) {
+ private Optional<SQLToken> getColumnToken(final EncryptTable encryptTable, final ColumnSegment columnSegment) {
String columnName = columnSegment.getIdentifier().getValue();
QuoteCharacter quoteCharacter = columnSegment.getIdentifier().getQuoteCharacter();
int startIndex = columnSegment.getStartIndex();
int stopIndex = columnSegment.getStopIndex();
- return encryptRule.findAssistedQueryColumn(tableName, columnName).map(optional -> getAssistedQueryColumnToken(startIndex, stopIndex, optional, quoteCharacter))
- .orElseGet(() -> getCipherColumnToken(tableName, startIndex, stopIndex, columnName, quoteCharacter));
+ return encryptTable.findAssistedQueryColumn(columnName).map(optional -> getAssistedQueryColumnToken(startIndex, stopIndex, optional, quoteCharacter))
+ .orElseGet(() -> getCipherColumnToken(encryptTable, startIndex, stopIndex, columnName, quoteCharacter));
}
private Optional<SQLToken> getAssistedQueryColumnToken(final int startIndex, final int stopIndex, final String columnName, final QuoteCharacter quoteCharacter) {
@@ -78,8 +83,8 @@ public final class EncryptIndexColumnTokenGenerator implements CollectionSQLToke
return Optional.of(new SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections, quoteCharacter));
}
- private Optional<SQLToken> getCipherColumnToken(final String tableName, final int startIndex, final int stopIndex, final String columnName, final QuoteCharacter quoteCharacter) {
- String cipherColumn = encryptRule.getCipherColumn(tableName, columnName);
+ private Optional<SQLToken> getCipherColumnToken(final EncryptTable encryptTable, final int startIndex, final int stopIndex, final String columnName, final QuoteCharacter quoteCharacter) {
+ String cipherColumn = encryptTable.getCipherColumn(columnName);
Collection<Projection> columnProjections = getColumnProjections(cipherColumn, quoteCharacter);
return Optional.of(new SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections, quoteCharacter));
}
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
index 1765feb3d74..9cd630a7b85 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptFunctionAssig
import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptLiteralAssignmentToken;
import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptParameterAssignmentToken;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
@@ -64,16 +65,20 @@ public final class EncryptInsertOnUpdateTokenGenerator implements CollectionSQLT
@Override
public Collection<SQLToken> generateSQLTokens(final InsertStatementContext insertStatementContext) {
- Collection<SQLToken> result = new LinkedList<>();
InsertStatement insertStatement = insertStatementContext.getSqlStatement();
Preconditions.checkState(InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).isPresent());
OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment = InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get();
Collection<AssignmentSegment> onDuplicateKeyColumnsSegments = onDuplicateKeyColumnsSegment.getColumns();
if (onDuplicateKeyColumnsSegments.isEmpty()) {
- return result;
+ return Collections.emptyList();
}
String schemaName = insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(), databaseName));
String tableName = insertStatement.getTable().getTableName().getIdentifier().getValue();
+ Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
+ if (!encryptTable.isPresent()) {
+ return Collections.emptyList();
+ }
+ Collection<SQLToken> result = new LinkedList<>();
for (AssignmentSegment each : onDuplicateKeyColumnsSegments) {
boolean leftEncryptorPresent = encryptRule.findStandardEncryptor(tableName, each.getColumns().get(0).getIdentifier().getValue()).isPresent();
if (each.getValue() instanceof FunctionSegment && "VALUES".equalsIgnoreCase(((FunctionSegment) each.getValue()).getFunctionName())) {
@@ -86,65 +91,65 @@ public final class EncryptInsertOnUpdateTokenGenerator implements CollectionSQLT
if (!leftEncryptorPresent) {
continue;
}
- generateSQLToken(schemaName, tableName, each).ifPresent(result::add);
+ generateSQLToken(schemaName, encryptTable.get(), each).ifPresent(result::add);
}
return result;
}
- private Optional<EncryptAssignmentToken> generateSQLToken(final String schemaName, final String tableName, final AssignmentSegment assignmentSegment) {
+ private Optional<EncryptAssignmentToken> generateSQLToken(final String schemaName, final EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
if (assignmentSegment.getValue() instanceof ParameterMarkerExpressionSegment) {
- return Optional.of(generateParameterSQLToken(tableName, assignmentSegment));
+ return Optional.of(generateParameterSQLToken(encryptTable, assignmentSegment));
}
if (assignmentSegment.getValue() instanceof FunctionSegment && "VALUES".equalsIgnoreCase(((FunctionSegment) assignmentSegment.getValue()).getFunctionName())) {
- return Optional.of(generateValuesSQLToken(tableName, assignmentSegment, (FunctionSegment) assignmentSegment.getValue()));
+ return Optional.of(generateValuesSQLToken(encryptTable, assignmentSegment, (FunctionSegment) assignmentSegment.getValue()));
}
if (assignmentSegment.getValue() instanceof LiteralExpressionSegment) {
- return Optional.of(generateLiteralSQLToken(schemaName, tableName, assignmentSegment));
+ return Optional.of(generateLiteralSQLToken(schemaName, encryptTable, assignmentSegment));
}
return Optional.empty();
}
- private EncryptAssignmentToken generateParameterSQLToken(final String tableName, final AssignmentSegment assignmentSegment) {
+ private EncryptAssignmentToken generateParameterSQLToken(final EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
EncryptParameterAssignmentToken result = new EncryptParameterAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(), assignmentSegment.getStopIndex());
String columnName = assignmentSegment.getColumns().get(0).getIdentifier().getValue();
- addCipherColumn(tableName, columnName, result);
- addAssistedQueryColumn(tableName, columnName, result);
- addLikeQueryColumn(tableName, columnName, result);
+ result.addColumnName(encryptTable.getCipherColumn(columnName));
+ encryptTable.findAssistedQueryColumn(columnName).ifPresent(result::addColumnName);
+ encryptTable.findLikeQueryColumn(columnName).ifPresent(result::addColumnName);
return result;
}
- private EncryptAssignmentToken generateLiteralSQLToken(final String schemaName, final String tableName, final AssignmentSegment assignmentSegment) {
+ private EncryptAssignmentToken generateLiteralSQLToken(final String schemaName, final EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
EncryptLiteralAssignmentToken result = new EncryptLiteralAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(), assignmentSegment.getStopIndex());
- addCipherAssignment(schemaName, tableName, assignmentSegment, result);
- addAssistedQueryAssignment(schemaName, tableName, assignmentSegment, result);
- addLikeAssignment(schemaName, tableName, assignmentSegment, result);
+ addCipherAssignment(schemaName, encryptTable, assignmentSegment, result);
+ addAssistedQueryAssignment(schemaName, encryptTable, assignmentSegment, result);
+ addLikeAssignment(schemaName, encryptTable, assignmentSegment, result);
return result;
}
- private EncryptAssignmentToken generateValuesSQLToken(final String tableName, final AssignmentSegment assignmentSegment, final FunctionSegment functionSegment) {
+ private EncryptAssignmentToken generateValuesSQLToken(final EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final FunctionSegment functionSegment) {
ColumnSegment columnSegment = assignmentSegment.getColumns().get(0);
String column = columnSegment.getIdentifier().getValue();
ColumnSegment valueColumnSegment = (ColumnSegment) functionSegment.getParameters().stream().findFirst().get();
String valueColumn = valueColumnSegment.getIdentifier().getValue();
EncryptFunctionAssignmentToken result = new EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), assignmentSegment.getStopIndex());
- boolean cipherColumnPresent = encryptRule.findStandardEncryptor(tableName, column).isPresent();
- boolean cipherValueColumnPresent = encryptRule.findStandardEncryptor(tableName, valueColumn).isPresent();
+ boolean cipherColumnPresent = encryptRule.findStandardEncryptor(encryptTable.getTable(), column).isPresent();
+ boolean cipherValueColumnPresent = encryptRule.findStandardEncryptor(encryptTable.getTable(), valueColumn).isPresent();
if (cipherColumnPresent && cipherValueColumnPresent) {
- String cipherColumn = encryptRule.getCipherColumn(tableName, column);
- String cipherValueColumn = encryptRule.getCipherColumn(tableName, valueColumn);
+ String cipherColumn = encryptTable.getCipherColumn(column);
+ String cipherValueColumn = encryptTable.getCipherColumn(valueColumn);
result.addAssignment(cipherColumn, "VALUES(" + cipherValueColumn + ")");
} else if (cipherColumnPresent != cipherValueColumnPresent) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
- Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, column);
- Optional<String> valueAssistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, valueColumn);
+ Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column);
+ Optional<String> valueAssistedQueryColumn = encryptTable.findAssistedQueryColumn(valueColumn);
if (assistedQueryColumn.isPresent() && valueAssistedQueryColumn.isPresent()) {
result.addAssignment(assistedQueryColumn.get(), "VALUES(" + valueAssistedQueryColumn.get() + ")");
} else if (assistedQueryColumn.isPresent() != valueAssistedQueryColumn.isPresent()) {
throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
}
- Optional<String> likeQueryColumn = encryptRule.findLikeQueryColumn(tableName, column);
- Optional<String> valueLikeQueryColumn = encryptRule.findLikeQueryColumn(tableName, valueColumn);
+ Optional<String> likeQueryColumn = encryptTable.findLikeQueryColumn(column);
+ Optional<String> valueLikeQueryColumn = encryptTable.findLikeQueryColumn(valueColumn);
if (likeQueryColumn.isPresent() && valueLikeQueryColumn.isPresent()) {
result.addAssignment(likeQueryColumn.get(), "VALUES(" + valueLikeQueryColumn.get() + ")");
} else if (likeQueryColumn.isPresent() != valueLikeQueryColumn.isPresent()) {
@@ -156,41 +161,27 @@ public final class EncryptInsertOnUpdateTokenGenerator implements CollectionSQLT
return result;
}
- private void addCipherColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
- token.addColumnName(encryptRule.getCipherColumn(tableName, columnName));
- }
-
- private void addAssistedQueryColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
- encryptRule.findAssistedQueryColumn(tableName, columnName).ifPresent(token::addColumnName);
- }
-
- private void addLikeQueryColumn(final String tableName, final String columnName, final EncryptParameterAssignmentToken token) {
- encryptRule.findLikeQueryColumn(tableName, columnName).ifPresent(token::addColumnName);
- }
-
- private void addCipherAssignment(final String schemaName, final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
+ private void addCipherAssignment(final String schemaName, final EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
- Object cipherValue = encryptRule.encrypt(databaseName, schemaName, tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(),
+ Object cipherValue = encryptRule.encrypt(databaseName, schemaName, encryptTable.getTable(), assignmentSegment.getColumns().get(0).getIdentifier().getValue(),
Collections.singletonList(originalValue)).iterator().next();
- token.addAssignment(encryptRule.getCipherColumn(tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue()), cipherValue);
+ token.addAssignment(encryptTable.getCipherColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()), cipherValue);
}
- private void addAssistedQueryAssignment(final String schemaName, final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
- encryptRule.findAssistedQueryColumn(tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional -> {
+ private void addAssistedQueryAssignment(final String schemaName, final EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
+ encryptTable.findAssistedQueryColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional -> {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
- Object assistedQueryValue = encryptRule
- .getEncryptAssistedQueryValues(databaseName, schemaName, tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(), Collections.singletonList(originalValue))
- .iterator().next();
+ Object assistedQueryValue = encryptRule.getEncryptAssistedQueryValues(
+ databaseName, schemaName, encryptTable.getTable(), assignmentSegment.getColumns().get(0).getIdentifier().getValue(), Collections.singletonList(originalValue)).iterator().next();
token.addAssignment(optional, assistedQueryValue);
});
}
- private void addLikeAssignment(final String schemaName, final String tableName, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
- encryptRule.findLikeQueryColumn(tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional -> {
+ private void addLikeAssignment(final String schemaName, final EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token) {
+ encryptTable.findLikeQueryColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional -> {
Object originalValue = ((LiteralExpressionSegment) assignmentSegment.getValue()).getLiterals();
- Object likeValue = encryptRule
- .getEncryptLikeQueryValues(databaseName, schemaName, tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(), Collections.singletonList(originalValue))
- .iterator().next();
+ Object likeValue = encryptRule.getEncryptLikeQueryValues(
+ databaseName, schemaName, encryptTable.getTable(), assignmentSegment.getColumns().get(0).getIdentifier().getValue(), Collections.singletonList(originalValue)).iterator().next();
token.addAssignment(optional, likeValue);
});
}
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index a5e55d3e2cd..5433c1cf0d5 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -21,6 +21,7 @@ import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
@@ -80,7 +81,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
return result;
}
- private void addGenerateSQLTokens(final Collection<SQLToken> result, final SelectStatementContext selectStatementContext) {
+ private void addGenerateSQLTokens(final Collection<SQLToken> sqlTokens, final SelectStatementContext selectStatementContext) {
Map<String, String> columnTableNames = getColumnTableNames(selectStatementContext);
for (ProjectionSegment each : selectStatementContext.getSqlStatement().getProjections().getProjections()) {
SubqueryType subqueryType = selectStatementContext.getSubqueryType();
@@ -88,27 +89,30 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
ColumnProjectionSegment columnSegment = (ColumnProjectionSegment) each;
ColumnProjection columnProjection = buildColumnProjection(columnSegment);
String tableName = columnTableNames.get(columnProjection.getExpression());
- if (null != tableName && encryptRule.findEncryptTable(tableName).flatMap(optional -> optional.findEncryptColumn(columnProjection.getName())).isPresent()) {
- result.add(generateSQLToken(tableName, columnSegment, columnProjection, subqueryType));
+ if (null == tableName) {
+ continue;
+ }
+ Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
+ if (!encryptTable.isPresent()) {
+ continue;
+ }
+ if (encryptTable.get().findEncryptColumn(columnProjection.getName()).isPresent()) {
+ sqlTokens.add(generateSQLToken(encryptTable.get(), columnSegment, columnProjection, subqueryType));
}
}
if (each instanceof ShorthandProjectionSegment) {
ShorthandProjectionSegment shorthandSegment = (ShorthandProjectionSegment) each;
Collection<Projection> actualColumns = getShorthandProjection(shorthandSegment, selectStatementContext.getProjectionsContext()).getActualColumns();
if (!actualColumns.isEmpty()) {
- result.add(generateSQLToken(shorthandSegment, actualColumns, selectStatementContext, subqueryType, columnTableNames));
+ sqlTokens.add(generateSQLToken(shorthandSegment, actualColumns, selectStatementContext, subqueryType, columnTableNames));
}
}
}
}
- private boolean isEncryptColumn(final String tableName, final String columnName) {
- return null != tableName && encryptRule.findEncryptTable(tableName).flatMap(optional -> optional.findEncryptColumn(columnName)).isPresent();
- }
-
- private SubstitutableColumnNameToken generateSQLToken(final String tableName, final ColumnProjectionSegment columnSegment,
+ private SubstitutableColumnNameToken generateSQLToken(final EncryptTable encryptTable, final ColumnProjectionSegment columnSegment,
final ColumnProjection columnProjection, final SubqueryType subqueryType) {
- Collection<Projection> projections = generateProjections(tableName, columnProjection, subqueryType, false, null);
+ Collection<Projection> projections = generateProjections(encryptTable, columnProjection, subqueryType, false, null);
int startIndex = columnSegment.getColumn().getOwner().isPresent() ? columnSegment.getColumn().getOwner().get().getStopIndex() + 2 : columnSegment.getColumn().getStartIndex();
int stopIndex = columnSegment.getStopIndex();
return new SubstitutableColumnNameToken(startIndex, stopIndex, projections);
@@ -122,7 +126,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
if (null == tableName || !encryptRule.findEncryptTable(tableName).flatMap(optional -> optional.findEncryptColumn(each.getColumnLabel())).isPresent()) {
projections.add(each.getAlias().map(optional -> (Projection) new ColumnProjection(null, optional, null)).orElse(each));
} else if (each instanceof ColumnProjection) {
- projections.addAll(generateProjections(tableName, (ColumnProjection) each, subqueryType, true, segment));
+ encryptRule.findEncryptTable(tableName).ifPresent(optional -> projections.addAll(generateProjections(optional, (ColumnProjection) each, subqueryType, true, segment)));
}
}
int startIndex = segment.getOwner().isPresent() ? segment.getOwner().get().getStartIndex() : segment.getStartIndex();
@@ -150,17 +154,17 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
return selectStatementContext.getTablesContext().findTableNamesByColumnProjection(columns, schema);
}
- private Collection<Projection> generateProjections(final String tableName, final ColumnProjection column, final SubqueryType subqueryType, final boolean shorthand,
+ private Collection<Projection> generateProjections(final EncryptTable encryptTable, final ColumnProjection column, final SubqueryType subqueryType, final boolean shorthand,
final ShorthandProjectionSegment segment) {
Collection<Projection> result = new LinkedList<>();
if (SubqueryType.PREDICATE_SUBQUERY == subqueryType) {
- result.add(distinctOwner(generatePredicateSubqueryProjection(tableName, column), shorthand));
+ result.add(distinctOwner(generatePredicateSubqueryProjection(encryptTable, column), shorthand));
} else if (SubqueryType.TABLE_SUBQUERY == subqueryType) {
- result.addAll(generateTableSubqueryProjections(tableName, column, shorthand));
+ result.addAll(generateTableSubqueryProjections(encryptTable, column, shorthand));
} else if (SubqueryType.EXISTS_SUBQUERY == subqueryType) {
- result.addAll(generateExistsSubqueryProjections(tableName, column, shorthand));
+ result.addAll(generateExistsSubqueryProjections(encryptTable, column, shorthand));
} else {
- result.add(distinctOwner(generateCommonProjection(tableName, column, segment), shorthand));
+ result.add(distinctOwner(generateCommonProjection(encryptTable, column, segment), shorthand));
}
return result;
}
@@ -172,43 +176,39 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
return new ColumnProjection(null, column.getNameIdentifier(), column.getAlias().isPresent() ? column.getAliasIdentifier() : null);
}
- private ColumnProjection generatePredicateSubqueryProjection(final String tableName, final ColumnProjection column) {
- Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, column.getName());
+ private ColumnProjection generatePredicateSubqueryProjection(final EncryptTable encryptTable, final ColumnProjection column) {
+ Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column.getName());
if (assistedQueryColumn.isPresent()) {
return new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(assistedQueryColumn.get(), column.getNameIdentifier().getQuoteCharacter()), null);
}
- String cipherColumn = encryptRule.getCipherColumn(tableName, column.getName());
+ String cipherColumn = encryptTable.getCipherColumn(column.getName());
return new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(cipherColumn, column.getNameIdentifier().getQuoteCharacter()), null);
}
- private Collection<ColumnProjection> generateTableSubqueryProjections(final String tableName, final ColumnProjection column, final boolean shorthand) {
+ private Collection<ColumnProjection> generateTableSubqueryProjections(final EncryptTable encryptTable, final ColumnProjection column, final boolean shorthand) {
Collection<ColumnProjection> result = new LinkedList<>();
- result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptRule.getCipherColumn(tableName, column.getName()),
+ result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptTable.getCipherColumn(column.getName()),
column.getNameIdentifier().getQuoteCharacter()), null), shorthand));
- Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, column.getName());
+ Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column.getName());
assistedQueryColumn.ifPresent(optional -> result.add(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(optional, column.getNameIdentifier().getQuoteCharacter()), null)));
return result;
}
- private Collection<ColumnProjection> generateExistsSubqueryProjections(final String tableName, final ColumnProjection column, final boolean shorthand) {
+ private Collection<ColumnProjection> generateExistsSubqueryProjections(final EncryptTable encryptTable, final ColumnProjection column, final boolean shorthand) {
Collection<ColumnProjection> result = new LinkedList<>();
- result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptRule.getCipherColumn(tableName, column.getName()),
+ result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptTable.getCipherColumn(column.getName()),
column.getNameIdentifier().getQuoteCharacter()), null), shorthand));
return result;
}
- private ColumnProjection generateCommonProjection(final String tableName, final ColumnProjection column, final ShorthandProjectionSegment segment) {
- String encryptColumnName = getEncryptColumnName(tableName, column.getName());
+ private ColumnProjection generateCommonProjection(final EncryptTable encryptTable, final ColumnProjection column, final ShorthandProjectionSegment segment) {
+ String encryptColumnName = encryptTable.getCipherColumn(column.getName());
IdentifierValue owner = (null == segment || !segment.getOwner().isPresent()) ? column.getOwnerIdentifier() : segment.getOwner().get().getIdentifier();
return new ColumnProjection(owner, new IdentifierValue(encryptColumnName, column.getNameIdentifier().getQuoteCharacter()), column.getAlias().isPresent()
? column.getAliasIdentifier()
: column.getNameIdentifier());
}
- private String getEncryptColumnName(final String tableName, final String logicEncryptColumnName) {
- return encryptRule.getCipherColumn(tableName, logicEncryptColumnName);
- }
-
private ShorthandProjection getShorthandProjection(final ShorthandProjectionSegment segment, final ProjectionsContext projectionsContext) {
Optional<String> owner = segment.getOwner().isPresent() ? Optional.of(segment.getOwner().get().getIdentifier().getValue()) : Optional.empty();
for (Projection each : projectionsContext.getProjections()) {
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
index 16b8e0eecc7..f58011c2599 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlg
import org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptInsertOnUpdateTokenGenerator;
import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptAssignmentToken;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
@@ -54,23 +55,30 @@ import static org.mockito.Mockito.when;
class EncryptInsertOnUpdateTokenGeneratorTest {
- private EncryptInsertOnUpdateTokenGenerator generator;
+ private final EncryptInsertOnUpdateTokenGenerator generator = new EncryptInsertOnUpdateTokenGenerator();
@BeforeEach
void setup() {
- generator = new EncryptInsertOnUpdateTokenGenerator();
generator.setEncryptRule(mockEncryptRule());
}
private EncryptRule mockEncryptRule() {
EncryptRule result = mock(EncryptRule.class);
- when(result.getCipherColumn("t_user", "mobile")).thenReturn("cipher_mobile");
+ EncryptTable encryptTable = mockEncryptTable();
+ when(result.findEncryptTable("t_user")).thenReturn(Optional.of(encryptTable));
when(result.findStandardEncryptor("t_user", "mobile")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
when(result.findStandardEncryptor("t_user", "cipher_mobile")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
when(result.encrypt(null, "db_test", "t_user", "mobile", Collections.singletonList(0))).thenReturn(Collections.singletonList("encryptValue"));
return result;
}
+ private static EncryptTable mockEncryptTable() {
+ EncryptTable result = mock(EncryptTable.class);
+ when(result.getTable()).thenReturn("t_user");
+ when(result.getCipherColumn("mobile")).thenReturn("cipher_mobile");
+ return result;
+ }
+
@Test
void assertIsNotGenerateSQLTokenWithNotInsertStatement() {
assertFalse(generator.isGenerateSQLToken(mock(SelectStatementContext.class)));
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
index c7f05eb366b..d4d9bb9bf67 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
@@ -51,11 +51,10 @@ import static org.mockito.Mockito.when;
class EncryptProjectionTokenGeneratorTest {
- private EncryptProjectionTokenGenerator generator;
+ private final EncryptProjectionTokenGenerator generator = new EncryptProjectionTokenGenerator();
@BeforeEach
void setup() {
- generator = new EncryptProjectionTokenGenerator();
generator.setEncryptRule(mockEncryptRule());
generator.setDatabaseName("db_schema");
generator.setSchemas(Collections.singletonMap("test", mock(ShardingSphereSchema.class)));
@@ -65,8 +64,8 @@ class EncryptProjectionTokenGeneratorTest {
EncryptRule result = mock(EncryptRule.class);
EncryptTable encryptTable1 = mock(EncryptTable.class);
EncryptTable encryptTable2 = mock(EncryptTable.class);
- when(encryptTable1.getLogicColumns()).thenReturn(Collections.singletonList("mobile"));
- when(encryptTable2.getLogicColumns()).thenReturn(Collections.singletonList("mobile"));
+ when(encryptTable1.getLogicColumns()).thenReturn(Collections.singleton("mobile"));
+ when(encryptTable2.getLogicColumns()).thenReturn(Collections.singleton("mobile"));
when(result.findEncryptTable("doctor")).thenReturn(Optional.of(encryptTable1));
when(result.findEncryptTable("doctor1")).thenReturn(Optional.of(encryptTable2));
EncryptColumn column = new EncryptColumn("mobile", new EncryptColumnItem("mobile", "standard_encryptor"));