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

zhaojinchao 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 89384f82b89 Refactor EncryptInsertValueParameterRewriter (#26375)
89384f82b89 is described below

commit 89384f82b895613485882ce53035750392bb5a5b
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jun 15 23:07:25 2023 +0800

    Refactor EncryptInsertValueParameterRewriter (#26375)
    
    * Add EncryptTable.isEncryptColumn()
    
    * Refactor EncryptProjectionTokenGenerator
    
    * Refactor PostgreSQLComParseExecutorTest
    
    * Refactor RDLBackendHandlerFactoryTest
    
    * Refactor PostgreSQLStatementVisitor
    
    * Refactor OpenGaussStatementVisitor
    
    * Refactor MySQLStatementVisitor
    
    * Refactor EncryptInsertValueParameterRewriter
---
 .../EncryptInsertValueParameterRewriter.java       | 45 +++++++-------------
 .../shardingsphere/encrypt/rule/EncryptRule.java   | 49 ++++++++++++++++++++--
 2 files changed, 61 insertions(+), 33 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
index 395060ec471..a1dbad22f9c 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
@@ -18,13 +18,6 @@
 package org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
 
 import lombok.Setter;
-import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
-import 
org.apache.shardingsphere.encrypt.api.encrypt.assisted.AssistedEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.api.encrypt.like.LikeEncryptAlgorithm;
-import 
org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
-import 
org.apache.shardingsphere.encrypt.exception.metadata.EncryptAssistedQueryColumnNotFoundException;
-import 
org.apache.shardingsphere.encrypt.exception.metadata.EncryptLikeQueryColumnNotFoundException;
 import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
@@ -36,7 +29,6 @@ import 
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilde
 import 
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
 import 
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
 import 
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
-import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
@@ -76,18 +68,15 @@ public final class EncryptInsertValueParameterRewriter 
implements ParameterRewri
         String schemaName = 
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
 databaseName));
         while (descendingColumnNames.hasNext()) {
             String columnName = descendingColumnNames.next();
-            EncryptContext encryptContext = 
EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
-            encryptRule.findStandardEncryptor(tableName, columnName).ifPresent(
-                    optional -> encryptInsertValues(encryptTable.get(), 
(GroupedParameterBuilder) paramBuilder, insertStatementContext, optional,
-                            encryptRule.findAssistedQueryEncryptor(tableName, 
columnName).orElse(null),
-                            encryptRule.findLikeQueryEncryptor(tableName, 
columnName).orElse(null), encryptContext));
+            if (encryptRule.findEncryptTable(tableName).map(optional -> 
optional.isEncryptColumn(columnName)).orElse(false)) {
+                encryptInsertValues(encryptTable.get(), 
(GroupedParameterBuilder) paramBuilder, insertStatementContext, schemaName, 
tableName, columnName);
+            }
         }
     }
     
     private void encryptInsertValues(final EncryptTable encryptTable, final 
GroupedParameterBuilder paramBuilder, final InsertStatementContext 
insertStatementContext,
-                                     final StandardEncryptAlgorithm<?, ?> 
standardEncryptor, final AssistedEncryptAlgorithm<?, ?> assistQueryEncryptor,
-                                     final LikeEncryptAlgorithm<?, ?> 
likeQueryEncryptor, final EncryptContext encryptContext) {
-        int columnIndex = getColumnIndex(paramBuilder, insertStatementContext, 
encryptContext.getColumnName());
+                                     final String schemaName, final String 
tableName, final String columnName) {
+        int columnIndex = getColumnIndex(paramBuilder, insertStatementContext, 
columnName);
         int count = 0;
         for (List<Object> each : 
insertStatementContext.getGroupedParameters()) {
             int paramIndex = 
insertStatementContext.getInsertValueContexts().get(count).getParameterIndex(columnIndex);
@@ -97,7 +86,7 @@ public final class EncryptInsertValueParameterRewriter 
implements ParameterRewri
                 if (expressionSegment instanceof 
ParameterMarkerExpressionSegment) {
                     Object literalValue = 
insertStatementContext.getInsertValueContexts().get(count).getLiteralValue(columnIndex)
                             .orElse(null);
-                    encryptInsertValue(encryptTable, standardEncryptor, 
assistQueryEncryptor, likeQueryEncryptor, paramIndex, literalValue, 
standardParamBuilder, encryptContext);
+                    encryptInsertValue(encryptTable, paramIndex, literalValue, 
standardParamBuilder, schemaName, tableName, columnName);
                 }
             }
             count++;
@@ -115,21 +104,17 @@ public final class EncryptInsertValueParameterRewriter 
implements ParameterRewri
         return columnNames.indexOf(encryptLogicColumnName);
     }
     
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    private void encryptInsertValue(final EncryptTable encryptTable,
-                                    final StandardEncryptAlgorithm 
standardEncryptor, final AssistedEncryptAlgorithm assistQueryEncryptor, final 
LikeEncryptAlgorithm likeQueryEncryptor,
-                                    final int paramIndex, final Object 
originalValue, final StandardParameterBuilder paramBuilder, final 
EncryptContext encryptContext) {
-        paramBuilder.addReplacedParameters(paramIndex, 
standardEncryptor.encrypt(originalValue, encryptContext));
+    private void encryptInsertValue(final EncryptTable encryptTable, final int 
paramIndex, final Object originalValue,
+                                    final StandardParameterBuilder 
paramBuilder, final String schemaName, final String tableName, final String 
columnName) {
+        paramBuilder.addReplacedParameters(paramIndex, 
encryptRule.encrypt(databaseName, schemaName, tableName, columnName, 
originalValue));
         Collection<Object> addedParams = new LinkedList<>();
-        if (null != assistQueryEncryptor) {
-            Optional<String> assistedColumnName = 
encryptTable.findAssistedQueryColumn(encryptContext.getColumnName());
-            
ShardingSpherePreconditions.checkState(assistedColumnName.isPresent(), 
EncryptAssistedQueryColumnNotFoundException::new);
-            addedParams.add(assistQueryEncryptor.encrypt(originalValue, 
encryptContext));
+        Optional<String> assistedColumnName = 
encryptTable.findAssistedQueryColumn(columnName);
+        if (assistedColumnName.isPresent()) {
+            
addedParams.add(encryptRule.getEncryptAssistedQueryValue(databaseName, 
schemaName, tableName, columnName, originalValue));
         }
-        if (null != likeQueryEncryptor) {
-            Optional<String> likeColumnName = 
encryptTable.findLikeQueryColumn(encryptContext.getColumnName());
-            ShardingSpherePreconditions.checkState(likeColumnName.isPresent(), 
EncryptLikeQueryColumnNotFoundException::new);
-            addedParams.add(likeQueryEncryptor.encrypt(originalValue, 
encryptContext));
+        Optional<String> likeColumnName = 
encryptTable.findLikeQueryColumn(columnName);
+        if (likeColumnName.isPresent()) {
+            addedParams.add(encryptRule.getEncryptLikeQueryValue(databaseName, 
schemaName, tableName, columnName, originalValue));
         }
         if (!addedParams.isEmpty()) {
             if 
(!paramBuilder.getAddedIndexAndParameters().containsKey(paramIndex)) {
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 1b9bd2a8fb6..58e20061113 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
@@ -217,6 +217,28 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
         return result;
     }
     
+    /**
+     * Get encrypt assisted query value.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param tableName table name
+     * @param logicColumnName logic column name
+     * @param originalValue original value
+     * @return assisted query values
+     */
+    @SuppressWarnings("unchecked")
+    public Object getEncryptAssistedQueryValue(final String databaseName, 
final String schemaName, final String tableName, final String logicColumnName, 
final Object originalValue) {
+        if (null == originalValue) {
+            return null;
+        }
+        @SuppressWarnings("rawtypes")
+        Optional<AssistedEncryptAlgorithm> assistedQueryEncryptor = 
findAssistedQueryEncryptor(tableName, logicColumnName);
+        
ShardingSpherePreconditions.checkState(assistedQueryEncryptor.isPresent(), () 
-> new MissingEncryptorException(tableName, logicColumnName, "ASSIST_QUERY"));
+        EncryptContext context = EncryptContextBuilder.build(databaseName, 
schemaName, tableName, logicColumnName);
+        return assistedQueryEncryptor.get().encrypt(originalValue, context);
+    }
+    
     /**
      * Get encrypt assisted query values.
      *
@@ -245,6 +267,28 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
         return result;
     }
     
+    /**
+     * Get encrypt like query value.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param tableName table name
+     * @param logicColumnName logic column name
+     * @param originalValue original value
+     * @return like query values
+     */
+    @SuppressWarnings("unchecked")
+    public Object getEncryptLikeQueryValue(final String databaseName, final 
String schemaName, final String tableName, final String logicColumnName, final 
Object originalValue) {
+        if (null == originalValue) {
+            return null;
+        }
+        @SuppressWarnings("rawtypes")
+        Optional<LikeEncryptAlgorithm> likeQueryEncryptor = 
findLikeQueryEncryptor(tableName, logicColumnName);
+        ShardingSpherePreconditions.checkState(likeQueryEncryptor.isPresent(), 
() -> new MissingEncryptorException(tableName, logicColumnName, "LIKE_QUERY"));
+        EncryptContext context = EncryptContextBuilder.build(databaseName, 
schemaName, tableName, logicColumnName);
+        return likeQueryEncryptor.get().encrypt(originalValue, context);
+    }
+    
     /**
      * Get encrypt like query values.
      *
@@ -264,11 +308,10 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
     }
     
     @SuppressWarnings("unchecked")
-    private List<Object> 
getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final 
LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues,
-                                                   final EncryptContext 
encryptContext) {
+    private List<Object> 
getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final 
LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues, 
final EncryptContext context) {
         List<Object> result = new LinkedList<>();
         for (Object each : originalValues) {
-            result.add(null == each ? null : likeQueryEncryptor.encrypt(each, 
encryptContext));
+            result.add(null == each ? null : likeQueryEncryptor.encrypt(each, 
context));
         }
         return result;
     }

Reply via email to