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 9cbb2822add Refactor EncryptGroupByItemTokenGenerator. (#36889)
9cbb2822add is described below

commit 9cbb2822add4449844298efca88c5fce31cc479c
Author: Cong Hu <[email protected]>
AuthorDate: Fri Oct 17 11:19:33 2025 +0800

    Refactor EncryptGroupByItemTokenGenerator. (#36889)
---
 .../rewrite/condition/EncryptConditionEngine.java  | 19 ++++++++++++++-----
 .../EncryptPredicateValueTokenGenerator.java       | 11 ++++++-----
 .../select/EncryptGroupByItemTokenGenerator.java   | 22 ++++++++++++++--------
 .../segment/select/groupby/GroupByContext.java     |  8 ++++++++
 .../groupby/engine/GroupByContextEngine.java       |  2 +-
 5 files changed, 43 insertions(+), 19 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
index 036b349a192..8ae857e3fca 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
@@ -162,15 +162,24 @@ public final class EncryptConditionEngine {
         if (!columnSegment.isPresent()) {
             return Collections.emptyList();
         }
+        return getEncryptConditions(tableName, expression, 
columnSegment.get());
+    }
+    
+    private Collection<EncryptCondition> getEncryptConditions(final String 
tableName, final BinaryOperationExpression expression, final ColumnSegment 
columnSegment) {
         ExpressionSegment compareValueSegment = 
isCompareValueSegment(expression.getLeft()) ? expression.getLeft() : 
expression.getRight();
-        if (compareValueSegment instanceof SimpleExpressionSegment) {
-            return 
Collections.singleton(createEncryptBinaryOperationCondition(tableName, 
expression, columnSegment.get(), compareValueSegment));
+        return getEncryptCondition(tableName, expression, compareValueSegment, 
columnSegment).map(Collections::singleton).orElseGet(Collections::emptySet);
+    }
+    
+    private Optional<EncryptCondition> getEncryptCondition(final String 
tableName, final BinaryOperationExpression expression, final ExpressionSegment 
expressionSegment,
+                                                           final ColumnSegment 
columnSegment) {
+        if (expressionSegment instanceof SimpleExpressionSegment) {
+            return 
Optional.of(createEncryptBinaryOperationCondition(tableName, expression, 
columnSegment, expressionSegment));
         }
-        if (compareValueSegment instanceof ListExpression) {
+        if (expressionSegment instanceof ListExpression) {
             // TODO check this logic when items contain multiple values 
@duanzhengqiang
-            return 
Collections.singleton(createEncryptBinaryOperationCondition(tableName, 
expression, columnSegment.get(), ((ListExpression) 
compareValueSegment).getItems().get(0)));
+            return 
Optional.of(createEncryptBinaryOperationCondition(tableName, expression, 
columnSegment, ((ListExpression) expressionSegment).getItems().get(0)));
         }
-        return Collections.emptyList();
+        return Optional.empty();
     }
     
     private boolean isCompareValueSegment(final ExpressionSegment 
expressionSegment) {
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 496aa6f549f..b351dfeb6c7 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
@@ -77,12 +77,12 @@ public final class EncryptPredicateValueTokenGenerator 
implements CollectionSQLT
                 .orElseGet(() -> new 
DatabaseTypeRegistry(sqlStatementContext.getSqlStatement().getDatabaseType()).getDefaultSchemaName(database.getName()));
         for (EncryptCondition each : encryptConditions) {
             Optional<EncryptTable> encryptTable = 
rule.findEncryptTable(each.getTableName());
-            encryptTable.ifPresent(optional -> 
result.add(generateSQLToken(schemaName, optional, each)));
+            encryptTable.flatMap(optional -> generateSQLToken(schemaName, 
optional, each)).ifPresent(result::add);
         }
         return result;
     }
     
-    private SQLToken generateSQLToken(final String schemaName, final 
EncryptTable encryptTable, final EncryptCondition encryptCondition) {
+    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(
@@ -90,12 +90,13 @@ public final class EncryptPredicateValueTokenGenerator 
implements CollectionSQLT
         Collection<Integer> parameterMarkerIndexes = 
encryptCondition.getPositionIndexMap().keySet();
         if (encryptCondition instanceof EncryptBinaryCondition && 
((EncryptBinaryCondition) encryptCondition).getExpressionSegment() instanceof 
FunctionSegment) {
             FunctionSegment functionSegment = (FunctionSegment) 
((EncryptBinaryCondition) encryptCondition).getExpressionSegment();
-            return new EncryptPredicateFunctionRightValueToken(startIndex, 
stopIndex, functionSegment.getFunctionName(), functionSegment.getParameters(), 
indexValues, parameterMarkerIndexes);
+            return Optional.of(new 
EncryptPredicateFunctionRightValueToken(startIndex, stopIndex, 
functionSegment.getFunctionName(), functionSegment.getParameters(), indexValues,
+                    parameterMarkerIndexes));
         }
         
         return encryptCondition instanceof EncryptInCondition
-                ? new EncryptPredicateInRightValueToken(startIndex, stopIndex, 
indexValues, parameterMarkerIndexes)
-                : new EncryptPredicateEqualRightValueToken(startIndex, 
stopIndex, indexValues, parameterMarkerIndexes);
+                ? Optional.of(new 
EncryptPredicateInRightValueToken(startIndex, stopIndex, indexValues, 
parameterMarkerIndexes))
+                : Optional.of(new 
EncryptPredicateEqualRightValueToken(startIndex, stopIndex, indexValues, 
parameterMarkerIndexes));
     }
     
     private List<Object> getEncryptedValues(final String schemaName, final 
EncryptTable encryptTable, final EncryptCondition encryptCondition, final 
List<Object> originalValues) {
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java
index 353504eb43b..b25d5a663bf 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator.select;
 
-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;
@@ -26,6 +25,7 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import 
org.apache.shardingsphere.infra.binder.context.segment.select.groupby.GroupByContext;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.orderby.OrderByItem;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
@@ -48,12 +48,15 @@ import java.util.Optional;
  * Group by item token generator for encrypt.
  */
 @HighFrequencyInvocation
-@RequiredArgsConstructor
 @Setter
 public final class EncryptGroupByItemTokenGenerator implements 
CollectionSQLTokenGenerator<SelectStatementContext> {
     
     private final EncryptRule rule;
     
+    public EncryptGroupByItemTokenGenerator(final EncryptRule rule) {
+        this.rule = rule;
+    }
+    
     @Override
     public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
         return sqlStatementContext instanceof SelectStatementContext && 
containsGroupByItem((SelectStatementContext) sqlStatementContext);
@@ -74,10 +77,12 @@ public final class EncryptGroupByItemTokenGenerator 
implements CollectionSQLToke
     @Override
     public Collection<SQLToken> generateSQLTokens(final SelectStatementContext 
sqlStatementContext) {
         Collection<SQLToken> result = new LinkedList<>();
-        for (OrderByItem each : getGroupByItems(sqlStatementContext)) {
-            if (each.getSegment() instanceof ColumnOrderByItemSegment) {
-                ColumnSegment columnSegment = ((ColumnOrderByItemSegment) 
each.getSegment()).getColumn();
-                generateSQLToken(columnSegment, 
sqlStatementContext.getSqlStatement().getDatabaseType()).ifPresent(result::add);
+        for (GroupByContext each : getGroupByItems(sqlStatementContext)) {
+            for (OrderByItem item : each.getItems()) {
+                if (item.getSegment() instanceof ColumnOrderByItemSegment) {
+                    ColumnSegment columnSegment = ((ColumnOrderByItemSegment) 
item.getSegment()).getColumn();
+                    generateSQLToken(columnSegment, 
sqlStatementContext.getSqlStatement().getDatabaseType()).ifPresent(result::add);
+                }
             }
         }
         return result;
@@ -100,8 +105,9 @@ public final class EncryptGroupByItemTokenGenerator 
implements CollectionSQLToke
                         
createColumnProjections(encryptColumn.getCipher().getName(), quoteCharacter, 
databaseType), databaseType)));
     }
     
-    private Collection<OrderByItem> getGroupByItems(final 
SelectStatementContext sqlStatementContext) {
-        Collection<OrderByItem> result = new 
LinkedList<>(sqlStatementContext.getGroupByContext().getItems());
+    private Collection<GroupByContext> getGroupByItems(final 
SelectStatementContext sqlStatementContext) {
+        Collection<GroupByContext> result = new LinkedList<>();
+        result.add(sqlStatementContext.getGroupByContext());
         for (SelectStatementContext each : 
sqlStatementContext.getSubqueryContexts().values()) {
             result.addAll(getGroupByItems(each));
         }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/GroupByContext.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/GroupByContext.java
index a4015508e74..0199d2c1d77 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/GroupByContext.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/GroupByContext.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.infra.binder.context.segment.select.groupby;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.orderby.OrderByItem;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.HavingSegment;
 
 import java.util.Collection;
 
@@ -31,4 +32,11 @@ import java.util.Collection;
 public final class GroupByContext {
     
     private final Collection<OrderByItem> items;
+    
+    private final HavingSegment havingSegment;
+    
+    public GroupByContext(final Collection<OrderByItem> items) {
+        this.items = items;
+        havingSegment = null;
+    }
 }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/engine/GroupByContextEngine.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/engine/GroupByContextEngine.java
index c20ad8dfe24..4c1f36280bf 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/engine/GroupByContextEngine.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/groupby/engine/GroupByContextEngine.java
@@ -49,6 +49,6 @@ public final class GroupByContextEngine {
             }
             groupByItems.add(orderByItem);
         }
-        return new GroupByContext(groupByItems);
+        return new GroupByContext(groupByItems, 
selectStatement.getHaving().orElse(null));
     }
 }

Reply via email to