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]