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 0db3f104a41 Refactor EncryptTokenGenerators (#26310)
0db3f104a41 is described below

commit 0db3f104a411d6148dfcd40c565796cf998234ef
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Jun 13 06:11:10 2023 +0800

    Refactor EncryptTokenGenerators (#26310)
    
    * Refactor EncryptIndexColumnTokenGenerator
    
    * Refactor EncryptInsertOnUpdateTokenGenerator
    
    * Refactor EncryptProjectionTokenGenerator
---
 .../EncryptIndexColumnTokenGenerator.java          | 19 +++--
 .../EncryptInsertOnUpdateTokenGenerator.java       | 89 ++++++++++------------
 .../generator/EncryptProjectionTokenGenerator.java | 60 +++++++--------
 .../EncryptInsertOnUpdateTokenGeneratorTest.java   | 14 +++-
 .../EncryptProjectionTokenGeneratorTest.java       |  7 +-
 5 files changed, 96 insertions(+), 93 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
index f2048c64f6d..5edab600cf5 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
@@ -21,6 +21,7 @@ import com.google.common.base.Preconditions;
 import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -56,21 +57,25 @@ public final class EncryptIndexColumnTokenGenerator 
implements CollectionSQLToke
         if (sqlStatementContext.getTablesContext().getTableNames().isEmpty()) {
             return Collections.emptyList();
         }
-        Collection<SQLToken> result = new LinkedList<>();
         String tableName = 
sqlStatementContext.getTablesContext().getTableNames().iterator().next();
+        Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
+        if (!encryptTable.isPresent()) {
+            return Collections.emptyList();
+        }
+        Collection<SQLToken> result = new LinkedList<>();
         for (ColumnSegment each : ((IndexAvailable) 
sqlStatementContext).getIndexColumns()) {
-            encryptRule.findStandardEncryptor(tableName, 
each.getIdentifier().getValue()).flatMap(optional -> getColumnToken(tableName, 
each)).ifPresent(result::add);
+            encryptRule.findStandardEncryptor(tableName, 
each.getIdentifier().getValue()).flatMap(optional -> 
getColumnToken(encryptTable.get(), each)).ifPresent(result::add);
         }
         return result;
     }
     
-    private Optional<SQLToken> getColumnToken(final String tableName, final 
ColumnSegment columnSegment) {
+    private Optional<SQLToken> getColumnToken(final EncryptTable encryptTable, 
final ColumnSegment columnSegment) {
         String columnName = columnSegment.getIdentifier().getValue();
         QuoteCharacter quoteCharacter = 
columnSegment.getIdentifier().getQuoteCharacter();
         int startIndex = columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
-        return encryptRule.findAssistedQueryColumn(tableName, 
columnName).map(optional -> getAssistedQueryColumnToken(startIndex, stopIndex, 
optional, quoteCharacter))
-                .orElseGet(() -> getCipherColumnToken(tableName, startIndex, 
stopIndex, columnName, quoteCharacter));
+        return encryptTable.findAssistedQueryColumn(columnName).map(optional 
-> getAssistedQueryColumnToken(startIndex, stopIndex, optional, quoteCharacter))
+                .orElseGet(() -> getCipherColumnToken(encryptTable, 
startIndex, stopIndex, columnName, quoteCharacter));
     }
     
     private Optional<SQLToken> getAssistedQueryColumnToken(final int 
startIndex, final int stopIndex, final String columnName, final QuoteCharacter 
quoteCharacter) {
@@ -78,8 +83,8 @@ public final class EncryptIndexColumnTokenGenerator 
implements CollectionSQLToke
         return Optional.of(new SubstitutableColumnNameToken(startIndex, 
stopIndex, columnProjections, quoteCharacter));
     }
     
-    private Optional<SQLToken> getCipherColumnToken(final String tableName, 
final int startIndex, final int stopIndex, final String columnName, final 
QuoteCharacter quoteCharacter) {
-        String cipherColumn = encryptRule.getCipherColumn(tableName, 
columnName);
+    private Optional<SQLToken> getCipherColumnToken(final EncryptTable 
encryptTable, final int startIndex, final int stopIndex, final String 
columnName, final QuoteCharacter quoteCharacter) {
+        String cipherColumn = encryptTable.getCipherColumn(columnName);
         Collection<Projection> columnProjections = 
getColumnProjections(cipherColumn, quoteCharacter);
         return Optional.of(new SubstitutableColumnNameToken(startIndex, 
stopIndex, columnProjections, quoteCharacter));
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
index 1765feb3d74..9cd630a7b85 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertOnUpdateTokenGenerator.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptFunctionAssig
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptLiteralAssignmentToken;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptParameterAssignmentToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
@@ -64,16 +65,20 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
     
     @Override
     public Collection<SQLToken> generateSQLTokens(final InsertStatementContext 
insertStatementContext) {
-        Collection<SQLToken> result = new LinkedList<>();
         InsertStatement insertStatement = 
insertStatementContext.getSqlStatement();
         
Preconditions.checkState(InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).isPresent());
         OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment = 
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get();
         Collection<AssignmentSegment> onDuplicateKeyColumnsSegments = 
onDuplicateKeyColumnsSegment.getColumns();
         if (onDuplicateKeyColumnsSegments.isEmpty()) {
-            return result;
+            return Collections.emptyList();
         }
         String schemaName = 
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
 databaseName));
         String tableName = 
insertStatement.getTable().getTableName().getIdentifier().getValue();
+        Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
+        if (!encryptTable.isPresent()) {
+            return Collections.emptyList();
+        }
+        Collection<SQLToken> result = new LinkedList<>();
         for (AssignmentSegment each : onDuplicateKeyColumnsSegments) {
             boolean leftEncryptorPresent = 
encryptRule.findStandardEncryptor(tableName, 
each.getColumns().get(0).getIdentifier().getValue()).isPresent();
             if (each.getValue() instanceof FunctionSegment && 
"VALUES".equalsIgnoreCase(((FunctionSegment) 
each.getValue()).getFunctionName())) {
@@ -86,65 +91,65 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
             if (!leftEncryptorPresent) {
                 continue;
             }
-            generateSQLToken(schemaName, tableName, 
each).ifPresent(result::add);
+            generateSQLToken(schemaName, encryptTable.get(), 
each).ifPresent(result::add);
         }
         return result;
     }
     
-    private Optional<EncryptAssignmentToken> generateSQLToken(final String 
schemaName, final String tableName, final AssignmentSegment assignmentSegment) {
+    private Optional<EncryptAssignmentToken> generateSQLToken(final String 
schemaName, final EncryptTable encryptTable, final AssignmentSegment 
assignmentSegment) {
         if (assignmentSegment.getValue() instanceof 
ParameterMarkerExpressionSegment) {
-            return Optional.of(generateParameterSQLToken(tableName, 
assignmentSegment));
+            return Optional.of(generateParameterSQLToken(encryptTable, 
assignmentSegment));
         }
         if (assignmentSegment.getValue() instanceof FunctionSegment && 
"VALUES".equalsIgnoreCase(((FunctionSegment) 
assignmentSegment.getValue()).getFunctionName())) {
-            return Optional.of(generateValuesSQLToken(tableName, 
assignmentSegment, (FunctionSegment) assignmentSegment.getValue()));
+            return Optional.of(generateValuesSQLToken(encryptTable, 
assignmentSegment, (FunctionSegment) assignmentSegment.getValue()));
         }
         if (assignmentSegment.getValue() instanceof LiteralExpressionSegment) {
-            return Optional.of(generateLiteralSQLToken(schemaName, tableName, 
assignmentSegment));
+            return Optional.of(generateLiteralSQLToken(schemaName, 
encryptTable, assignmentSegment));
         }
         return Optional.empty();
     }
     
-    private EncryptAssignmentToken generateParameterSQLToken(final String 
tableName, final AssignmentSegment assignmentSegment) {
+    private EncryptAssignmentToken generateParameterSQLToken(final 
EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
         EncryptParameterAssignmentToken result = new 
EncryptParameterAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(),
 assignmentSegment.getStopIndex());
         String columnName = 
assignmentSegment.getColumns().get(0).getIdentifier().getValue();
-        addCipherColumn(tableName, columnName, result);
-        addAssistedQueryColumn(tableName, columnName, result);
-        addLikeQueryColumn(tableName, columnName, result);
+        result.addColumnName(encryptTable.getCipherColumn(columnName));
+        
encryptTable.findAssistedQueryColumn(columnName).ifPresent(result::addColumnName);
+        
encryptTable.findLikeQueryColumn(columnName).ifPresent(result::addColumnName);
         return result;
     }
     
-    private EncryptAssignmentToken generateLiteralSQLToken(final String 
schemaName, final String tableName, final AssignmentSegment assignmentSegment) {
+    private EncryptAssignmentToken generateLiteralSQLToken(final String 
schemaName, final EncryptTable encryptTable, final AssignmentSegment 
assignmentSegment) {
         EncryptLiteralAssignmentToken result = new 
EncryptLiteralAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(),
 assignmentSegment.getStopIndex());
-        addCipherAssignment(schemaName, tableName, assignmentSegment, result);
-        addAssistedQueryAssignment(schemaName, tableName, assignmentSegment, 
result);
-        addLikeAssignment(schemaName, tableName, assignmentSegment, result);
+        addCipherAssignment(schemaName, encryptTable, assignmentSegment, 
result);
+        addAssistedQueryAssignment(schemaName, encryptTable, 
assignmentSegment, result);
+        addLikeAssignment(schemaName, encryptTable, assignmentSegment, result);
         return result;
     }
     
-    private EncryptAssignmentToken generateValuesSQLToken(final String 
tableName, final AssignmentSegment assignmentSegment, final FunctionSegment 
functionSegment) {
+    private EncryptAssignmentToken generateValuesSQLToken(final EncryptTable 
encryptTable, final AssignmentSegment assignmentSegment, final FunctionSegment 
functionSegment) {
         ColumnSegment columnSegment = assignmentSegment.getColumns().get(0);
         String column = columnSegment.getIdentifier().getValue();
         ColumnSegment valueColumnSegment = (ColumnSegment) 
functionSegment.getParameters().stream().findFirst().get();
         String valueColumn = valueColumnSegment.getIdentifier().getValue();
         EncryptFunctionAssignmentToken result = new 
EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), 
assignmentSegment.getStopIndex());
-        boolean cipherColumnPresent = 
encryptRule.findStandardEncryptor(tableName, column).isPresent();
-        boolean cipherValueColumnPresent = 
encryptRule.findStandardEncryptor(tableName, valueColumn).isPresent();
+        boolean cipherColumnPresent = 
encryptRule.findStandardEncryptor(encryptTable.getTable(), column).isPresent();
+        boolean cipherValueColumnPresent = 
encryptRule.findStandardEncryptor(encryptTable.getTable(), 
valueColumn).isPresent();
         if (cipherColumnPresent && cipherValueColumnPresent) {
-            String cipherColumn = encryptRule.getCipherColumn(tableName, 
column);
-            String cipherValueColumn = encryptRule.getCipherColumn(tableName, 
valueColumn);
+            String cipherColumn = encryptTable.getCipherColumn(column);
+            String cipherValueColumn = 
encryptTable.getCipherColumn(valueColumn);
             result.addAssignment(cipherColumn, "VALUES(" + cipherValueColumn + 
")");
         } else if (cipherColumnPresent != cipherValueColumnPresent) {
             throw new 
UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, 
valueColumn));
         }
-        Optional<String> assistedQueryColumn = 
encryptRule.findAssistedQueryColumn(tableName, column);
-        Optional<String> valueAssistedQueryColumn = 
encryptRule.findAssistedQueryColumn(tableName, valueColumn);
+        Optional<String> assistedQueryColumn = 
encryptTable.findAssistedQueryColumn(column);
+        Optional<String> valueAssistedQueryColumn = 
encryptTable.findAssistedQueryColumn(valueColumn);
         if (assistedQueryColumn.isPresent() && 
valueAssistedQueryColumn.isPresent()) {
             result.addAssignment(assistedQueryColumn.get(), "VALUES(" + 
valueAssistedQueryColumn.get() + ")");
         } else if (assistedQueryColumn.isPresent() != 
valueAssistedQueryColumn.isPresent()) {
             throw new 
UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, 
valueColumn));
         }
-        Optional<String> likeQueryColumn = 
encryptRule.findLikeQueryColumn(tableName, column);
-        Optional<String> valueLikeQueryColumn = 
encryptRule.findLikeQueryColumn(tableName, valueColumn);
+        Optional<String> likeQueryColumn = 
encryptTable.findLikeQueryColumn(column);
+        Optional<String> valueLikeQueryColumn = 
encryptTable.findLikeQueryColumn(valueColumn);
         if (likeQueryColumn.isPresent() && valueLikeQueryColumn.isPresent()) {
             result.addAssignment(likeQueryColumn.get(), "VALUES(" + 
valueLikeQueryColumn.get() + ")");
         } else if (likeQueryColumn.isPresent() != 
valueLikeQueryColumn.isPresent()) {
@@ -156,41 +161,27 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
         return result;
     }
     
-    private void addCipherColumn(final String tableName, final String 
columnName, final EncryptParameterAssignmentToken token) {
-        token.addColumnName(encryptRule.getCipherColumn(tableName, 
columnName));
-    }
-    
-    private void addAssistedQueryColumn(final String tableName, final String 
columnName, final EncryptParameterAssignmentToken token) {
-        encryptRule.findAssistedQueryColumn(tableName, 
columnName).ifPresent(token::addColumnName);
-    }
-    
-    private void addLikeQueryColumn(final String tableName, final String 
columnName, final EncryptParameterAssignmentToken token) {
-        encryptRule.findLikeQueryColumn(tableName, 
columnName).ifPresent(token::addColumnName);
-    }
-    
-    private void addCipherAssignment(final String schemaName, final String 
tableName, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
+    private void addCipherAssignment(final String schemaName, final 
EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
         Object originalValue = ((LiteralExpressionSegment) 
assignmentSegment.getValue()).getLiterals();
-        Object cipherValue = encryptRule.encrypt(databaseName, schemaName, 
tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(),
+        Object cipherValue = encryptRule.encrypt(databaseName, schemaName, 
encryptTable.getTable(), 
assignmentSegment.getColumns().get(0).getIdentifier().getValue(),
                 Collections.singletonList(originalValue)).iterator().next();
-        token.addAssignment(encryptRule.getCipherColumn(tableName, 
assignmentSegment.getColumns().get(0).getIdentifier().getValue()), cipherValue);
+        
token.addAssignment(encryptTable.getCipherColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()),
 cipherValue);
     }
     
-    private void addAssistedQueryAssignment(final String schemaName, final 
String tableName, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
-        encryptRule.findAssistedQueryColumn(tableName, 
assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional
 -> {
+    private void addAssistedQueryAssignment(final String schemaName, final 
EncryptTable encryptTable, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
+        
encryptTable.findAssistedQueryColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional
 -> {
             Object originalValue = ((LiteralExpressionSegment) 
assignmentSegment.getValue()).getLiterals();
-            Object assistedQueryValue = encryptRule
-                    .getEncryptAssistedQueryValues(databaseName, schemaName, 
tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(), 
Collections.singletonList(originalValue))
-                    .iterator().next();
+            Object assistedQueryValue = 
encryptRule.getEncryptAssistedQueryValues(
+                    databaseName, schemaName, encryptTable.getTable(), 
assignmentSegment.getColumns().get(0).getIdentifier().getValue(), 
Collections.singletonList(originalValue)).iterator().next();
             token.addAssignment(optional, assistedQueryValue);
         });
     }
     
-    private void addLikeAssignment(final String schemaName, final String 
tableName, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
-        encryptRule.findLikeQueryColumn(tableName, 
assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional
 -> {
+    private void addLikeAssignment(final String schemaName, final EncryptTable 
encryptTable, final AssignmentSegment assignmentSegment, final 
EncryptLiteralAssignmentToken token) {
+        
encryptTable.findLikeQueryColumn(assignmentSegment.getColumns().get(0).getIdentifier().getValue()).ifPresent(optional
 -> {
             Object originalValue = ((LiteralExpressionSegment) 
assignmentSegment.getValue()).getLiterals();
-            Object likeValue = encryptRule
-                    .getEncryptLikeQueryValues(databaseName, schemaName, 
tableName, assignmentSegment.getColumns().get(0).getIdentifier().getValue(), 
Collections.singletonList(originalValue))
-                    .iterator().next();
+            Object likeValue = encryptRule.getEncryptLikeQueryValues(
+                    databaseName, schemaName, encryptTable.getTable(), 
assignmentSegment.getColumns().get(0).getIdentifier().getValue(), 
Collections.singletonList(originalValue)).iterator().next();
             token.addAssignment(optional, likeValue);
         });
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index a5e55d3e2cd..5433c1cf0d5 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -21,6 +21,7 @@ import com.google.common.base.Preconditions;
 import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
@@ -80,7 +81,7 @@ public final class EncryptProjectionTokenGenerator implements 
CollectionSQLToken
         return result;
     }
     
-    private void addGenerateSQLTokens(final Collection<SQLToken> result, final 
SelectStatementContext selectStatementContext) {
+    private void addGenerateSQLTokens(final Collection<SQLToken> sqlTokens, 
final SelectStatementContext selectStatementContext) {
         Map<String, String> columnTableNames = 
getColumnTableNames(selectStatementContext);
         for (ProjectionSegment each : 
selectStatementContext.getSqlStatement().getProjections().getProjections()) {
             SubqueryType subqueryType = 
selectStatementContext.getSubqueryType();
@@ -88,27 +89,30 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
                 ColumnProjectionSegment columnSegment = 
(ColumnProjectionSegment) each;
                 ColumnProjection columnProjection = 
buildColumnProjection(columnSegment);
                 String tableName = 
columnTableNames.get(columnProjection.getExpression());
-                if (null != tableName && 
encryptRule.findEncryptTable(tableName).flatMap(optional -> 
optional.findEncryptColumn(columnProjection.getName())).isPresent()) {
-                    result.add(generateSQLToken(tableName, columnSegment, 
columnProjection, subqueryType));
+                if (null == tableName) {
+                    continue;
+                }
+                Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
+                if (!encryptTable.isPresent()) {
+                    continue;
+                }
+                if 
(encryptTable.get().findEncryptColumn(columnProjection.getName()).isPresent()) {
+                    sqlTokens.add(generateSQLToken(encryptTable.get(), 
columnSegment, columnProjection, subqueryType));
                 }
             }
             if (each instanceof ShorthandProjectionSegment) {
                 ShorthandProjectionSegment shorthandSegment = 
(ShorthandProjectionSegment) each;
                 Collection<Projection> actualColumns = 
getShorthandProjection(shorthandSegment, 
selectStatementContext.getProjectionsContext()).getActualColumns();
                 if (!actualColumns.isEmpty()) {
-                    result.add(generateSQLToken(shorthandSegment, 
actualColumns, selectStatementContext, subqueryType, columnTableNames));
+                    sqlTokens.add(generateSQLToken(shorthandSegment, 
actualColumns, selectStatementContext, subqueryType, columnTableNames));
                 }
             }
         }
     }
     
-    private boolean isEncryptColumn(final String tableName, final String 
columnName) {
-        return null != tableName && 
encryptRule.findEncryptTable(tableName).flatMap(optional -> 
optional.findEncryptColumn(columnName)).isPresent();
-    }
-    
-    private SubstitutableColumnNameToken generateSQLToken(final String 
tableName, final ColumnProjectionSegment columnSegment,
+    private SubstitutableColumnNameToken generateSQLToken(final EncryptTable 
encryptTable, final ColumnProjectionSegment columnSegment,
                                                           final 
ColumnProjection columnProjection, final SubqueryType subqueryType) {
-        Collection<Projection> projections = generateProjections(tableName, 
columnProjection, subqueryType, false, null);
+        Collection<Projection> projections = generateProjections(encryptTable, 
columnProjection, subqueryType, false, null);
         int startIndex = columnSegment.getColumn().getOwner().isPresent() ? 
columnSegment.getColumn().getOwner().get().getStopIndex() + 2 : 
columnSegment.getColumn().getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
         return new SubstitutableColumnNameToken(startIndex, stopIndex, 
projections);
@@ -122,7 +126,7 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
             if (null == tableName || 
!encryptRule.findEncryptTable(tableName).flatMap(optional -> 
optional.findEncryptColumn(each.getColumnLabel())).isPresent()) {
                 projections.add(each.getAlias().map(optional -> (Projection) 
new ColumnProjection(null, optional, null)).orElse(each));
             } else if (each instanceof ColumnProjection) {
-                projections.addAll(generateProjections(tableName, 
(ColumnProjection) each, subqueryType, true, segment));
+                encryptRule.findEncryptTable(tableName).ifPresent(optional -> 
projections.addAll(generateProjections(optional, (ColumnProjection) each, 
subqueryType, true, segment)));
             }
         }
         int startIndex = segment.getOwner().isPresent() ? 
segment.getOwner().get().getStartIndex() : segment.getStartIndex();
@@ -150,17 +154,17 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
         return 
selectStatementContext.getTablesContext().findTableNamesByColumnProjection(columns,
 schema);
     }
     
-    private Collection<Projection> generateProjections(final String tableName, 
final ColumnProjection column, final SubqueryType subqueryType, final boolean 
shorthand,
+    private Collection<Projection> generateProjections(final EncryptTable 
encryptTable, final ColumnProjection column, final SubqueryType subqueryType, 
final boolean shorthand,
                                                        final 
ShorthandProjectionSegment segment) {
         Collection<Projection> result = new LinkedList<>();
         if (SubqueryType.PREDICATE_SUBQUERY == subqueryType) {
-            
result.add(distinctOwner(generatePredicateSubqueryProjection(tableName, 
column), shorthand));
+            
result.add(distinctOwner(generatePredicateSubqueryProjection(encryptTable, 
column), shorthand));
         } else if (SubqueryType.TABLE_SUBQUERY == subqueryType) {
-            result.addAll(generateTableSubqueryProjections(tableName, column, 
shorthand));
+            result.addAll(generateTableSubqueryProjections(encryptTable, 
column, shorthand));
         } else if (SubqueryType.EXISTS_SUBQUERY == subqueryType) {
-            result.addAll(generateExistsSubqueryProjections(tableName, column, 
shorthand));
+            result.addAll(generateExistsSubqueryProjections(encryptTable, 
column, shorthand));
         } else {
-            result.add(distinctOwner(generateCommonProjection(tableName, 
column, segment), shorthand));
+            result.add(distinctOwner(generateCommonProjection(encryptTable, 
column, segment), shorthand));
         }
         return result;
     }
@@ -172,43 +176,39 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
         return new ColumnProjection(null, column.getNameIdentifier(), 
column.getAlias().isPresent() ? column.getAliasIdentifier() : null);
     }
     
-    private ColumnProjection generatePredicateSubqueryProjection(final String 
tableName, final ColumnProjection column) {
-        Optional<String> assistedQueryColumn = 
encryptRule.findAssistedQueryColumn(tableName, column.getName());
+    private ColumnProjection generatePredicateSubqueryProjection(final 
EncryptTable encryptTable, final ColumnProjection column) {
+        Optional<String> assistedQueryColumn = 
encryptTable.findAssistedQueryColumn(column.getName());
         if (assistedQueryColumn.isPresent()) {
             return new ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(assistedQueryColumn.get(), 
column.getNameIdentifier().getQuoteCharacter()), null);
         }
-        String cipherColumn = encryptRule.getCipherColumn(tableName, 
column.getName());
+        String cipherColumn = encryptTable.getCipherColumn(column.getName());
         return new ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(cipherColumn, column.getNameIdentifier().getQuoteCharacter()), 
null);
     }
     
-    private Collection<ColumnProjection> 
generateTableSubqueryProjections(final String tableName, final ColumnProjection 
column, final boolean shorthand) {
+    private Collection<ColumnProjection> 
generateTableSubqueryProjections(final EncryptTable encryptTable, final 
ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptRule.getCipherColumn(tableName, column.getName()),
+        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptTable.getCipherColumn(column.getName()),
                 column.getNameIdentifier().getQuoteCharacter()), null), 
shorthand));
-        Optional<String> assistedQueryColumn = 
encryptRule.findAssistedQueryColumn(tableName, column.getName());
+        Optional<String> assistedQueryColumn = 
encryptTable.findAssistedQueryColumn(column.getName());
         assistedQueryColumn.ifPresent(optional -> result.add(new 
ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(optional, 
column.getNameIdentifier().getQuoteCharacter()), null)));
         return result;
     }
     
-    private Collection<ColumnProjection> 
generateExistsSubqueryProjections(final String tableName, final 
ColumnProjection column, final boolean shorthand) {
+    private Collection<ColumnProjection> 
generateExistsSubqueryProjections(final EncryptTable encryptTable, final 
ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptRule.getCipherColumn(tableName, column.getName()),
+        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptTable.getCipherColumn(column.getName()),
                 column.getNameIdentifier().getQuoteCharacter()), null), 
shorthand));
         return result;
     }
     
-    private ColumnProjection generateCommonProjection(final String tableName, 
final ColumnProjection column, final ShorthandProjectionSegment segment) {
-        String encryptColumnName = getEncryptColumnName(tableName, 
column.getName());
+    private ColumnProjection generateCommonProjection(final EncryptTable 
encryptTable, final ColumnProjection column, final ShorthandProjectionSegment 
segment) {
+        String encryptColumnName = 
encryptTable.getCipherColumn(column.getName());
         IdentifierValue owner = (null == segment || 
!segment.getOwner().isPresent()) ? column.getOwnerIdentifier() : 
segment.getOwner().get().getIdentifier();
         return new ColumnProjection(owner, new 
IdentifierValue(encryptColumnName, 
column.getNameIdentifier().getQuoteCharacter()), column.getAlias().isPresent()
                 ? column.getAliasIdentifier()
                 : column.getNameIdentifier());
     }
     
-    private String getEncryptColumnName(final String tableName, final String 
logicEncryptColumnName) {
-        return encryptRule.getCipherColumn(tableName, logicEncryptColumnName);
-    }
-    
     private ShorthandProjection getShorthandProjection(final 
ShorthandProjectionSegment segment, final ProjectionsContext 
projectionsContext) {
         Optional<String> owner = segment.getOwner().isPresent() ? 
Optional.of(segment.getOwner().get().getIdentifier().getValue()) : 
Optional.empty();
         for (Projection each : projectionsContext.getProjections()) {
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
index 16b8e0eecc7..f58011c2599 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptInsertOnUpdateTokenGeneratorTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlg
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptInsertOnUpdateTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptAssignmentToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
@@ -54,23 +55,30 @@ import static org.mockito.Mockito.when;
 
 class EncryptInsertOnUpdateTokenGeneratorTest {
     
-    private EncryptInsertOnUpdateTokenGenerator generator;
+    private final EncryptInsertOnUpdateTokenGenerator generator = new 
EncryptInsertOnUpdateTokenGenerator();
     
     @BeforeEach
     void setup() {
-        generator = new EncryptInsertOnUpdateTokenGenerator();
         generator.setEncryptRule(mockEncryptRule());
     }
     
     private EncryptRule mockEncryptRule() {
         EncryptRule result = mock(EncryptRule.class);
-        when(result.getCipherColumn("t_user", 
"mobile")).thenReturn("cipher_mobile");
+        EncryptTable encryptTable = mockEncryptTable();
+        
when(result.findEncryptTable("t_user")).thenReturn(Optional.of(encryptTable));
         when(result.findStandardEncryptor("t_user", 
"mobile")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
         when(result.findStandardEncryptor("t_user", 
"cipher_mobile")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
         when(result.encrypt(null, "db_test", "t_user", "mobile", 
Collections.singletonList(0))).thenReturn(Collections.singletonList("encryptValue"));
         return result;
     }
     
+    private static EncryptTable mockEncryptTable() {
+        EncryptTable result = mock(EncryptTable.class);
+        when(result.getTable()).thenReturn("t_user");
+        when(result.getCipherColumn("mobile")).thenReturn("cipher_mobile");
+        return result;
+    }
+    
     @Test
     void assertIsNotGenerateSQLTokenWithNotInsertStatement() {
         
assertFalse(generator.isGenerateSQLToken(mock(SelectStatementContext.class)));
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
index c7f05eb366b..d4d9bb9bf67 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
@@ -51,11 +51,10 @@ import static org.mockito.Mockito.when;
 
 class EncryptProjectionTokenGeneratorTest {
     
-    private EncryptProjectionTokenGenerator generator;
+    private final EncryptProjectionTokenGenerator generator = new 
EncryptProjectionTokenGenerator();
     
     @BeforeEach
     void setup() {
-        generator = new EncryptProjectionTokenGenerator();
         generator.setEncryptRule(mockEncryptRule());
         generator.setDatabaseName("db_schema");
         generator.setSchemas(Collections.singletonMap("test", 
mock(ShardingSphereSchema.class)));
@@ -65,8 +64,8 @@ class EncryptProjectionTokenGeneratorTest {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable1 = mock(EncryptTable.class);
         EncryptTable encryptTable2 = mock(EncryptTable.class);
-        
when(encryptTable1.getLogicColumns()).thenReturn(Collections.singletonList("mobile"));
-        
when(encryptTable2.getLogicColumns()).thenReturn(Collections.singletonList("mobile"));
+        
when(encryptTable1.getLogicColumns()).thenReturn(Collections.singleton("mobile"));
+        
when(encryptTable2.getLogicColumns()).thenReturn(Collections.singleton("mobile"));
         
when(result.findEncryptTable("doctor")).thenReturn(Optional.of(encryptTable1));
         
when(result.findEncryptTable("doctor1")).thenReturn(Optional.of(encryptTable2));
         EncryptColumn column = new EncryptColumn("mobile", new 
EncryptColumnItem("mobile", "standard_encryptor"));


Reply via email to