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 af6a3725cc1 Minor refactor EncryptPredicateColumnTokenGenerator and 
EncryptPredicateValueTokenGenerator (#37798)
af6a3725cc1 is described below

commit af6a3725cc1164ce45e57a3f9b348cce7938e929
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jan 21 18:20:14 2026 +0800

    Minor refactor EncryptPredicateColumnTokenGenerator and 
EncryptPredicateValueTokenGenerator (#37798)
---
 .../EncryptPredicateColumnTokenGenerator.java      | 20 +++++++++++++-------
 .../EncryptPredicateValueTokenGenerator.java       | 22 +++++++++++++++-------
 2 files changed, 28 insertions(+), 14 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
index 82b2b87caef..04ac4ccfbcf 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
@@ -17,13 +17,13 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate;
 
-import com.google.common.base.Preconditions;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.encrypt.enums.EncryptDerivedColumnSuffix;
+import 
org.apache.shardingsphere.encrypt.exception.metadata.MissingMatchedEncryptQueryAlgorithmException;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
@@ -35,6 +35,7 @@ import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
 import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstitutableColumnNameToken;
@@ -90,7 +91,7 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
             Optional<EncryptTable> encryptTable = 
rule.findEncryptTable(each.getColumnBoundInfo().getOriginalTable().getValue());
             if (encryptTable.isPresent() && 
encryptTable.get().isEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue()))
 {
                 EncryptColumn encryptColumn = 
encryptTable.get().getEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue());
-                
result.addAll(buildSubstitutableColumnNameTokens(encryptColumn, each, 
expression, sqlStatement.getDatabaseType()));
+                
result.addAll(buildSubstitutableColumnNameTokens(encryptColumn, each, 
expression, sqlStatement.getDatabaseType(), encryptTable.get().getTable()));
             }
         }
         return result;
@@ -109,14 +110,11 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
     }
     
     private Collection<SQLToken> buildSubstitutableColumnNameTokens(final 
EncryptColumn encryptColumn, final ColumnSegment columnSegment,
-                                                                    final 
ExpressionSegment expression, final DatabaseType databaseType) {
+                                                                    final 
ExpressionSegment expression, final DatabaseType databaseType, final String 
tableName) {
         int startIndex = columnSegment.getOwner().isPresent() ? 
columnSegment.getOwner().get().getStopIndex() + 2 : 
columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
         if (isIncludeLike(expression)) {
-            Optional<LikeQueryColumnItem> likeQueryColumnItem = 
encryptColumn.getLikeQuery();
-            Preconditions.checkState(likeQueryColumnItem.isPresent());
-            return Collections.singleton(new 
SubstitutableColumnNameToken(startIndex, stopIndex, createColumnProjections(
-                    likeQueryColumnItem.get().getName(), columnSegment, 
EncryptDerivedColumnSuffix.LIKE_QUERY, databaseType), databaseType));
+            return generateEncryptLikeTokens(encryptColumn, columnSegment, 
databaseType, tableName, startIndex, stopIndex);
         }
         Collection<Projection> columnProjections = 
encryptColumn.getAssistedQuery()
                 .map(optional -> createColumnProjections(optional.getName(), 
columnSegment, EncryptDerivedColumnSuffix.ASSISTED_QUERY, databaseType))
@@ -124,6 +122,14 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
         return Collections.singleton(new 
SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections, 
databaseType));
     }
     
+    private Collection<SQLToken> generateEncryptLikeTokens(final EncryptColumn 
encryptColumn, final ColumnSegment columnSegment, final DatabaseType 
databaseType,
+                                                           final String 
tableName, final int startIndex, final int stopIndex) {
+        
ShardingSpherePreconditions.checkState(encryptColumn.getLikeQuery().isPresent() 
|| encryptColumn.getCipher().getEncryptor().getMetaData().isSupportLike(),
+                () -> new 
MissingMatchedEncryptQueryAlgorithmException(tableName, 
columnSegment.getIdentifier().getValue(), "LIKE"));
+        return Collections.singleton(new 
SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(encryptColumn.getLikeQuery().map(LikeQueryColumnItem::getName)
+                .orElseGet(() -> encryptColumn.getCipher().getName()), 
columnSegment, EncryptDerivedColumnSuffix.LIKE_QUERY, databaseType), 
databaseType));
+    }
+    
     private boolean isIncludeLike(final ExpressionSegment expression) {
         return expression instanceof BinaryOperationExpression && 
("LIKE".equalsIgnoreCase(((BinaryOperationExpression) expression).getOperator())
                 || "NOT LIKE".equalsIgnoreCase(((BinaryOperationExpression) 
expression).getOperator()));
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 235560cdb1f..1c5c64e8f02 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
@@ -30,11 +30,11 @@ import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptPredicateFunc
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptPredicateInRightValueToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
-import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
 import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 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.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.ParametersAware;
@@ -84,8 +84,8 @@ public final class EncryptPredicateValueTokenGenerator 
implements CollectionSQLT
     private Optional<SQLToken> generateSQLToken(final String schemaName, final 
EncryptTable encryptTable, final EncryptCondition encryptCondition) {
         int startIndex = encryptCondition.getStartIndex();
         int stopIndex = encryptCondition.getStopIndex();
-        Map<Integer, Object> indexValues = getPositionValues(
-                encryptCondition.getPositionValueMap().keySet(), 
getEncryptedValues(schemaName, encryptTable, encryptCondition, new 
EncryptConditionValues(encryptCondition).get(parameters)));
+        Map<Integer, Object> indexValues = 
getPositionValues(encryptCondition.getPositionValueMap().keySet(),
+                getEncryptedValues(schemaName, encryptTable, encryptCondition, 
new EncryptConditionValues(encryptCondition).get(parameters)));
         Collection<Integer> parameterMarkerIndexes = 
encryptCondition.getPositionIndexMap().keySet();
         if (encryptCondition instanceof EncryptBinaryCondition && 
((EncryptBinaryCondition) encryptCondition).getExpressionSegment() instanceof 
FunctionSegment) {
             FunctionSegment functionSegment = (FunctionSegment) 
((EncryptBinaryCondition) encryptCondition).getExpressionSegment();
@@ -101,18 +101,26 @@ public final class EncryptPredicateValueTokenGenerator 
implements CollectionSQLT
     private List<Object> getEncryptedValues(final String schemaName, final 
EncryptTable encryptTable, final EncryptCondition encryptCondition, final 
List<Object> originalValues) {
         String columnName = 
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalColumn().getValue();
         EncryptColumn encryptColumn = 
encryptTable.getEncryptColumn(columnName);
+        String tableName = 
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalTable().getValue();
         if (encryptCondition instanceof EncryptBinaryCondition && 
("LIKE".equalsIgnoreCase(((EncryptBinaryCondition) 
encryptCondition).getOperator())
                 || "NOT LIKE".equalsIgnoreCase(((EncryptBinaryCondition) 
encryptCondition).getOperator()))) {
-            LikeQueryColumnItem likeQueryColumnItem = 
encryptColumn.getLikeQuery()
-                    .orElseThrow(() -> new 
MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(), 
columnName, "LIKE"));
-            return likeQueryColumnItem.encrypt(database.getName(), schemaName, 
encryptCondition.getTableName(), columnName, originalValues);
+            return getLikeQueryEncryptedValues(schemaName, encryptTable, 
encryptCondition, originalValues, encryptColumn, tableName, columnName);
         }
-        String tableName = 
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalTable().getValue();
         return encryptColumn.getAssistedQuery()
                 .map(optional -> optional.encrypt(database.getName(), 
schemaName, tableName, 
encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues))
                 .orElseGet(() -> 
encryptColumn.getCipher().encrypt(database.getName(), schemaName, tableName, 
encryptCondition.getColumnSegment().getIdentifier().getValue(), 
originalValues));
     }
     
+    private List<Object> getLikeQueryEncryptedValues(final String schemaName, 
final EncryptTable encryptTable, final EncryptCondition encryptCondition,
+                                                     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"));
+        if (encryptColumn.getLikeQuery().isPresent()) {
+            return 
encryptColumn.getLikeQuery().get().encrypt(database.getName(), schemaName, 
encryptCondition.getTableName(), columnName, originalValues);
+        }
+        return encryptColumn.getCipher().encrypt(database.getName(), 
schemaName, tableName, columnName, originalValues);
+    }
+    
     private Map<Integer, Object> getPositionValues(final Collection<Integer> 
valuePositions, final List<Object> encryptValues) {
         Map<Integer, Object> result = new 
LinkedHashMap<>(valuePositions.size(), 1F);
         for (int each : valuePositions) {

Reply via email to