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 f1e93ffb2e7 Refactor EncryptGroupByItemTokenGenerator (#32402)
f1e93ffb2e7 is described below

commit f1e93ffb2e73c1327fbc7d1a4ff1ee11770d9103
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 5 13:47:59 2024 +0800

    Refactor EncryptGroupByItemTokenGenerator (#32402)
---
 .../EncryptGroupByItemTokenGenerator.java          | 81 +++++++++-------------
 1 file changed, 33 insertions(+), 48 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
index b48717f03e3..9cb72fa1dda 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
@@ -29,7 +29,6 @@ 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.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -53,7 +52,7 @@ import java.util.Optional;
  */
 @HighFrequencyInvocation
 @Setter
-public final class EncryptGroupByItemTokenGenerator implements 
CollectionSQLTokenGenerator<SQLStatementContext>, EncryptRuleAware, 
SchemaMetaDataAware, DatabaseTypeAware {
+public final class EncryptGroupByItemTokenGenerator implements 
CollectionSQLTokenGenerator<SelectStatementContext>, EncryptRuleAware, 
SchemaMetaDataAware, DatabaseTypeAware {
     
     private EncryptRule encryptRule;
     
@@ -65,72 +64,58 @@ public final class EncryptGroupByItemTokenGenerator 
implements CollectionSQLToke
     
     @Override
     public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
-        return sqlStatementContext instanceof SelectStatementContext && 
containsGroupByItem(sqlStatementContext);
+        return sqlStatementContext instanceof SelectStatementContext && 
containsGroupByItem((SelectStatementContext) sqlStatementContext);
+    }
+    
+    private boolean containsGroupByItem(final SelectStatementContext 
sqlStatementContext) {
+        if (!sqlStatementContext.getGroupByContext().getItems().isEmpty()) {
+            return true;
+        }
+        for (SelectStatementContext each : 
sqlStatementContext.getSubqueryContexts().values()) {
+            if (containsGroupByItem(each)) {
+                return true;
+            }
+        }
+        return false;
     }
     
     @Override
-    public Collection<SQLToken> generateSQLTokens(final SQLStatementContext 
sqlStatementContext) {
+    public Collection<SQLToken> generateSQLTokens(final SelectStatementContext 
sqlStatementContext) {
         Collection<SQLToken> result = new LinkedHashSet<>();
-        ShardingSphereSchema schema = ((TableAvailable) 
sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(()
 -> defaultSchema);
+        ShardingSphereSchema schema = 
sqlStatementContext.getTablesContext().getSchemaName().map(schemas::get).orElseGet(()
 -> defaultSchema);
         for (OrderByItem each : getGroupByItems(sqlStatementContext)) {
             if (each.getSegment() instanceof ColumnOrderByItemSegment) {
                 ColumnSegment columnSegment = ((ColumnOrderByItemSegment) 
each.getSegment()).getColumn();
-                Map<String, String> columnTableNames = ((TableAvailable) 
sqlStatementContext).getTablesContext().findTableNames(Collections.singleton(columnSegment),
 schema);
-                
result.addAll(generateSQLTokensWithColumnSegments(Collections.singleton(columnSegment),
 columnTableNames));
+                Map<String, String> columnTableNames = 
sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment),
 schema);
+                generateSQLToken(columnSegment, 
columnTableNames).ifPresent(result::add);
             }
         }
         return result;
     }
     
-    private Collection<SubstitutableColumnNameToken> 
generateSQLTokensWithColumnSegments(final Collection<ColumnSegment> 
columnSegments, final Map<String, String> columnTableNames) {
-        Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
-        for (ColumnSegment each : columnSegments) {
-            String tableName = 
columnTableNames.getOrDefault(each.getExpression(), "");
-            Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
-            String columnName = each.getIdentifier().getValue();
-            if (!encryptTable.isPresent() || 
!encryptTable.get().isEncryptColumn(columnName)) {
-                continue;
-            }
-            int startIndex = each.getOwner().isPresent() ? 
each.getOwner().get().getStopIndex() + 2 : each.getStartIndex();
-            int stopIndex = each.getStopIndex();
-            EncryptColumn encryptColumn = 
encryptTable.get().getEncryptColumn(columnName);
-            SubstitutableColumnNameToken encryptColumnNameToken = 
encryptColumn.getAssistedQuery()
-                    .map(optional -> new 
SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(optional.getName(), 
each.getIdentifier().getQuoteCharacter()), databaseType))
-                    .orElseGet(() -> new 
SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(encryptColumn.getCipher().getName(), 
each.getIdentifier().getQuoteCharacter()),
-                            databaseType));
-            result.add(encryptColumnNameToken);
+    private Optional<SubstitutableColumnNameToken> generateSQLToken(final 
ColumnSegment columnSegment, final Map<String, String> columnTableNames) {
+        Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(columnTableNames.getOrDefault(columnSegment.getExpression(),
 ""));
+        String columnName = columnSegment.getIdentifier().getValue();
+        if (!encryptTable.isPresent() || 
!encryptTable.get().isEncryptColumn(columnName)) {
+            return Optional.empty();
         }
-        return result;
+        EncryptColumn encryptColumn = 
encryptTable.get().getEncryptColumn(columnName);
+        int startIndex = columnSegment.getOwner().isPresent() ? 
columnSegment.getOwner().get().getStopIndex() + 2 : 
columnSegment.getStartIndex();
+        int stopIndex = columnSegment.getStopIndex();
+        return Optional.of(encryptColumn.getAssistedQuery()
+                .map(optional -> new SubstitutableColumnNameToken(startIndex, 
stopIndex, createColumnProjections(optional.getName(), 
columnSegment.getIdentifier().getQuoteCharacter()), databaseType))
+                .orElseGet(() -> new SubstitutableColumnNameToken(startIndex, 
stopIndex, createColumnProjections(encryptColumn.getCipher().getName(),
+                        columnSegment.getIdentifier().getQuoteCharacter()), 
databaseType)));
     }
     
-    private Collection<OrderByItem> getGroupByItems(final SQLStatementContext 
sqlStatementContext) {
-        if (!(sqlStatementContext instanceof SelectStatementContext)) {
-            return Collections.emptyList();
-        }
-        SelectStatementContext statementContext = (SelectStatementContext) 
sqlStatementContext;
-        Collection<OrderByItem> result = new 
LinkedList<>(statementContext.getGroupByContext().getItems());
-        for (SelectStatementContext each : 
statementContext.getSubqueryContexts().values()) {
+    private Collection<OrderByItem> getGroupByItems(final 
SelectStatementContext sqlStatementContext) {
+        Collection<OrderByItem> result = new 
LinkedList<>(sqlStatementContext.getGroupByContext().getItems());
+        for (SelectStatementContext each : 
sqlStatementContext.getSubqueryContexts().values()) {
             result.addAll(getGroupByItems(each));
         }
         return result;
     }
     
-    private boolean containsGroupByItem(final SQLStatementContext 
sqlStatementContext) {
-        if (!(sqlStatementContext instanceof SelectStatementContext)) {
-            return false;
-        }
-        SelectStatementContext statementContext = (SelectStatementContext) 
sqlStatementContext;
-        if (!statementContext.getGroupByContext().getItems().isEmpty()) {
-            return true;
-        }
-        for (SelectStatementContext each : 
statementContext.getSubqueryContexts().values()) {
-            if (containsGroupByItem(each)) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
     private Collection<Projection> createColumnProjections(final String 
columnName, final QuoteCharacter quoteCharacter) {
         return Collections.singleton(new ColumnProjection(null, new 
IdentifierValue(columnName, quoteCharacter), null, databaseType));
     }

Reply via email to