This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 af6a3725cc1 Minor refactor EncryptPredicateColumnTokenGenerator and
EncryptPredicateValueTokenGenerator (#37798)
af6a3725cc1 is described below
commit af6a3725cc1164ce45e57a3f9b348cce7938e929
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jan 21 18:20:14 2026 +0800
Minor refactor EncryptPredicateColumnTokenGenerator and
EncryptPredicateValueTokenGenerator (#37798)
---
.../EncryptPredicateColumnTokenGenerator.java | 20 +++++++++++++-------
.../EncryptPredicateValueTokenGenerator.java | 22 +++++++++++++++-------
2 files changed, 28 insertions(+), 14 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 82b2b87caef..04ac4ccfbcf 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
@@ -17,13 +17,13 @@
package org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate;
-import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.encrypt.enums.EncryptDerivedColumnSuffix;
+import
org.apache.shardingsphere.encrypt.exception.metadata.MissingMatchedEncryptQueryAlgorithmException;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
@@ -35,6 +35,7 @@ import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstitutableColumnNameToken;
@@ -90,7 +91,7 @@ public final class EncryptPredicateColumnTokenGenerator
implements CollectionSQL
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.addAll(buildSubstitutableColumnNameTokens(encryptColumn, each,
expression, sqlStatement.getDatabaseType()));
+
result.addAll(buildSubstitutableColumnNameTokens(encryptColumn, each,
expression, sqlStatement.getDatabaseType(), encryptTable.get().getTable()));
}
}
return result;
@@ -109,14 +110,11 @@ public final class EncryptPredicateColumnTokenGenerator
implements CollectionSQL
}
private Collection<SQLToken> buildSubstitutableColumnNameTokens(final
EncryptColumn encryptColumn, final ColumnSegment columnSegment,
- final
ExpressionSegment expression, final DatabaseType databaseType) {
+ final
ExpressionSegment expression, final DatabaseType databaseType, final String
tableName) {
int startIndex = columnSegment.getOwner().isPresent() ?
columnSegment.getOwner().get().getStopIndex() + 2 :
columnSegment.getStartIndex();
int stopIndex = columnSegment.getStopIndex();
if (isIncludeLike(expression)) {
- Optional<LikeQueryColumnItem> likeQueryColumnItem =
encryptColumn.getLikeQuery();
- Preconditions.checkState(likeQueryColumnItem.isPresent());
- return Collections.singleton(new
SubstitutableColumnNameToken(startIndex, stopIndex, createColumnProjections(
- likeQueryColumnItem.get().getName(), columnSegment,
EncryptDerivedColumnSuffix.LIKE_QUERY, databaseType), databaseType));
+ return generateEncryptLikeTokens(encryptColumn, columnSegment,
databaseType, tableName, startIndex, stopIndex);
}
Collection<Projection> columnProjections =
encryptColumn.getAssistedQuery()
.map(optional -> createColumnProjections(optional.getName(),
columnSegment, EncryptDerivedColumnSuffix.ASSISTED_QUERY, databaseType))
@@ -124,6 +122,14 @@ public final class EncryptPredicateColumnTokenGenerator
implements CollectionSQL
return Collections.singleton(new
SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections,
databaseType));
}
+ private Collection<SQLToken> generateEncryptLikeTokens(final EncryptColumn
encryptColumn, final ColumnSegment columnSegment, final DatabaseType
databaseType,
+ final String
tableName, final int startIndex, final int stopIndex) {
+
ShardingSpherePreconditions.checkState(encryptColumn.getLikeQuery().isPresent()
|| encryptColumn.getCipher().getEncryptor().getMetaData().isSupportLike(),
+ () -> new
MissingMatchedEncryptQueryAlgorithmException(tableName,
columnSegment.getIdentifier().getValue(), "LIKE"));
+ return Collections.singleton(new
SubstitutableColumnNameToken(startIndex, stopIndex,
createColumnProjections(encryptColumn.getLikeQuery().map(LikeQueryColumnItem::getName)
+ .orElseGet(() -> encryptColumn.getCipher().getName()),
columnSegment, EncryptDerivedColumnSuffix.LIKE_QUERY, databaseType),
databaseType));
+ }
+
private boolean isIncludeLike(final ExpressionSegment expression) {
return expression instanceof BinaryOperationExpression &&
("LIKE".equalsIgnoreCase(((BinaryOperationExpression) expression).getOperator())
|| "NOT LIKE".equalsIgnoreCase(((BinaryOperationExpression)
expression).getOperator()));
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
index 235560cdb1f..1c5c64e8f02 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateValueTokenGenerator.java
@@ -30,11 +30,11 @@ import
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptPredicateFunc
import
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptPredicateInRightValueToken;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
-import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
import
org.apache.shardingsphere.infra.binder.context.available.WhereContextAvailable;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
import
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.ParametersAware;
@@ -84,8 +84,8 @@ public final class EncryptPredicateValueTokenGenerator
implements CollectionSQLT
private Optional<SQLToken> generateSQLToken(final String schemaName, final
EncryptTable encryptTable, final EncryptCondition encryptCondition) {
int startIndex = encryptCondition.getStartIndex();
int stopIndex = encryptCondition.getStopIndex();
- Map<Integer, Object> indexValues = getPositionValues(
- encryptCondition.getPositionValueMap().keySet(),
getEncryptedValues(schemaName, encryptTable, encryptCondition, new
EncryptConditionValues(encryptCondition).get(parameters)));
+ Map<Integer, Object> indexValues =
getPositionValues(encryptCondition.getPositionValueMap().keySet(),
+ getEncryptedValues(schemaName, encryptTable, encryptCondition,
new EncryptConditionValues(encryptCondition).get(parameters)));
Collection<Integer> parameterMarkerIndexes =
encryptCondition.getPositionIndexMap().keySet();
if (encryptCondition instanceof EncryptBinaryCondition &&
((EncryptBinaryCondition) encryptCondition).getExpressionSegment() instanceof
FunctionSegment) {
FunctionSegment functionSegment = (FunctionSegment)
((EncryptBinaryCondition) encryptCondition).getExpressionSegment();
@@ -101,18 +101,26 @@ public final class EncryptPredicateValueTokenGenerator
implements CollectionSQLT
private List<Object> getEncryptedValues(final String schemaName, final
EncryptTable encryptTable, final EncryptCondition encryptCondition, final
List<Object> originalValues) {
String columnName =
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalColumn().getValue();
EncryptColumn encryptColumn =
encryptTable.getEncryptColumn(columnName);
+ String tableName =
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalTable().getValue();
if (encryptCondition instanceof EncryptBinaryCondition &&
("LIKE".equalsIgnoreCase(((EncryptBinaryCondition)
encryptCondition).getOperator())
|| "NOT LIKE".equalsIgnoreCase(((EncryptBinaryCondition)
encryptCondition).getOperator()))) {
- LikeQueryColumnItem likeQueryColumnItem =
encryptColumn.getLikeQuery()
- .orElseThrow(() -> new
MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(),
columnName, "LIKE"));
- return likeQueryColumnItem.encrypt(database.getName(), schemaName,
encryptCondition.getTableName(), columnName, originalValues);
+ return getLikeQueryEncryptedValues(schemaName, encryptTable,
encryptCondition, originalValues, encryptColumn, tableName, columnName);
}
- String tableName =
encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalTable().getValue();
return encryptColumn.getAssistedQuery()
.map(optional -> optional.encrypt(database.getName(),
schemaName, tableName,
encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues))
.orElseGet(() ->
encryptColumn.getCipher().encrypt(database.getName(), schemaName, tableName,
encryptCondition.getColumnSegment().getIdentifier().getValue(),
originalValues));
}
+ private List<Object> getLikeQueryEncryptedValues(final String schemaName,
final EncryptTable encryptTable, final EncryptCondition encryptCondition,
+ final List<Object>
originalValues, final EncryptColumn encryptColumn, final String tableName,
final String columnName) {
+
ShardingSpherePreconditions.checkState(encryptColumn.getLikeQuery().isPresent()
|| encryptColumn.getCipher().getEncryptor().getMetaData().isSupportLike(),
+ () -> new
MissingMatchedEncryptQueryAlgorithmException(tableName, columnName, "LIKE"));
+ if (encryptColumn.getLikeQuery().isPresent()) {
+ return
encryptColumn.getLikeQuery().get().encrypt(database.getName(), schemaName,
encryptCondition.getTableName(), columnName, originalValues);
+ }
+ return encryptColumn.getCipher().encrypt(database.getName(),
schemaName, tableName, columnName, originalValues);
+ }
+
private Map<Integer, Object> getPositionValues(final Collection<Integer>
valuePositions, final List<Object> encryptValues) {
Map<Integer, Object> result = new
LinkedHashMap<>(valuePositions.size(), 1F);
for (int each : valuePositions) {