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 {