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 bfeb5ffffb8 Split EncryptInsertSelectProjectionTokenGenerator and
EncryptSelectProjectionTokenGenerator (#32285)
bfeb5ffffb8 is described below
commit bfeb5ffffb877ef8a58e7a43e59cf28070476cb8
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jul 26 20:48:43 2024 +0800
Split EncryptInsertSelectProjectionTokenGenerator and
EncryptSelectProjectionTokenGenerator (#32285)
* Split EncryptInsertSelectProjectionTokenGenerator and
EncryptSelectProjectionTokenGenerator
* Split EncryptInsertSelectProjectionTokenGenerator and
EncryptSelectProjectionTokenGenerator
---
.../rewrite/token/EncryptTokenGenerateBuilder.java | 8 ++--
.../InsertSelectColumnsEncryptorComparator.java | 2 +-
...ncryptInsertSelectProjectionTokenGenerator.java | 55 ++++++++++++++++++++++
.../EncryptProjectionTokenGenerator.java | 49 +++++++------------
.../EncryptSelectProjectionTokenGenerator.java | 55 ++++++++++++++++++++++
.../token/EncryptTokenGenerateBuilderTest.java | 4 +-
.../EncryptProjectionTokenGeneratorTest.java | 8 ++--
7 files changed, 139 insertions(+), 42 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
index 6612ac3db59..c661d612735 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
@@ -26,17 +26,18 @@ import
org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptAlterTableTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptAssignmentTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptCreateTableTokenGenerator;
-import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertDefaultColumnsTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptGroupByItemTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptIndexColumnTokenGenerator;
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.EncryptPredicateRightValueTokenGenerator;
-import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptProjectionTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertCipherNameTokenGenerator;
+import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertDefaultColumnsTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertDerivedColumnsTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertOnUpdateTokenGenerator;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertValuesTokenGenerator;
+import
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptInsertSelectProjectionTokenGenerator;
+import
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptSelectProjectionTokenGenerator;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.SQLTokenGenerator;
@@ -62,7 +63,8 @@ public final class EncryptTokenGenerateBuilder implements
SQLTokenGeneratorBuild
@Override
public Collection<SQLTokenGenerator> getSQLTokenGenerators() {
Collection<SQLTokenGenerator> result = new LinkedList<>();
- addSQLTokenGenerator(result, new EncryptProjectionTokenGenerator());
+ addSQLTokenGenerator(result, new
EncryptSelectProjectionTokenGenerator());
+ addSQLTokenGenerator(result, new
EncryptInsertSelectProjectionTokenGenerator());
addSQLTokenGenerator(result, new EncryptAssignmentTokenGenerator());
addSQLTokenGenerator(result, new
EncryptPredicateColumnTokenGenerator());
addSQLTokenGenerator(result, new
EncryptPredicateRightValueTokenGenerator());
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparator.java
index cad76f2942d..704698239b6 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/comparator/InsertSelectColumnsEncryptorComparator.java
@@ -42,7 +42,7 @@ public final class InsertSelectColumnsEncryptorComparator {
* @param insertColumns insert columns
* @param projections projections
* @param encryptRule encrypt rule
- * @return same encryptors or not
+ * @return same encryptors or not
*/
public static boolean isSame(final Collection<ColumnSegment>
insertColumns, final Collection<Projection> projections, final EncryptRule
encryptRule) {
Iterator<ColumnSegment> insertColumnsIterator =
insertColumns.iterator();
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
new file mode 100644
index 00000000000..4b226f6d62a
--- /dev/null
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptInsertSelectProjectionTokenGenerator.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.encrypt.rewrite.token.generator.projection;
+
+import lombok.Setter;
+import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
+import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
+import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
+import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Projection token generator for encrypt.
+ */
+@Setter
+public final class EncryptInsertSelectProjectionTokenGenerator implements
CollectionSQLTokenGenerator<InsertStatementContext>, PreviousSQLTokensAware,
EncryptRuleAware, DatabaseTypeAware {
+
+ private List<SQLToken> previousSQLTokens;
+
+ private EncryptRule encryptRule;
+
+ private DatabaseType databaseType;
+
+ @Override
+ public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
+ return sqlStatementContext instanceof InsertStatementContext && null
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext();
+ }
+
+ @Override
+ public Collection<SQLToken> generateSQLTokens(final InsertStatementContext
sqlStatementContext) {
+ return new EncryptProjectionTokenGenerator(previousSQLTokens,
encryptRule,
databaseType).generateSQLTokens(sqlStatementContext.getInsertSelectContext().getSelectStatementContext());
+ }
+}
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/projection/EncryptProjectionTokenGenerator.java
similarity index 89%
rename from
features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
rename to
features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
index deef748d8e6..7b89c3e43e6 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/projection/EncryptProjectionTokenGenerator.java
@@ -15,11 +15,9 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.encrypt.rewrite.token.generator;
+package org.apache.shardingsphere.encrypt.rewrite.token.generator.projection;
-import lombok.Setter;
-import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
-import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
@@ -29,15 +27,11 @@ import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.ProjectionsContext;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ShorthandProjection;
-import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
-import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
-import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
import
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.sql.parser.statement.core.enums.SubqueryType;
@@ -59,37 +53,28 @@ import java.util.Optional;
/**
* Projection token generator for encrypt.
*/
-@Setter
-public final class EncryptProjectionTokenGenerator implements
CollectionSQLTokenGenerator<SQLStatementContext>, PreviousSQLTokensAware,
EncryptRuleAware, DatabaseTypeAware {
+@RequiredArgsConstructor
+public final class EncryptProjectionTokenGenerator {
- private List<SQLToken> previousSQLTokens;
+ private final List<SQLToken> previousSQLTokens;
- private EncryptRule encryptRule;
+ private final EncryptRule encryptRule;
- private DatabaseType databaseType;
+ private final DatabaseType databaseType;
- @Override
- public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
- return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getTablesContext().getSimpleTables().isEmpty()
- || sqlStatementContext instanceof InsertStatementContext &&
null != ((InsertStatementContext) sqlStatementContext).getInsertSelectContext();
- }
-
- @Override
- public Collection<SQLToken> generateSQLTokens(final SQLStatementContext
sqlStatementContext) {
+ /**
+ * Generate SQL tokens.
+ *
+ * @param selectStatementContext select statement context
+ * @return SQL tokens
+ */
+ public Collection<SQLToken> generateSQLTokens(final SelectStatementContext
selectStatementContext) {
Collection<SQLToken> result = new LinkedHashSet<>();
- if (sqlStatementContext instanceof SelectStatementContext) {
- generateSQLTokens((SelectStatementContext) sqlStatementContext,
result);
- } else if (sqlStatementContext instanceof InsertStatementContext &&
null != ((InsertStatementContext)
sqlStatementContext).getInsertSelectContext()) {
- generateSQLTokens(((InsertStatementContext)
sqlStatementContext).getInsertSelectContext().getSelectStatementContext(),
result);
- }
- return result;
- }
-
- private void generateSQLTokens(final SelectStatementContext
selectStatementContext, final Collection<SQLToken> sqlTokens) {
- addGenerateSQLTokens(sqlTokens, selectStatementContext);
+ addGenerateSQLTokens(result, selectStatementContext);
for (SelectStatementContext each :
selectStatementContext.getSubqueryContexts().values()) {
- addGenerateSQLTokens(sqlTokens, each);
+ addGenerateSQLTokens(result, each);
}
+ return result;
}
private void addGenerateSQLTokens(final Collection<SQLToken> sqlTokens,
final SelectStatementContext selectStatementContext) {
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptSelectProjectionTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptSelectProjectionTokenGenerator.java
new file mode 100644
index 00000000000..90ef56e56ca
--- /dev/null
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptSelectProjectionTokenGenerator.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.encrypt.rewrite.token.generator.projection;
+
+import lombok.Setter;
+import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
+import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
+import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
+import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Projection token generator for encrypt.
+ */
+@Setter
+public final class EncryptSelectProjectionTokenGenerator implements
CollectionSQLTokenGenerator<SelectStatementContext>, PreviousSQLTokensAware,
EncryptRuleAware, DatabaseTypeAware {
+
+ private List<SQLToken> previousSQLTokens;
+
+ private EncryptRule encryptRule;
+
+ private DatabaseType databaseType;
+
+ @Override
+ public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
+ return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getTablesContext().getSimpleTables().isEmpty();
+ }
+
+ @Override
+ public Collection<SQLToken> generateSQLTokens(final SelectStatementContext
sqlStatementContext) {
+ return new EncryptProjectionTokenGenerator(previousSQLTokens,
encryptRule, databaseType).generateSQLTokens(sqlStatementContext);
+ }
+}
diff --git
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
index 8cd5ce07215..ef1eeaefb4b 100644
---
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
+++
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilderTest.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.encrypt.rewrite.token;
import lombok.SneakyThrows;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptOrderByItemTokenGenerator;
-import
org.apache.shardingsphere.encrypt.rewrite.token.generator.EncryptProjectionTokenGenerator;
+import
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptSelectProjectionTokenGenerator;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import
org.apache.shardingsphere.infra.binder.context.segment.select.orderby.OrderByItem;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
@@ -64,7 +64,7 @@ class EncryptTokenGenerateBuilderTest {
assertThat(sqlTokenGenerators.size(), is(2));
Iterator<SQLTokenGenerator> iterator = sqlTokenGenerators.iterator();
SQLTokenGenerator item1 = iterator.next();
- assertThat(item1, instanceOf(EncryptProjectionTokenGenerator.class));
+ assertThat(item1,
instanceOf(EncryptSelectProjectionTokenGenerator.class));
assertSQLTokenGenerator(item1);
SQLTokenGenerator item2 = iterator.next();
assertThat(item2, instanceOf(EncryptOrderByItemTokenGenerator.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 f8323a9535a..da194fdcfcd 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
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.encrypt.rewrite.token.generator;
+import
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptProjectionTokenGenerator;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
@@ -59,14 +60,13 @@ import static org.mockito.Mockito.when;
class EncryptProjectionTokenGeneratorTest {
- private final EncryptProjectionTokenGenerator generator = new
EncryptProjectionTokenGenerator();
-
private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
+ private EncryptProjectionTokenGenerator generator;
+
@BeforeEach
void setup() {
- generator.setEncryptRule(mockEncryptRule());
- generator.setDatabaseType(databaseType);
+ generator = new
EncryptProjectionTokenGenerator(Collections.emptyList(), mockEncryptRule(),
databaseType);
}
private EncryptRule mockEncryptRule() {