This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 72d9c226abf Refactor EncryptPredicateColumnTokenGenerator encrypt
logic (#34383)
72d9c226abf is described below
commit 72d9c226abf24e2f8c2c6d2e3a3a0ecfd6d7fb99
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jan 17 14:49:11 2025 +0800
Refactor EncryptPredicateColumnTokenGenerator encrypt logic (#34383)
---
.../EncryptPredicateColumnTokenGenerator.java | 32 +++++++++++++---------
1 file changed, 19 insertions(+), 13 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 20bfe4ee544..8497bb70a98 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
@@ -69,26 +69,35 @@ public final class EncryptPredicateColumnTokenGenerator
implements CollectionSQL
Collection<SelectStatementContext> allSubqueryContexts =
SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext);
Collection<WhereSegment> whereSegments =
SQLStatementContextExtractor.getWhereSegments((WhereAvailable)
sqlStatementContext, allSubqueryContexts);
Collection<ColumnSegment> columnSegments =
SQLStatementContextExtractor.getColumnSegments((WhereAvailable)
sqlStatementContext, allSubqueryContexts);
- return generateSQLTokens(columnSegments, whereSegments,
sqlStatementContext.getDatabaseType());
+ Collection<AndPredicate> andPredicates =
getAndPredicates(whereSegments);
+ return generateSQLTokens(columnSegments, andPredicates,
sqlStatementContext);
}
- private Collection<SQLToken> generateSQLTokens(final
Collection<ColumnSegment> columnSegments, final Collection<WhereSegment>
whereSegments, final DatabaseType databaseType) {
+ private Collection<SQLToken> generateSQLTokens(final
Collection<ColumnSegment> columnSegments, final Collection<AndPredicate>
andPredicates, final SQLStatementContext sqlStatementContext) {
Collection<SQLToken> result = new LinkedList<>();
for (ColumnSegment each : columnSegments) {
Optional<EncryptTable> encryptTable =
rule.findEncryptTable(each.getColumnBoundInfo().getOriginalTable().getValue());
if (encryptTable.isPresent() &&
encryptTable.get().isEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue()))
{
EncryptColumn encryptColumn =
encryptTable.get().getEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue());
- result.add(buildSubstitutableColumnNameToken(encryptColumn,
each, whereSegments, databaseType));
+ result.add(buildSubstitutableColumnNameToken(encryptColumn,
each, andPredicates, sqlStatementContext.getDatabaseType()));
}
}
return result;
}
- private SubstitutableColumnNameToken
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn,
-
final ColumnSegment columnSegment, final Collection<WhereSegment>
whereSegments, final DatabaseType databaseType) {
+ private Collection<AndPredicate> getAndPredicates(final
Collection<WhereSegment> whereSegments) {
+ Collection<AndPredicate> result = new LinkedList<>();
+ for (WhereSegment each : whereSegments) {
+
result.addAll(ExpressionExtractor.extractAndPredicates(each.getExpr()));
+ }
+ return result;
+ }
+
+ private SubstitutableColumnNameToken
buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn, final
ColumnSegment columnSegment,
+
final Collection<AndPredicate> andPredicates, final DatabaseType databaseType) {
int startIndex = columnSegment.getOwner().isPresent() ?
columnSegment.getOwner().get().getStopIndex() + 2 :
columnSegment.getStartIndex();
int stopIndex = columnSegment.getStopIndex();
- if (includesLike(whereSegments, columnSegment)) {
+ if (includesLike(andPredicates, columnSegment)) {
Optional<LikeQueryColumnItem> likeQueryColumnItem =
encryptColumn.getLikeQuery();
Preconditions.checkState(likeQueryColumnItem.isPresent());
return new SubstitutableColumnNameToken(
@@ -100,13 +109,10 @@ public final class EncryptPredicateColumnTokenGenerator
implements CollectionSQL
return new SubstitutableColumnNameToken(startIndex, stopIndex,
columnProjections, databaseType);
}
- private boolean includesLike(final Collection<WhereSegment> whereSegments,
final ColumnSegment targetColumnSegment) {
- for (WhereSegment each : whereSegments) {
- Collection<AndPredicate> andPredicates =
ExpressionExtractor.extractAndPredicates(each.getExpr());
- for (AndPredicate andPredicate : andPredicates) {
- if (isLikeColumnSegment(andPredicate, targetColumnSegment)) {
- return true;
- }
+ private boolean includesLike(final Collection<AndPredicate> andPredicates,
final ColumnSegment targetColumnSegment) {
+ for (AndPredicate each : andPredicates) {
+ if (isLikeColumnSegment(each, targetColumnSegment)) {
+ return true;
}
}
return false;