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

zhangliang 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 8d95eac397b Refactor EncryptInsertOnUpdateTokenGenerator and 
EncryptInsertValuesTokenGenerator (#26356)
8d95eac397b is described below

commit 8d95eac397bd7504012ca5d533e0a89d46242748
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jun 15 00:48:08 2023 +0800

    Refactor EncryptInsertOnUpdateTokenGenerator and 
EncryptInsertValuesTokenGenerator (#26356)
    
    * Refactor EncryptInsertValuesTokenGenerator
    
    * Refactor EncryptInsertOnUpdateTokenGenerator
    
    * Remove useless getAssistedQueryColumns
---
 .../EncryptInsertOnUpdateTokenGenerator.java       | 15 +++---
 .../insert/EncryptInsertValuesTokenGenerator.java  | 63 +++++++++++-----------
 .../shardingsphere/encrypt/rule/EncryptRule.java   | 12 -----
 .../encrypt/rule/EncryptRuleTest.java              |  5 --
 4 files changed, 39 insertions(+), 56 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
index e14142df32e..e7c5413f7f7 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
@@ -35,7 +35,7 @@ import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQL
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -67,8 +67,7 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
     public Collection<SQLToken> generateSQLTokens(final InsertStatementContext 
insertStatementContext) {
         InsertStatement insertStatement = 
insertStatementContext.getSqlStatement();
         
Preconditions.checkState(InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).isPresent());
-        OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment = 
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get();
-        Collection<AssignmentSegment> onDuplicateKeyColumnsSegments = 
onDuplicateKeyColumnsSegment.getColumns();
+        Collection<AssignmentSegment> onDuplicateKeyColumnsSegments = 
InsertStatementHandler.getOnDuplicateKeyColumnsSegment(insertStatement).get().getColumns();
         if (onDuplicateKeyColumnsSegments.isEmpty()) {
             return Collections.emptyList();
         }
@@ -79,8 +78,9 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
         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())) {
-                ColumnSegment rightColumn = (ColumnSegment) ((FunctionSegment) 
each.getValue()).getParameters().stream().findFirst().get();
-                boolean rightEncryptorPresent = 
encryptRule.findStandardEncryptor(tableName, 
rightColumn.getIdentifier().getValue()).isPresent();
+                Optional<ExpressionSegment> rightColumnSegment = 
((FunctionSegment) each.getValue()).getParameters().stream().findFirst();
+                Preconditions.checkState(rightColumnSegment.isPresent());
+                boolean rightEncryptorPresent = 
encryptRule.findStandardEncryptor(tableName, ((ColumnSegment) 
rightColumnSegment.get()).getIdentifier().getValue()).isPresent();
                 if (!leftEncryptorPresent && !rightEncryptorPresent) {
                     continue;
                 }
@@ -126,8 +126,9 @@ public final class EncryptInsertOnUpdateTokenGenerator 
implements CollectionSQLT
     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();
+        Optional<ExpressionSegment> valueColumnSegment = 
functionSegment.getParameters().stream().findFirst();
+        Preconditions.checkState(valueColumnSegment.isPresent());
+        String valueColumn = ((ColumnSegment) 
valueColumnSegment.get()).getIdentifier().getValue();
         EncryptFunctionAssignmentToken result = new 
EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), 
assignmentSegment.getStopIndex());
         boolean cipherColumnPresent = 
encryptRule.findStandardEncryptor(encryptTable.getTable(), column).isPresent();
         boolean cipherValueColumnPresent = 
encryptRule.findStandardEncryptor(encryptTable.getTable(), 
valueColumn).isPresent();
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
index dc6ea8e7895..6203294f5a1 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
@@ -94,7 +94,7 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
         int count = 0;
         String schemaName = 
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
 databaseName));
         for (InsertValueContext each : 
insertStatementContext.getInsertValueContexts()) {
-            encryptToken(encryptTable, 
insertValuesToken.getInsertValues().get(count), schemaName, tableName, 
insertStatementContext, each);
+            encryptToken(insertValuesToken.getInsertValues().get(count), 
schemaName, encryptTable, insertStatementContext, each);
             count++;
         }
     }
@@ -107,7 +107,7 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
         String schemaName = 
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
 databaseName));
         for (InsertValueContext each : 
insertStatementContext.getInsertValueContexts()) {
             InsertValue insertValueToken = new 
InsertValue(each.getValueExpressions());
-            encryptToken(encryptTable, insertValueToken, schemaName, 
tableName, insertStatementContext, each);
+            encryptToken(insertValueToken, schemaName, encryptTable, 
insertStatementContext, each);
             result.getInsertValues().add(insertValueToken);
         }
         return result;
@@ -129,36 +129,44 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
         return result;
     }
     
-    private void encryptToken(final EncryptTable encryptTable, final 
InsertValue insertValueToken, final String schemaName, final String tableName,
+    private void encryptToken(final InsertValue insertValueToken, final String 
schemaName, final EncryptTable encryptTable,
                               final InsertStatementContext 
insertStatementContext, final InsertValueContext insertValueContext) {
         Optional<SQLToken> useDefaultInsertColumnsToken = 
findPreviousSQLToken(UseDefaultInsertColumnsToken.class);
         Iterator<String> descendingColumnNames = 
insertStatementContext.getDescendingColumnNames();
         while (descendingColumnNames.hasNext()) {
             String columnName = descendingColumnNames.next();
-            Optional<StandardEncryptAlgorithm> standardEncryptor = 
encryptRule.findStandardEncryptor(tableName, columnName);
-            if (standardEncryptor.isPresent()) {
-                int columnIndex = useDefaultInsertColumnsToken.map(optional -> 
((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
-                        .orElseGet(() -> 
insertStatementContext.getColumnNames().indexOf(columnName));
-                Object originalValue = 
insertValueContext.getLiteralValue(columnIndex).orElse(null);
-                EncryptContext encryptContext = 
EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
-                setCipherColumn(insertValueToken, standardEncryptor.get(), 
columnIndex, encryptContext, 
insertValueContext.getValueExpressions().get(columnIndex), originalValue);
-                int indexDelta = 1;
-                if (encryptRule.findAssistedQueryEncryptor(tableName, 
columnName).isPresent()) {
-                    addAssistedQueryColumn(encryptTable,
-                            insertValueToken, 
encryptRule.findAssistedQueryEncryptor(tableName, columnName).get(), 
columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
-                    indexDelta++;
-                }
-                if (encryptRule.findLikeQueryEncryptor(tableName, 
columnName).isPresent()) {
-                    addLikeQueryColumn(encryptTable,
-                            insertValueToken, 
encryptRule.findLikeQueryEncryptor(tableName, columnName).get(), columnIndex, 
encryptContext, insertValueContext, originalValue, indexDelta);
-                }
+            Optional<StandardEncryptAlgorithm> standardEncryptor = 
encryptRule.findStandardEncryptor(encryptTable.getTable(), columnName);
+            if (!standardEncryptor.isPresent()) {
+                continue;
             }
+            int columnIndex = useDefaultInsertColumnsToken.map(optional -> 
((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
+                    .orElseGet(() -> 
insertStatementContext.getColumnNames().indexOf(columnName));
+            Object originalValue = 
insertValueContext.getLiteralValue(columnIndex).orElse(null);
+            EncryptContext encryptContext = 
EncryptContextBuilder.build(databaseName, schemaName, encryptTable.getTable(), 
columnName);
+            setCipherColumn(insertValueToken, standardEncryptor.get(), 
columnIndex, encryptContext, 
insertValueContext.getValueExpressions().get(columnIndex), originalValue);
+            int indexDelta = 1;
+            if 
(encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(), 
columnName).isPresent()) {
+                addAssistedQueryColumn(encryptTable, insertValueToken,
+                        
encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(), 
columnName).get(), columnIndex, encryptContext, insertValueContext, 
originalValue, indexDelta);
+                indexDelta++;
+            }
+            if (encryptRule.findLikeQueryEncryptor(encryptTable.getTable(), 
columnName).isPresent()) {
+                addLikeQueryColumn(encryptTable, insertValueToken,
+                        
encryptRule.findLikeQueryEncryptor(encryptTable.getTable(), columnName).get(), 
columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
+            }
+        }
+    }
+    
+    private void setCipherColumn(final InsertValue insertValueToken, final 
StandardEncryptAlgorithm encryptAlgorithm, final int columnIndex,
+                                 final EncryptContext encryptContext, final 
ExpressionSegment valueExpression, final Object originalValue) {
+        if (valueExpression instanceof LiteralExpressionSegment) {
+            insertValueToken.getValues().set(columnIndex,
+                    new 
LiteralExpressionSegment(valueExpression.getStartIndex(), 
valueExpression.getStopIndex(), encryptAlgorithm.encrypt(originalValue, 
encryptContext)));
         }
     }
     
     private void addAssistedQueryColumn(final EncryptTable encryptTable, final 
InsertValue insertValueToken, final AssistedEncryptAlgorithm 
assistQueryEncryptor, final int columnIndex,
-                                        final EncryptContext encryptContext, 
final InsertValueContext insertValueContext,
-                                        final Object originalValue, final int 
indexDelta) {
+                                        final EncryptContext encryptContext, 
final InsertValueContext insertValueContext, final Object originalValue, final 
int indexDelta) {
         if 
(encryptTable.findAssistedQueryColumn(encryptContext.getColumnName()).isPresent())
 {
             DerivedSimpleExpressionSegment derivedExpressionSegment = 
isAddLiteralExpressionSegment(insertValueContext, columnIndex)
                     ? new 
DerivedLiteralExpressionSegment(assistQueryEncryptor.encrypt(originalValue, 
encryptContext))
@@ -168,8 +176,7 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
     }
     
     private void addLikeQueryColumn(final EncryptTable encryptTable, final 
InsertValue insertValueToken, final LikeEncryptAlgorithm likeQueryEncryptor, 
final int columnIndex,
-                                    final EncryptContext encryptContext, final 
InsertValueContext insertValueContext,
-                                    final Object originalValue, final int 
indexDelta) {
+                                    final EncryptContext encryptContext, final 
InsertValueContext insertValueContext, final Object originalValue, final int 
indexDelta) {
         if 
(encryptTable.findLikeQueryColumn(encryptContext.getColumnName()).isPresent()) {
             DerivedSimpleExpressionSegment derivedExpressionSegment = 
isAddLiteralExpressionSegment(insertValueContext, columnIndex)
                     ? new 
DerivedLiteralExpressionSegment(likeQueryEncryptor.encrypt(originalValue, 
encryptContext))
@@ -191,12 +198,4 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
         }
         return result;
     }
-    
-    private void setCipherColumn(final InsertValue insertValueToken, final 
StandardEncryptAlgorithm encryptAlgorithm, final int columnIndex,
-                                 final EncryptContext encryptContext, final 
ExpressionSegment valueExpression, final Object originalValue) {
-        if (valueExpression instanceof LiteralExpressionSegment) {
-            insertValueToken.getValues().set(columnIndex, new 
LiteralExpressionSegment(
-                    valueExpression.getStartIndex(), 
valueExpression.getStopIndex(), encryptAlgorithm.encrypt(originalValue, 
encryptContext)));
-        }
-    }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
index 05371fc2528..692131c8240 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
@@ -38,8 +38,6 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.TableNamesMapper;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -200,16 +198,6 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
         return result;
     }
     
-    /**
-     * Get assisted query columns.
-     * 
-     * @param tableName table name
-     * @return assisted query columns
-     */
-    public Collection<String> getAssistedQueryColumns(final String tableName) {
-        return 
findEncryptTable(tableName).map(EncryptTable::getAssistedQueryColumns).orElse(Collections.emptyList());
-    }
-    
     /**
      * Get encrypt assisted query values.
      *
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index 18708034105..84b5a551a6c 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -93,11 +93,6 @@ class EncryptRuleTest {
         }
     }
     
-    @Test
-    void assertGetAssistedQueryColumns() {
-        assertFalse(new 
EncryptRule(createEncryptRuleConfiguration()).getAssistedQueryColumns("t_encrypt").isEmpty());
-    }
-    
     @Test
     void assertGetEncryptLikeQueryValues() {
         List<Object> encryptLikeQueryValues = new 
EncryptRule(createEncryptRuleConfiguration())

Reply via email to