This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 8d95eac397b Refactor EncryptInsertOnUpdateTokenGenerator and
EncryptInsertValuesTokenGenerator (#26356)
8d95eac397b is described below
commit 8d95eac397bd7504012ca5d533e0a89d46242748
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jun 15 00:48:08 2023 +0800
Refactor EncryptInsertOnUpdateTokenGenerator and
EncryptInsertValuesTokenGenerator (#26356)
* Refactor EncryptInsertValuesTokenGenerator
* Refactor EncryptInsertOnUpdateTokenGenerator
* Remove useless getAssistedQueryColumns
---
.../EncryptInsertOnUpdateTokenGenerator.java | 15 +++---
.../insert/EncryptInsertValuesTokenGenerator.java | 63 +++++++++++-----------
.../shardingsphere/encrypt/rule/EncryptRule.java | 12 -----
.../encrypt/rule/EncryptRuleTest.java | 5 --
4 files changed, 39 insertions(+), 56 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
index e14142df32e..e7c5413f7f7 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
@@ -35,7 +35,7 @@ import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQL
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -67,8 +67,7 @@ public final class EncryptInsertOnUpdateTokenGenerator
implements CollectionSQLT
public Collection<SQLToken> generateSQLTokens(final InsertStatementContext
insertStatementContext) {
InsertStatement insertStatement =
insertStatementContext.getSqlStatement();
Preconditions.checkState(InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).isPresent());
- OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment =
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get();
- Collection<AssignmentSegment> onDuplicateKeyColumnsSegments =
onDuplicateKeyColumnsSegment.getColumns();
+ Collection<AssignmentSegment> onDuplicateKeyColumnsSegments =
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get().getColumns();
if (onDuplicateKeyColumnsSegments.isEmpty()) {
return Collections.emptyList();
}
@@ -79,8 +78,9 @@ public final class EncryptInsertOnUpdateTokenGenerator
implements CollectionSQLT
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())) {
- ColumnSegment rightColumn = (ColumnSegment) ((FunctionSegment)
each.getValue()).getParameters().stream().findFirst().get();
- boolean rightEncryptorPresent =
encryptRule.findStandardEncryptor(tableName,
rightColumn.getIdentifier().getValue()).isPresent();
+ Optional<ExpressionSegment> rightColumnSegment =
((FunctionSegment) each.getValue()).getParameters().stream().findFirst();
+ Preconditions.checkState(rightColumnSegment.isPresent());
+ boolean rightEncryptorPresent =
encryptRule.findStandardEncryptor(tableName, ((ColumnSegment)
rightColumnSegment.get()).getIdentifier().getValue()).isPresent();
if (!leftEncryptorPresent && !rightEncryptorPresent) {
continue;
}
@@ -126,8 +126,9 @@ public final class EncryptInsertOnUpdateTokenGenerator
implements CollectionSQLT
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();
+ Optional<ExpressionSegment> valueColumnSegment =
functionSegment.getParameters().stream().findFirst();
+ Preconditions.checkState(valueColumnSegment.isPresent());
+ String valueColumn = ((ColumnSegment)
valueColumnSegment.get()).getIdentifier().getValue();
EncryptFunctionAssignmentToken result = new
EncryptFunctionAssignmentToken(columnSegment.getStartIndex(),
assignmentSegment.getStopIndex());
boolean cipherColumnPresent =
encryptRule.findStandardEncryptor(encryptTable.getTable(), column).isPresent();
boolean cipherValueColumnPresent =
encryptRule.findStandardEncryptor(encryptTable.getTable(),
valueColumn).isPresent();
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
index dc6ea8e7895..6203294f5a1 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
@@ -94,7 +94,7 @@ public final class EncryptInsertValuesTokenGenerator
implements OptionalSQLToken
int count = 0;
String schemaName =
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() ->
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
databaseName));
for (InsertValueContext each :
insertStatementContext.getInsertValueContexts()) {
- encryptToken(encryptTable,
insertValuesToken.getInsertValues().get(count), schemaName, tableName,
insertStatementContext, each);
+ encryptToken(insertValuesToken.getInsertValues().get(count),
schemaName, encryptTable, insertStatementContext, each);
count++;
}
}
@@ -107,7 +107,7 @@ public final class EncryptInsertValuesTokenGenerator
implements OptionalSQLToken
String schemaName =
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() ->
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
databaseName));
for (InsertValueContext each :
insertStatementContext.getInsertValueContexts()) {
InsertValue insertValueToken = new
InsertValue(each.getValueExpressions());
- encryptToken(encryptTable, insertValueToken, schemaName,
tableName, insertStatementContext, each);
+ encryptToken(insertValueToken, schemaName, encryptTable,
insertStatementContext, each);
result.getInsertValues().add(insertValueToken);
}
return result;
@@ -129,36 +129,44 @@ public final class EncryptInsertValuesTokenGenerator
implements OptionalSQLToken
return result;
}
- private void encryptToken(final EncryptTable encryptTable, final
InsertValue insertValueToken, final String schemaName, final String tableName,
+ private void encryptToken(final InsertValue insertValueToken, final String
schemaName, final EncryptTable encryptTable,
final InsertStatementContext
insertStatementContext, final InsertValueContext insertValueContext) {
Optional<SQLToken> useDefaultInsertColumnsToken =
findPreviousSQLToken(UseDefaultInsertColumnsToken.class);
Iterator<String> descendingColumnNames =
insertStatementContext.getDescendingColumnNames();
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
- Optional<StandardEncryptAlgorithm> standardEncryptor =
encryptRule.findStandardEncryptor(tableName, columnName);
- if (standardEncryptor.isPresent()) {
- int columnIndex = useDefaultInsertColumnsToken.map(optional ->
((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
- .orElseGet(() ->
insertStatementContext.getColumnNames().indexOf(columnName));
- Object originalValue =
insertValueContext.getLiteralValue(columnIndex).orElse(null);
- EncryptContext encryptContext =
EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
- setCipherColumn(insertValueToken, standardEncryptor.get(),
columnIndex, encryptContext,
insertValueContext.getValueExpressions().get(columnIndex), originalValue);
- int indexDelta = 1;
- if (encryptRule.findAssistedQueryEncryptor(tableName,
columnName).isPresent()) {
- addAssistedQueryColumn(encryptTable,
- insertValueToken,
encryptRule.findAssistedQueryEncryptor(tableName, columnName).get(),
columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
- indexDelta++;
- }
- if (encryptRule.findLikeQueryEncryptor(tableName,
columnName).isPresent()) {
- addLikeQueryColumn(encryptTable,
- insertValueToken,
encryptRule.findLikeQueryEncryptor(tableName, columnName).get(), columnIndex,
encryptContext, insertValueContext, originalValue, indexDelta);
- }
+ Optional<StandardEncryptAlgorithm> standardEncryptor =
encryptRule.findStandardEncryptor(encryptTable.getTable(), columnName);
+ if (!standardEncryptor.isPresent()) {
+ continue;
}
+ int columnIndex = useDefaultInsertColumnsToken.map(optional ->
((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
+ .orElseGet(() ->
insertStatementContext.getColumnNames().indexOf(columnName));
+ Object originalValue =
insertValueContext.getLiteralValue(columnIndex).orElse(null);
+ EncryptContext encryptContext =
EncryptContextBuilder.build(databaseName, schemaName, encryptTable.getTable(),
columnName);
+ setCipherColumn(insertValueToken, standardEncryptor.get(),
columnIndex, encryptContext,
insertValueContext.getValueExpressions().get(columnIndex), originalValue);
+ int indexDelta = 1;
+ if
(encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(),
columnName).isPresent()) {
+ addAssistedQueryColumn(encryptTable, insertValueToken,
+
encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(),
columnName).get(), columnIndex, encryptContext, insertValueContext,
originalValue, indexDelta);
+ indexDelta++;
+ }
+ if (encryptRule.findLikeQueryEncryptor(encryptTable.getTable(),
columnName).isPresent()) {
+ addLikeQueryColumn(encryptTable, insertValueToken,
+
encryptRule.findLikeQueryEncryptor(encryptTable.getTable(), columnName).get(),
columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
+ }
+ }
+ }
+
+ private void setCipherColumn(final InsertValue insertValueToken, final
StandardEncryptAlgorithm encryptAlgorithm, final int columnIndex,
+ final EncryptContext encryptContext, final
ExpressionSegment valueExpression, final Object originalValue) {
+ if (valueExpression instanceof LiteralExpressionSegment) {
+ insertValueToken.getValues().set(columnIndex,
+ new
LiteralExpressionSegment(valueExpression.getStartIndex(),
valueExpression.getStopIndex(), encryptAlgorithm.encrypt(originalValue,
encryptContext)));
}
}
private void addAssistedQueryColumn(final EncryptTable encryptTable, final
InsertValue insertValueToken, final AssistedEncryptAlgorithm
assistQueryEncryptor, final int columnIndex,
- final EncryptContext encryptContext,
final InsertValueContext insertValueContext,
- final Object originalValue, final int
indexDelta) {
+ final EncryptContext encryptContext,
final InsertValueContext insertValueContext, final Object originalValue, final
int indexDelta) {
if
(encryptTable.findAssistedQueryColumn(encryptContext.getColumnName()).isPresent())
{
DerivedSimpleExpressionSegment derivedExpressionSegment =
isAddLiteralExpressionSegment(insertValueContext, columnIndex)
? new
DerivedLiteralExpressionSegment(assistQueryEncryptor.encrypt(originalValue,
encryptContext))
@@ -168,8 +176,7 @@ public final class EncryptInsertValuesTokenGenerator
implements OptionalSQLToken
}
private void addLikeQueryColumn(final EncryptTable encryptTable, final
InsertValue insertValueToken, final LikeEncryptAlgorithm likeQueryEncryptor,
final int columnIndex,
- final EncryptContext encryptContext, final
InsertValueContext insertValueContext,
- final Object originalValue, final int
indexDelta) {
+ final EncryptContext encryptContext, final
InsertValueContext insertValueContext, final Object originalValue, final int
indexDelta) {
if
(encryptTable.findLikeQueryColumn(encryptContext.getColumnName()).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment =
isAddLiteralExpressionSegment(insertValueContext, columnIndex)
? new
DerivedLiteralExpressionSegment(likeQueryEncryptor.encrypt(originalValue,
encryptContext))
@@ -191,12 +198,4 @@ public final class EncryptInsertValuesTokenGenerator
implements OptionalSQLToken
}
return result;
}
-
- private void setCipherColumn(final InsertValue insertValueToken, final
StandardEncryptAlgorithm encryptAlgorithm, final int columnIndex,
- final EncryptContext encryptContext, final
ExpressionSegment valueExpression, final Object originalValue) {
- if (valueExpression instanceof LiteralExpressionSegment) {
- insertValueToken.getValues().set(columnIndex, new
LiteralExpressionSegment(
- valueExpression.getStartIndex(),
valueExpression.getStopIndex(), encryptAlgorithm.encrypt(originalValue,
encryptContext)));
- }
- }
}
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
index 05371fc2528..692131c8240 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
@@ -38,8 +38,6 @@ import
org.apache.shardingsphere.infra.rule.identifier.type.TableNamesMapper;
import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
-import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
@@ -200,16 +198,6 @@ public final class EncryptRule implements DatabaseRule,
TableContainedRule {
return result;
}
- /**
- * Get assisted query columns.
- *
- * @param tableName table name
- * @return assisted query columns
- */
- public Collection<String> getAssistedQueryColumns(final String tableName) {
- return
findEncryptTable(tableName).map(EncryptTable::getAssistedQueryColumns).orElse(Collections.emptyList());
- }
-
/**
* Get encrypt assisted query values.
*
diff --git
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index 18708034105..84b5a551a6c 100644
---
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -93,11 +93,6 @@ class EncryptRuleTest {
}
}
- @Test
- void assertGetAssistedQueryColumns() {
- assertFalse(new
EncryptRule(createEncryptRuleConfiguration()).getAssistedQueryColumns("t_encrypt").isEmpty());
- }
-
@Test
void assertGetEncryptLikeQueryValues() {
List<Object> encryptLikeQueryValues = new
EncryptRule(createEncryptRuleConfiguration())