This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 72d9c226abf Refactor EncryptPredicateColumnTokenGenerator encrypt 
logic (#34383)
72d9c226abf is described below

commit 72d9c226abf24e2f8c2c6d2e3a3a0ecfd6d7fb99
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Fri Jan 17 14:49:11 2025 +0800

    Refactor EncryptPredicateColumnTokenGenerator encrypt logic (#34383)
---
 .../EncryptPredicateColumnTokenGenerator.java      | 32 +++++++++++++---------
 1 file changed, 19 insertions(+), 13 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 20bfe4ee544..8497bb70a98 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
@@ -69,26 +69,35 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
         Collection<SelectStatementContext> allSubqueryContexts = 
SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext);
         Collection<WhereSegment> whereSegments = 
SQLStatementContextExtractor.getWhereSegments((WhereAvailable) 
sqlStatementContext, allSubqueryContexts);
         Collection<ColumnSegment> columnSegments = 
SQLStatementContextExtractor.getColumnSegments((WhereAvailable) 
sqlStatementContext, allSubqueryContexts);
-        return generateSQLTokens(columnSegments, whereSegments, 
sqlStatementContext.getDatabaseType());
+        Collection<AndPredicate> andPredicates = 
getAndPredicates(whereSegments);
+        return generateSQLTokens(columnSegments, andPredicates, 
sqlStatementContext);
     }
     
-    private Collection<SQLToken> generateSQLTokens(final 
Collection<ColumnSegment> columnSegments, final Collection<WhereSegment> 
whereSegments, final DatabaseType databaseType) {
+    private Collection<SQLToken> generateSQLTokens(final 
Collection<ColumnSegment> columnSegments, final Collection<AndPredicate> 
andPredicates, final SQLStatementContext sqlStatementContext) {
         Collection<SQLToken> result = new LinkedList<>();
         for (ColumnSegment each : columnSegments) {
             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.add(buildSubstitutableColumnNameToken(encryptColumn, 
each, whereSegments, databaseType));
+                result.add(buildSubstitutableColumnNameToken(encryptColumn, 
each, andPredicates, sqlStatementContext.getDatabaseType()));
             }
         }
         return result;
     }
     
-    private SubstitutableColumnNameToken 
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn,
-                                                                           
final ColumnSegment columnSegment, final Collection<WhereSegment> 
whereSegments, final DatabaseType databaseType) {
+    private Collection<AndPredicate> getAndPredicates(final 
Collection<WhereSegment> whereSegments) {
+        Collection<AndPredicate> result = new LinkedList<>();
+        for (WhereSegment each : whereSegments) {
+            
result.addAll(ExpressionExtractor.extractAndPredicates(each.getExpr()));
+        }
+        return result;
+    }
+    
+    private SubstitutableColumnNameToken 
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn, final 
ColumnSegment columnSegment,
+                                                                           
final Collection<AndPredicate> andPredicates, final DatabaseType databaseType) {
         int startIndex = columnSegment.getOwner().isPresent() ? 
columnSegment.getOwner().get().getStopIndex() + 2 : 
columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
-        if (includesLike(whereSegments, columnSegment)) {
+        if (includesLike(andPredicates, columnSegment)) {
             Optional<LikeQueryColumnItem> likeQueryColumnItem = 
encryptColumn.getLikeQuery();
             Preconditions.checkState(likeQueryColumnItem.isPresent());
             return new SubstitutableColumnNameToken(
@@ -100,13 +109,10 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
         return new SubstitutableColumnNameToken(startIndex, stopIndex, 
columnProjections, databaseType);
     }
     
-    private boolean includesLike(final Collection<WhereSegment> whereSegments, 
final ColumnSegment targetColumnSegment) {
-        for (WhereSegment each : whereSegments) {
-            Collection<AndPredicate> andPredicates = 
ExpressionExtractor.extractAndPredicates(each.getExpr());
-            for (AndPredicate andPredicate : andPredicates) {
-                if (isLikeColumnSegment(andPredicate, targetColumnSegment)) {
-                    return true;
-                }
+    private boolean includesLike(final Collection<AndPredicate> andPredicates, 
final ColumnSegment targetColumnSegment) {
+        for (AndPredicate each : andPredicates) {
+            if (isLikeColumnSegment(each, targetColumnSegment)) {
+                return true;
             }
         }
         return false;

Reply via email to