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));
}
}