This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 7c2eac38282 Minor refactor for encrypt token generator and parameter
rewriter (#37886)
7c2eac38282 is described below
commit 7c2eac382824ad276a447f412d1f31d0271a57e6
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jan 29 18:08:57 2026 +0800
Minor refactor for encrypt token generator and parameter rewriter (#37886)
---
.../rewriter/EncryptPredicateParameterRewriter.java | 20 ++++++++++++++++----
.../EncryptInsertPredicateValueTokenGenerator.java | 2 +-
.../EncryptPredicateValueTokenGenerator.java | 2 +-
.../EncryptInsertSelectProjectionTokenGenerator.java | 3 ++-
.../token/EncryptTokenGenerateBuilderTest.java | 4 +++-
.../EncryptPredicateValueTokenGeneratorTest.java | 6 ++++--
6 files changed, 27 insertions(+), 10 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java
index 0992e93f82d..1038c5f7614 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
+import
org.apache.shardingsphere.encrypt.exception.metadata.MissingMatchedEncryptQueryAlgorithmException;
import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition;
import
org.apache.shardingsphere.encrypt.rewrite.condition.EncryptConditionValues;
import
org.apache.shardingsphere.encrypt.rewrite.condition.impl.EncryptBinaryCondition;
@@ -27,6 +28,7 @@ import
org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
import
org.apache.shardingsphere.infra.binder.context.available.WhereContextAvailable;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
@@ -67,16 +69,26 @@ public final class EncryptPredicateParameterRewriter
implements ParameterRewrite
String columnName =
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalColumn().getValue();
EncryptTable encryptTable = rule.getEncryptTable(tableName);
EncryptColumn encryptColumn =
encryptTable.getEncryptColumn(columnName);
- if (encryptCondition instanceof EncryptBinaryCondition
- && ("LIKE".equals(((EncryptBinaryCondition)
encryptCondition).getOperator()) || "NOT LIKE".equals(((EncryptBinaryCondition)
encryptCondition).getOperator()))
- && encryptColumn.getLikeQuery().isPresent()) {
- return encryptColumn.getLikeQuery().get().encrypt(databaseName,
schemaName, tableName, columnName, originalValues);
+ if (encryptCondition instanceof EncryptBinaryCondition &&
containsLikeOperator((EncryptBinaryCondition) encryptCondition)) {
+ return getEncryptedLikeValues(schemaName, originalValues,
encryptColumn, tableName, columnName);
}
return encryptColumn.getAssistedQuery().isPresent()
? encryptColumn.getAssistedQuery().get().encrypt(databaseName,
schemaName, tableName, columnName, originalValues)
: encryptColumn.getCipher().encrypt(databaseName, schemaName,
tableName, columnName, originalValues);
}
+ private List<Object> getEncryptedLikeValues(final String schemaName, final
List<Object> originalValues, final EncryptColumn encryptColumn, final String
tableName, final String columnName) {
+
ShardingSpherePreconditions.checkState(encryptColumn.getLikeQuery().isPresent()
|| encryptColumn.getCipher().getEncryptor().getMetaData().isSupportLike(),
+ () -> new
MissingMatchedEncryptQueryAlgorithmException(tableName, columnName, "LIKE"));
+ return encryptColumn.getLikeQuery()
+ .map(likeQueryColumnItem ->
likeQueryColumnItem.encrypt(databaseName, schemaName, tableName, columnName,
originalValues))
+ .orElseGet(() ->
encryptColumn.getCipher().encrypt(databaseName, schemaName, tableName,
columnName, originalValues));
+ }
+
+ private boolean containsLikeOperator(final EncryptBinaryCondition
encryptCondition) {
+ return "LIKE".equalsIgnoreCase(encryptCondition.getOperator()) || "NOT
LIKE".equalsIgnoreCase(encryptCondition.getOperator());
+ }
+
private void encryptParameters(final ParameterBuilder paramBuilder, final
Map<Integer, Integer> positionIndexes, final List<Object> encryptValues) {
if (!positionIndexes.isEmpty()) {
for (Entry<Integer, Integer> entry : positionIndexes.entrySet()) {
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateValueTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateValueTokenGenerator.java
index 783fa168649..67cf77cccac 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateValueTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateValueTokenGenerator.java
@@ -51,7 +51,7 @@ public final class EncryptInsertPredicateValueTokenGenerator
implements Collecti
@Override
public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
return sqlStatementContext instanceof InsertStatementContext && null
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
- && !((InsertStatementContext)
sqlStatementContext).getInsertSelectContext().getSelectStatementContext().getWhereSegments().isEmpty();
+ && !((InsertStatementContext)
sqlStatementContext).getInsertSelectContext().getSelectStatementContext().getWhereSegments().isEmpty()
&& !encryptConditions.isEmpty();
}
@Override
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
index 1c5c64e8f02..629e7c6d61e 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
@@ -66,7 +66,7 @@ public final class EncryptPredicateValueTokenGenerator
implements CollectionSQLT
@Override
public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
- return sqlStatementContext instanceof WhereContextAvailable;
+ return sqlStatementContext instanceof WhereContextAvailable &&
!encryptConditions.isEmpty();
}
@Override
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
index 7d10173a6e4..85bde119763 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
@@ -44,7 +44,8 @@ public final class
EncryptInsertSelectProjectionTokenGenerator implements Collec
@Override
public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
- return sqlStatementContext instanceof InsertStatementContext && null
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext();
+ return sqlStatementContext instanceof InsertStatementContext && null
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
+ && !((InsertStatementContext)
sqlStatementContext).getInsertSelectContext().getSelectStatementContext().getTablesContext().getSimpleTables().isEmpty();
}
@Override
diff --git
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
index 6f5ea0038a7..38d6c986a7d 100644
---
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
+++
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.encrypt.rewrite.token;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptPredicateColumnTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptPredicateValueTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptSelectProjectionTokenGenerator;
@@ -63,7 +64,8 @@ class EncryptTokenGenerateBuilderTest {
when(selectStatementContext.getWhereSegments()).thenReturn(Collections.emptyList());
when(selectStatementContext.getSqlStatement()).thenReturn(new
SelectStatement(databaseType));
SQLRewriteContext sqlRewriteContext = mock(SQLRewriteContext.class,
RETURNS_DEEP_STUBS);
- EncryptTokenGenerateBuilder encryptTokenGenerateBuilder = new
EncryptTokenGenerateBuilder(selectStatementContext, Collections.emptyList(),
rule, sqlRewriteContext);
+ EncryptCondition encryptCondition = mock(EncryptCondition.class);
+ EncryptTokenGenerateBuilder encryptTokenGenerateBuilder = new
EncryptTokenGenerateBuilder(selectStatementContext,
Collections.singleton(encryptCondition), rule, sqlRewriteContext);
Collection<SQLTokenGenerator> sqlTokenGenerators =
encryptTokenGenerateBuilder.getSQLTokenGenerators();
assertThat(sqlTokenGenerators.size(), is(3));
Iterator<SQLTokenGenerator> iterator = sqlTokenGenerators.iterator();
diff --git
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGeneratorTest.java
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGeneratorTest.java
index 9c5752141a4..4adb5277bfd 100644
---
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGeneratorTest.java
+++
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGeneratorTest.java
@@ -37,9 +37,11 @@ class EncryptPredicateValueTokenGeneratorTest {
@Test
void assertIsGenerateSQLToken() {
+ UpdateStatementContext updateStatementContext =
EncryptGeneratorFixtureBuilder.createUpdateStatementContext();
+ Collection<EncryptCondition> encryptConditions =
getEncryptConditions(updateStatementContext);
EncryptPredicateValueTokenGenerator generator = new
EncryptPredicateValueTokenGenerator(EncryptGeneratorFixtureBuilder.createEncryptRule(),
- new ShardingSphereDatabase("foo_db", mock(), mock(), mock(),
Collections.emptyList()), Collections.emptyList());
-
assertTrue(generator.isGenerateSQLToken(EncryptGeneratorFixtureBuilder.createUpdateStatementContext()));
+ new ShardingSphereDatabase("foo_db", mock(), mock(), mock(),
Collections.emptyList()), encryptConditions);
+ assertTrue(generator.isGenerateSQLToken(updateStatementContext));
}
@Test