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 cf29e9522b6 Refactor EncryptPredicateColumnTokenGenerator (#32376)
cf29e9522b6 is described below

commit cf29e9522b687fcf6ca32d45787d07d87f73e3ae
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Aug 2 23:53:21 2024 +0800

    Refactor EncryptPredicateColumnTokenGenerator (#32376)
---
 .../EncryptPredicateColumnTokenGenerator.java      | 36 +++++++++-------------
 .../fixture/EncryptGeneratorFixtureBuilder.java    |  5 +--
 .../EncryptPredicateColumnTokenGeneratorTest.java  |  3 --
 3 files changed, 18 insertions(+), 26 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
index f0fffa9b072..a74a80eb755 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate;
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException;
-import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.comparator.JoinConditionsEncryptorComparator;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
@@ -61,7 +60,7 @@ import java.util.Optional;
  */
 @HighFrequencyInvocation
 @Setter
-public final class EncryptPredicateColumnTokenGenerator implements 
CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware, 
EncryptRuleAware, DatabaseTypeAware {
+public final class EncryptPredicateColumnTokenGenerator implements 
CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware, 
EncryptRuleAware {
     
     private String databaseName;
     
@@ -69,8 +68,6 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
     
     private EncryptRule encryptRule;
     
-    private DatabaseType databaseType;
-    
     @Override
     public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
         return sqlStatementContext instanceof WhereAvailable && 
!((WhereAvailable) sqlStatementContext).getWhereSegments().isEmpty();
@@ -78,44 +75,41 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
     
     @Override
     public Collection<SQLToken> generateSQLTokens(final SQLStatementContext 
sqlStatementContext) {
-        Collection<ColumnSegment> columnSegments = Collections.emptyList();
-        Collection<WhereSegment> whereSegments = Collections.emptyList();
-        Collection<BinaryOperationExpression> joinConditions = 
Collections.emptyList();
-        if (sqlStatementContext instanceof WhereAvailable) {
-            columnSegments = ((WhereAvailable) 
sqlStatementContext).getColumnSegments();
-            whereSegments = ((WhereAvailable) 
sqlStatementContext).getWhereSegments();
-            joinConditions = ((WhereAvailable) 
sqlStatementContext).getJoinConditions();
-        }
-        
ShardingSpherePreconditions.checkState(JoinConditionsEncryptorComparator.isSame(joinConditions,
 encryptRule),
+        
ShardingSpherePreconditions.checkState(JoinConditionsEncryptorComparator.isSame(((WhereAvailable)
 sqlStatementContext).getJoinConditions(), encryptRule),
                 () -> new UnsupportedSQLOperationException("Can not use 
different encryptor in join condition"));
+        Collection<ColumnSegment> columnSegments = ((WhereAvailable) 
sqlStatementContext).getColumnSegments();
+        Collection<WhereSegment> whereSegments = ((WhereAvailable) 
sqlStatementContext).getWhereSegments();
         String defaultSchema = new 
DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
         ShardingSphereSchema schema = ((TableAvailable) 
sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(()
 -> schemas.get(defaultSchema));
         Map<String, String> columnExpressionTableNames = ((TableAvailable) 
sqlStatementContext).getTablesContext().findTableNames(columnSegments, schema);
-        return generateSQLTokens(columnSegments, columnExpressionTableNames, 
whereSegments);
+        return generateSQLTokens(columnSegments, columnExpressionTableNames, 
whereSegments, sqlStatementContext.getDatabaseType());
     }
     
-    private Collection<SQLToken> generateSQLTokens(final 
Collection<ColumnSegment> columnSegments, final Map<String, String> 
columnExpressionTableNames, final Collection<WhereSegment> whereSegments) {
+    private Collection<SQLToken> generateSQLTokens(final 
Collection<ColumnSegment> columnSegments,
+                                                   final Map<String, String> 
columnExpressionTableNames, final Collection<WhereSegment> whereSegments, final 
DatabaseType databaseType) {
         Collection<SQLToken> result = new 
LinkedHashSet<>(columnSegments.size(), 1F);
         for (ColumnSegment each : columnSegments) {
             String tableName = 
Optional.ofNullable(columnExpressionTableNames.get(each.getExpression())).orElse("");
             Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
             if (encryptTable.isPresent() && 
encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) {
-                
result.add(buildSubstitutableColumnNameToken(encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()),
 each, whereSegments));
+                
result.add(buildSubstitutableColumnNameToken(encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()),
 each, whereSegments, databaseType));
             }
         }
         return result;
     }
     
-    private SubstitutableColumnNameToken 
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn, final 
ColumnSegment columnSegment, final Collection<WhereSegment> whereSegments) {
+    private SubstitutableColumnNameToken 
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn,
+                                                                           
final ColumnSegment columnSegment, final Collection<WhereSegment> 
whereSegments, final DatabaseType databaseType) {
         int startIndex = columnSegment.getOwner().isPresent() ? 
columnSegment.getOwner().get().getStopIndex() + 2 : 
columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
         if (includesLike(whereSegments, columnSegment)) {
             LikeQueryColumnItem likeQueryColumnItem = 
encryptColumn.getLikeQuery().orElseThrow(() -> new 
UnsupportedEncryptSQLException("LIKE"));
-            return new SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(likeQueryColumnItem.getName(), 
columnSegment.getIdentifier().getQuoteCharacter()), databaseType);
+            return new SubstitutableColumnNameToken(
+                    startIndex, stopIndex, 
createColumnProjections(likeQueryColumnItem.getName(), 
columnSegment.getIdentifier().getQuoteCharacter(), databaseType), databaseType);
         }
         Collection<Projection> columnProjections =
-                encryptColumn.getAssistedQuery().map(optional -> 
createColumnProjections(optional.getName(), 
columnSegment.getIdentifier().getQuoteCharacter()))
-                        .orElseGet(() -> 
createColumnProjections(encryptColumn.getCipher().getName(), 
columnSegment.getIdentifier().getQuoteCharacter()));
+                encryptColumn.getAssistedQuery().map(optional -> 
createColumnProjections(optional.getName(), 
columnSegment.getIdentifier().getQuoteCharacter(), databaseType))
+                        .orElseGet(() -> 
createColumnProjections(encryptColumn.getCipher().getName(), 
columnSegment.getIdentifier().getQuoteCharacter(), databaseType));
         return new SubstitutableColumnNameToken(startIndex, stopIndex, 
columnProjections, databaseType);
     }
     
@@ -145,7 +139,7 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
         return columnSegment instanceof ColumnSegment && 
columnSegment.getStartIndex() == targetColumnSegment.getStartIndex() && 
columnSegment.getStopIndex() == targetColumnSegment.getStopIndex();
     }
     
-    private Collection<Projection> createColumnProjections(final String 
columnName, final QuoteCharacter quoteCharacter) {
+    private Collection<Projection> createColumnProjections(final String 
columnName, final QuoteCharacter quoteCharacter, final DatabaseType 
databaseType) {
         return Collections.singleton(new ColumnProjection(null, new 
IdentifierValue(columnName, quoteCharacter), null, databaseType));
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
index 4156459fa7d..303c5a8df1d 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java
@@ -25,11 +25,11 @@ import 
org.apache.shardingsphere.encrypt.config.rule.EncryptColumnRuleConfigurat
 import 
org.apache.shardingsphere.encrypt.config.rule.EncryptTableRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptInsertValuesToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 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.binder.context.statement.dml.UpdateStatementContext;
-import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -56,6 +56,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLInsertStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement;
@@ -164,7 +165,7 @@ public final class EncryptGeneratorFixtureBuilder {
      * @return created update statement context
      */
     public static UpdateStatementContext createUpdateStatementContext() {
-        MySQLUpdateStatement updateStatement = new MySQLUpdateStatement();
+        UpdateStatement updateStatement = new MySQLUpdateStatement();
         updateStatement.setTable(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_user"))));
         updateStatement.setWhere(createWhereSegment());
         updateStatement.setSetAssignment(createSetAssignmentSegment());
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java
index 80173c1d1db..8c1206d76a6 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java
@@ -19,11 +19,9 @@ package 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate;
 
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.fixture.EncryptGeneratorFixtureBuilder;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
 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.infra.spi.type.typed.TypedSPILoader;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -55,7 +53,6 @@ class EncryptPredicateColumnTokenGeneratorTest {
     void assertGenerateSQLTokenFromGenerateNewSQLToken() {
         generator.setDatabaseName(DefaultDatabase.LOGIC_NAME);
         generator.setSchemas(Collections.emptyMap());
-        
generator.setDatabaseType(TypedSPILoader.getService(DatabaseType.class, 
"FIXTURE"));
         Collection<SQLToken> substitutableColumnNameTokens = 
generator.generateSQLTokens(EncryptGeneratorFixtureBuilder.createUpdateStatementContext());
         assertThat(substitutableColumnNameTokens.size(), is(1));
         assertThat(((SubstitutableColumnNameToken) 
substitutableColumnNameTokens.iterator().next()).toString(null), 
is("pwd_assist"));

Reply via email to