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

panjuan 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 e08176b  Optimize EncryptParameterRewriterBuilder and 
EncryptPredicateColumnTokenGenerator logic (#15708)
e08176b is described below

commit e08176b75d2be800b60a619f06871895cf38acc5
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Mar 2 09:01:33 2022 +0800

    Optimize EncryptParameterRewriterBuilder and 
EncryptPredicateColumnTokenGenerator logic (#15708)
---
 .../context/EncryptSQLRewriteContextDecorator.java     | 12 ++++++++----
 .../parameter/EncryptParameterRewriterBuilder.java     | 18 ++++++++----------
 .../rewrite/token/EncryptTokenGenerateBuilder.java     | 16 +++++++---------
 .../EncryptPredicateColumnTokenGenerator.java          |  5 +----
 .../parameter/EncryptParameterRewriterBuilderTest.java |  4 ++--
 .../rewrite/token/EncryptTokenGenerateBuilderTest.java | 11 +++--------
 6 files changed, 29 insertions(+), 37 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
index d40c8c3..5f6c3fc 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContext;
 import 
org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContextDecorator;
 import 
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.SQLTokenGenerator;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 
@@ -47,13 +48,16 @@ public final class EncryptSQLRewriteContextDecorator 
implements SQLRewriteContex
         SQLStatementContext<?> sqlStatementContext = 
sqlRewriteContext.getSqlStatementContext();
         boolean containsEncryptTable = containsEncryptTable(encryptRule, 
sqlStatementContext);
         encryptRule.setUpEncryptorSchema(sqlRewriteContext.getSchema());
-        if (!sqlRewriteContext.getParameters().isEmpty()) {
+        if (containsEncryptTable && 
!sqlRewriteContext.getParameters().isEmpty()) {
             Collection<ParameterRewriter> parameterRewriters = new 
EncryptParameterRewriterBuilder(encryptRule,
-                    sqlRewriteContext.getSchemaName(), 
sqlRewriteContext.getSchema(), sqlStatementContext, encryptConditions, 
containsEncryptTable).getParameterRewriters();
+                    sqlRewriteContext.getSchemaName(), 
sqlRewriteContext.getSchema(), sqlStatementContext, 
encryptConditions).getParameterRewriters();
             rewriteParameters(sqlRewriteContext, parameterRewriters);
         }
-        sqlRewriteContext.addSQLTokenGenerators(new 
EncryptTokenGenerateBuilder(
-                encryptRule, sqlStatementContext, encryptConditions, 
containsEncryptTable, 
sqlRewriteContext.getSchemaName()).getSQLTokenGenerators());
+        if (containsEncryptTable) {
+            Collection<SQLTokenGenerator> sqlTokenGenerators = new 
EncryptTokenGenerateBuilder(encryptRule, 
+                    sqlStatementContext, encryptConditions, 
sqlRewriteContext.getSchemaName()).getSQLTokenGenerators();
+            sqlRewriteContext.addSQLTokenGenerators(sqlTokenGenerators);
+        }
     }
     
     private Collection<EncryptCondition> getEncryptConditions(final 
EncryptRule encryptRule, final SQLRewriteContext sqlRewriteContext) {
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
index 67b3a74..42a2e70 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
@@ -35,7 +35,6 @@ import 
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewri
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.SchemaMetaDataAware;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedList;
 
 /**
@@ -54,14 +53,9 @@ public final class EncryptParameterRewriterBuilder 
implements ParameterRewriterB
     
     private final Collection<EncryptCondition> encryptConditions;
     
-    private final boolean containsEncryptTable;
-    
     @SuppressWarnings("rawtypes")
     @Override
     public Collection<ParameterRewriter> getParameterRewriters() {
-        if (!containsEncryptTable) {
-            return Collections.emptyList();
-        }
         Collection<ParameterRewriter> result = new LinkedList<>();
         addParameterRewriter(result, new EncryptAssignmentParameterRewriter());
         addParameterRewriter(result, new EncryptPredicateParameterRewriter());
@@ -70,8 +64,15 @@ public final class EncryptParameterRewriterBuilder 
implements ParameterRewriterB
         return result;
     }
     
+    private void addParameterRewriter(final Collection<ParameterRewriter> 
parameterRewriters, final ParameterRewriter<?> toBeAddedParameterRewriter) {
+        if (toBeAddedParameterRewriter.isNeedRewrite(sqlStatementContext)) {
+            setUpParameterRewriter(toBeAddedParameterRewriter);
+            parameterRewriters.add(toBeAddedParameterRewriter);
+        }
+    }
+    
     @SuppressWarnings("rawtypes")
-    private void addParameterRewriter(final Collection<ParameterRewriter> 
parameterRewriters, final ParameterRewriter toBeAddedParameterRewriter) {
+    private void setUpParameterRewriter(final ParameterRewriter 
toBeAddedParameterRewriter) {
         if (toBeAddedParameterRewriter instanceof SchemaMetaDataAware) {
             ((SchemaMetaDataAware) 
toBeAddedParameterRewriter).setSchema(schema);
         }
@@ -87,8 +88,5 @@ public final class EncryptParameterRewriterBuilder implements 
ParameterRewriterB
         if (toBeAddedParameterRewriter instanceof SchemaNameAware) {
             ((SchemaNameAware) 
toBeAddedParameterRewriter).setSchemaName(schemaName);
         }
-        if (toBeAddedParameterRewriter.isNeedRewrite(sqlStatementContext)) {
-            parameterRewriters.add(toBeAddedParameterRewriter);
-        }
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
index acb55df..abf2c67 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
@@ -41,7 +41,6 @@ import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.SQLTokenGener
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.builder.SQLTokenGeneratorBuilder;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedList;
 
 /**
@@ -56,15 +55,10 @@ public final class EncryptTokenGenerateBuilder implements 
SQLTokenGeneratorBuild
     
     private final Collection<EncryptCondition> encryptConditions;
     
-    private final boolean containsEncryptTable;
-    
     private final String schemaName;
     
     @Override
     public Collection<SQLTokenGenerator> getSQLTokenGenerators() {
-        if (!containsEncryptTable) {
-            return Collections.emptyList();
-        }
         Collection<SQLTokenGenerator> result = new LinkedList<>();
         addSQLTokenGenerator(result, new EncryptProjectionTokenGenerator());
         addSQLTokenGenerator(result, new EncryptAssignmentTokenGenerator());
@@ -82,6 +76,13 @@ public final class EncryptTokenGenerateBuilder implements 
SQLTokenGeneratorBuild
     }
     
     private void addSQLTokenGenerator(final Collection<SQLTokenGenerator> 
sqlTokenGenerators, final SQLTokenGenerator toBeAddedSQLTokenGenerator) {
+        if 
(toBeAddedSQLTokenGenerator.isGenerateSQLToken(sqlStatementContext)) {
+            setUpSQLTokenGenerator(toBeAddedSQLTokenGenerator);
+            sqlTokenGenerators.add(toBeAddedSQLTokenGenerator);
+        }
+    }
+    
+    private void setUpSQLTokenGenerator(final SQLTokenGenerator 
toBeAddedSQLTokenGenerator) {
         if (toBeAddedSQLTokenGenerator instanceof EncryptRuleAware) {
             ((EncryptRuleAware) 
toBeAddedSQLTokenGenerator).setEncryptRule(encryptRule);
         }
@@ -94,8 +95,5 @@ public final class EncryptTokenGenerateBuilder implements 
SQLTokenGeneratorBuild
         if (toBeAddedSQLTokenGenerator instanceof SchemaNameAware) {
             ((SchemaNameAware) 
toBeAddedSQLTokenGenerator).setSchemaName(schemaName);
         }
-        if 
(toBeAddedSQLTokenGenerator.isGenerateSQLToken(sqlStatementContext)) {
-            sqlTokenGenerators.add(toBeAddedSQLTokenGenerator);
-        }
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
index 839dac8..b5219dd 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.encrypt.rule.aware.EncryptRuleAware;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.type.WhereAvailable;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
@@ -56,9 +55,7 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
     @SuppressWarnings("rawtypes")
     @Override
     public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
-        boolean containsJoinQuery = sqlStatementContext instanceof 
SelectStatementContext && ((SelectStatementContext) 
sqlStatementContext).isContainsJoinQuery();
-        boolean containsSubquery = sqlStatementContext instanceof 
SelectStatementContext && ((SelectStatementContext) 
sqlStatementContext).isContainsSubquery();
-        return containsJoinQuery || containsSubquery || (sqlStatementContext 
instanceof WhereAvailable && !((WhereAvailable) 
sqlStatementContext).getWhereSegments().isEmpty());
+        return sqlStatementContext instanceof WhereAvailable && 
!((WhereAvailable) sqlStatementContext).getWhereSegments().isEmpty();
     }
     
     @SuppressWarnings("rawtypes")
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilderTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilderTest.java
index 624192f..529ec4e 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilderTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilderTest.java
@@ -48,7 +48,7 @@ public final class EncryptParameterRewriterBuilderTest {
         SQLStatementContext<?> sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singletonList("t_order"));
         Collection<ParameterRewriter> actual = new 
EncryptParameterRewriterBuilder(
-                encryptRule, DefaultSchema.LOGIC_NAME, shardingSphereSchema, 
sqlStatementContext, Collections.emptyList(), true).getParameterRewriters();
+                encryptRule, DefaultSchema.LOGIC_NAME, shardingSphereSchema, 
sqlStatementContext, Collections.emptyList()).getParameterRewriters();
         assertThat(actual.size(), is(1));
         ParameterRewriter parameterRewriter = actual.iterator().next();
         assertThat(parameterRewriter, 
instanceOf(EncryptPredicateParameterRewriter.class));
@@ -64,7 +64,7 @@ public final class EncryptParameterRewriterBuilderTest {
         
when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singletonList("t_order"));
         
when(sqlStatementContext.getWhereSegments()).thenReturn(Collections.emptyList());
         Collection<ParameterRewriter> actual = new 
EncryptParameterRewriterBuilder(
-                encryptRule, DefaultSchema.LOGIC_NAME, shardingSphereSchema, 
sqlStatementContext, Collections.emptyList(), true).getParameterRewriters();
+                encryptRule, DefaultSchema.LOGIC_NAME, shardingSphereSchema, 
sqlStatementContext, Collections.emptyList()).getParameterRewriters();
         assertThat(actual.size(), is(0));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
index aa5a700..b24dbc5 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.encrypt.rewrite.token;
 
 import 
org.apache.shardingsphere.encrypt.rewrite.aware.QueryWithCipherColumnAware;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptOrderByItemTokenGenerator;
-import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptPredicateColumnTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptProjectionTokenGenerator;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.aware.EncryptRuleAware;
@@ -66,22 +65,18 @@ public final class EncryptTokenGenerateBuilderTest {
         
when(selectStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singletonList("table"));
         
when(selectStatementContext.getOrderByContext().getItems()).thenReturn(Collections.singletonList(mock(OrderByItem.class)));
         
when(selectStatementContext.getGroupByContext().getItems()).thenReturn(Collections.emptyList());
-        when(selectStatementContext.isContainsJoinQuery()).thenReturn(true);
         
when(selectStatementContext.getWhereSegments()).thenReturn(Collections.emptyList());
         EncryptTokenGenerateBuilder encryptTokenGenerateBuilder = new 
EncryptTokenGenerateBuilder(
-                encryptRule, selectStatementContext, Collections.emptyList(), 
true, DefaultSchema.LOGIC_NAME);
+                encryptRule, selectStatementContext, Collections.emptyList(), 
DefaultSchema.LOGIC_NAME);
         Collection<SQLTokenGenerator> sqlTokenGenerators = 
encryptTokenGenerateBuilder.getSQLTokenGenerators();
-        assertThat(sqlTokenGenerators.size(), is(3));
+        assertThat(sqlTokenGenerators.size(), is(2));
         Iterator<SQLTokenGenerator> iterator = sqlTokenGenerators.iterator();
         SQLTokenGenerator item1 = iterator.next();
         assertThat(item1, instanceOf(EncryptProjectionTokenGenerator.class));
         assertSqlTokenGenerator(item1);
         SQLTokenGenerator item2 = iterator.next();
-        assertThat(item2, 
instanceOf(EncryptPredicateColumnTokenGenerator.class));
+        assertThat(item2, instanceOf(EncryptOrderByItemTokenGenerator.class));
         assertSqlTokenGenerator(item2);
-        SQLTokenGenerator item3 = iterator.next();
-        assertThat(item3, instanceOf(EncryptOrderByItemTokenGenerator.class));
-        assertSqlTokenGenerator(item3);
     }
     
     private void assertSqlTokenGenerator(final SQLTokenGenerator 
sqlTokenGenerator) throws IllegalAccessException {

Reply via email to