strongduanmu commented on a change in pull request #13065:
URL: https://github.com/apache/shardingsphere/pull/13065#discussion_r730515272



##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
##########
@@ -28,40 +36,37 @@
 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;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.RewriteMetaDataAware;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.SchemaMetaDataAware;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
 import org.apache.shardingsphere.sql.parser.sql.common.util.WhereExtractUtil;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
+import lombok.Setter;
 
 /**
  * Predicate column token generator for encrypt.
  */
 @Setter
-public final class EncryptPredicateColumnTokenGenerator extends 
BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator, 
SchemaMetaDataAware, QueryWithCipherColumnAware {
+public final class EncryptPredicateColumnTokenGenerator extends 
BaseEncryptSQLTokenGenerator implements CollectionSQLTokenGenerator, 
SchemaMetaDataAware, 
+    QueryWithCipherColumnAware, RewriteMetaDataAware {
     
     private ShardingSphereSchema schema;
     
     private boolean queryWithCipherColumn;
     
+    private Map<String, Map<String, Optional<String>>> rewriteMetaDataMap;

Review comment:
       @cheese8 Can we move this map to the context for initialization? And 
remove RewriteMetaDataAware interface.

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
##########
@@ -112,26 +132,39 @@ private boolean isToGeneratedSQLToken(final 
ProjectionSegment projectionSegment,
         return ownerSegment.map(segment -> 
selectStatementContext.getTablesContext().findTableNameFromSQL(segment.getIdentifier().getValue()).orElse("").equalsIgnoreCase(tableName)).orElse(true);
     }
     
-    private SubstitutableColumnNameToken generateSQLToken(final 
ColumnProjectionSegment segment, final String tableName, final boolean 
insertSelect) {
+    private SubstitutableColumnNameToken generateSQLToken(final 
ColumnProjectionSegment segment, final String tableName, final Optional<String> 
alias, final boolean insertSelect, 
+            final boolean subquery, final boolean inProjectionOrTabSegment, 
final boolean inExpression) {
         String encryptColumnName = getEncryptColumnName(tableName, 
segment.getColumn().getIdentifier().getValue());
         Collection<ColumnProjection> projections = new LinkedList<>();
         if (insertSelect) {
-            projections.add(new ColumnProjection(null, encryptColumnName, 
null));
-            Optional<String> assistedQueryColumn = 
findAssistedQueryColumn(tableName, 
segment.getColumn().getIdentifier().getValue());
-            assistedQueryColumn.ifPresent(each -> projections.add(new 
ColumnProjection(null, assistedQueryColumn.get(), null)));
-            Optional<String> plainColumn = 
getEncryptRule().findPlainColumn(tableName, 
segment.getColumn().getIdentifier().getValue());
-            plainColumn.ifPresent(each -> projections.add(new 
ColumnProjection(null, plainColumn.get(), null)));
-        } else {
-            String alias = 
segment.getAlias().orElse(segment.getColumn().getIdentifier().getValue());
-            projections.addAll(Collections.singletonList(new 
ColumnProjection(null, encryptColumnName, alias)));
+            projections.add(cipherColumnProjection(encryptColumnName, null));
+            assistedQueryColumnProjection(segment, 
tableName).ifPresent(projections::add);
+            plainColumnProjection(segment, 
tableName).ifPresent(projections::add);
+        }
+        if (subquery) {

Review comment:
       The logic of this method is too complicated, can it be split into 
multiple methods to implement it?

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
##########
@@ -68,30 +73,44 @@ protected boolean isGenerateSQLTokenForEncrypt(final 
SQLStatementContext sqlStat
     public Collection<SubstitutableColumnNameToken> generateSQLTokens(final 
SQLStatementContext sqlStatementContext) {
         Collection<SubstitutableColumnNameToken> result = new 
LinkedHashSet<>();
         if (sqlStatementContext instanceof InsertStatementContext) {
-            result.addAll(generateSQLTokens(((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext(), 
true));
+            result.addAll(generateSQLTokens(((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext(), 
Optional.empty(), true, false, false, false));
         }
         if (sqlStatementContext instanceof SelectStatementContext) {
-            result.addAll(generateSQLTokens((SelectStatementContext) 
sqlStatementContext, false));
+            SelectStatementContext selectStatementContext = 
(SelectStatementContext) sqlStatementContext;
+            result.addAll(generateSQLTokens(selectStatementContext, 
Optional.empty(), false, false, false, false));
+            if (selectStatementContext.isContainsSubquery()) {
+                
SubqueryExtractUtil.getSubquerySegmentsFromProjections(selectStatementContext.getSqlStatement().getProjections()).forEach(each
 -> result.addAll(generateSQLTokens(
+                        new 
SelectStatementContext(selectStatementContext.getMetaDataMap(), 
selectStatementContext.getParameters(), each.getSelect(), 

Review comment:
       The same problem, don't initialize SelectStatementContext multiple times.

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
##########
@@ -77,12 +82,19 @@ protected boolean isGenerateSQLTokenForEncrypt(final 
SQLStatementContext sqlStat
         Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
         for (ExpressionSegment each : predicates) {
             for (ColumnSegment column : ColumnExtractor.extract(each)) {
+                int startIndex = column.getOwner().isPresent() ? 
column.getOwner().get().getStopIndex() + 2 : column.getStartIndex();
+                int stopIndex = column.getStopIndex();
+                if (queryWithCipherColumn && !rewriteMetaDataMap.isEmpty()) {
+                    Map<String, Optional<String>> value = 
rewriteMetaDataMap.get(column.getOwner().get().getIdentifier().getValue());

Review comment:
       Please modify this structure, do not include optional types in the map.

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
##########
@@ -102,21 +114,40 @@ protected boolean isGenerateSQLTokenForEncrypt(final 
SQLStatementContext sqlStat
     
     private Collection<WhereSegment> getWhereSegments(final 
SQLStatementContext<?> sqlStatementContext) {
         Collection<WhereSegment> result = new LinkedList<>();
-        if (sqlStatementContext instanceof WhereAvailable && ((WhereAvailable) 
sqlStatementContext).getWhere().isPresent()) {
-            result.add(((WhereAvailable) 
sqlStatementContext).getWhere().get());
-        }
-        if (sqlStatementContext instanceof SelectStatementContext && 
((SelectStatementContext) sqlStatementContext).isContainsJoinQuery()) {
-            
result.addAll(WhereExtractUtil.getJoinWhereSegments((SelectStatement) 
sqlStatementContext.getSqlStatement()));
+        result.addAll(getWhereSegmentsFromWhereAvailable(sqlStatementContext));
+        if (sqlStatementContext instanceof SelectStatementContext) {
+            SelectStatementContext selectStatementContext = 
(SelectStatementContext) sqlStatementContext;
+            result.addAll(getWhereSegmentsOnJoinQuery(selectStatementContext));
+            if (selectStatementContext.isContainsSubquery()) {
+                selectStatementContext.getSubquerySegments().forEach(each -> {
+                    SelectStatementContext subuqerySelectStatementContext = 
new SelectStatementContext(selectStatementContext.getMetaDataMap(), 

Review comment:
       @cheese8 Please avoid initializing SelectStatementContext multiple 
times, it initializes many other unnecessary content internally, which will 
affect performance.

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
##########
@@ -77,12 +82,19 @@ protected boolean isGenerateSQLTokenForEncrypt(final 
SQLStatementContext sqlStat
         Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
         for (ExpressionSegment each : predicates) {
             for (ColumnSegment column : ColumnExtractor.extract(each)) {
+                int startIndex = column.getOwner().isPresent() ? 
column.getOwner().get().getStopIndex() + 2 : column.getStartIndex();
+                int stopIndex = column.getStopIndex();
+                if (queryWithCipherColumn && !rewriteMetaDataMap.isEmpty()) {
+                    Map<String, Optional<String>> value = 
rewriteMetaDataMap.get(column.getOwner().get().getIdentifier().getValue());
+                    if (value != null && 
value.containsKey(column.getIdentifier().getValue())) {

Review comment:
       `null` is best placed on the left.

##########
File path: 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptProjectionTokenGenerator.java
##########
@@ -52,12 +55,14 @@
  */
 @Setter
 public final class EncryptProjectionTokenGenerator extends 
BaseEncryptSQLTokenGenerator 
-        implements CollectionSQLTokenGenerator<SQLStatementContext>, 
QueryWithCipherColumnAware, PreviousSQLTokensAware {
+        implements CollectionSQLTokenGenerator<SQLStatementContext>, 
QueryWithCipherColumnAware, PreviousSQLTokensAware, RewriteMetaDataAware {
     
     private boolean queryWithCipherColumn;
     
     private List<SQLToken> previousSQLTokens;
     
+    private Map<String, Map<String, Optional<String>>> rewriteMetaDataMap;

Review comment:
       @cheese8 Please move this map to SelectStatementContext.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to