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 89384f82b89 Refactor EncryptInsertValueParameterRewriter (#26375)
89384f82b89 is described below
commit 89384f82b895613485882ce53035750392bb5a5b
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jun 15 23:07:25 2023 +0800
Refactor EncryptInsertValueParameterRewriter (#26375)
* Add EncryptTable.isEncryptColumn()
* Refactor EncryptProjectionTokenGenerator
* Refactor PostgreSQLComParseExecutorTest
* Refactor RDLBackendHandlerFactoryTest
* Refactor PostgreSQLStatementVisitor
* Refactor OpenGaussStatementVisitor
* Refactor MySQLStatementVisitor
* Refactor EncryptInsertValueParameterRewriter
---
.../EncryptInsertValueParameterRewriter.java | 45 +++++++-------------
.../shardingsphere/encrypt/rule/EncryptRule.java | 49 ++++++++++++++++++++--
2 files changed, 61 insertions(+), 33 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
index 395060ec471..a1dbad22f9c 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
@@ -18,13 +18,6 @@
package org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
import lombok.Setter;
-import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
-import
org.apache.shardingsphere.encrypt.api.encrypt.assisted.AssistedEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.api.encrypt.like.LikeEncryptAlgorithm;
-import
org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
-import
org.apache.shardingsphere.encrypt.exception.metadata.EncryptAssistedQueryColumnNotFoundException;
-import
org.apache.shardingsphere.encrypt.exception.metadata.EncryptLikeQueryColumnNotFoundException;
import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
@@ -36,7 +29,6 @@ import
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilde
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
import
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
-import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
@@ -76,18 +68,15 @@ public final class EncryptInsertValueParameterRewriter
implements ParameterRewri
String schemaName =
insertStatementContext.getTablesContext().getSchemaName().orElseGet(() ->
DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(),
databaseName));
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
- EncryptContext encryptContext =
EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
- encryptRule.findStandardEncryptor(tableName, columnName).ifPresent(
- optional -> encryptInsertValues(encryptTable.get(),
(GroupedParameterBuilder) paramBuilder, insertStatementContext, optional,
- encryptRule.findAssistedQueryEncryptor(tableName,
columnName).orElse(null),
- encryptRule.findLikeQueryEncryptor(tableName,
columnName).orElse(null), encryptContext));
+ if (encryptRule.findEncryptTable(tableName).map(optional ->
optional.isEncryptColumn(columnName)).orElse(false)) {
+ encryptInsertValues(encryptTable.get(),
(GroupedParameterBuilder) paramBuilder, insertStatementContext, schemaName,
tableName, columnName);
+ }
}
}
private void encryptInsertValues(final EncryptTable encryptTable, final
GroupedParameterBuilder paramBuilder, final InsertStatementContext
insertStatementContext,
- final StandardEncryptAlgorithm<?, ?>
standardEncryptor, final AssistedEncryptAlgorithm<?, ?> assistQueryEncryptor,
- final LikeEncryptAlgorithm<?, ?>
likeQueryEncryptor, final EncryptContext encryptContext) {
- int columnIndex = getColumnIndex(paramBuilder, insertStatementContext,
encryptContext.getColumnName());
+ final String schemaName, final String
tableName, final String columnName) {
+ int columnIndex = getColumnIndex(paramBuilder, insertStatementContext,
columnName);
int count = 0;
for (List<Object> each :
insertStatementContext.getGroupedParameters()) {
int paramIndex =
insertStatementContext.getInsertValueContexts().get(count).getParameterIndex(columnIndex);
@@ -97,7 +86,7 @@ public final class EncryptInsertValueParameterRewriter
implements ParameterRewri
if (expressionSegment instanceof
ParameterMarkerExpressionSegment) {
Object literalValue =
insertStatementContext.getInsertValueContexts().get(count).getLiteralValue(columnIndex)
.orElse(null);
- encryptInsertValue(encryptTable, standardEncryptor,
assistQueryEncryptor, likeQueryEncryptor, paramIndex, literalValue,
standardParamBuilder, encryptContext);
+ encryptInsertValue(encryptTable, paramIndex, literalValue,
standardParamBuilder, schemaName, tableName, columnName);
}
}
count++;
@@ -115,21 +104,17 @@ public final class EncryptInsertValueParameterRewriter
implements ParameterRewri
return columnNames.indexOf(encryptLogicColumnName);
}
- @SuppressWarnings({"rawtypes", "unchecked"})
- private void encryptInsertValue(final EncryptTable encryptTable,
- final StandardEncryptAlgorithm
standardEncryptor, final AssistedEncryptAlgorithm assistQueryEncryptor, final
LikeEncryptAlgorithm likeQueryEncryptor,
- final int paramIndex, final Object
originalValue, final StandardParameterBuilder paramBuilder, final
EncryptContext encryptContext) {
- paramBuilder.addReplacedParameters(paramIndex,
standardEncryptor.encrypt(originalValue, encryptContext));
+ private void encryptInsertValue(final EncryptTable encryptTable, final int
paramIndex, final Object originalValue,
+ final StandardParameterBuilder
paramBuilder, final String schemaName, final String tableName, final String
columnName) {
+ paramBuilder.addReplacedParameters(paramIndex,
encryptRule.encrypt(databaseName, schemaName, tableName, columnName,
originalValue));
Collection<Object> addedParams = new LinkedList<>();
- if (null != assistQueryEncryptor) {
- Optional<String> assistedColumnName =
encryptTable.findAssistedQueryColumn(encryptContext.getColumnName());
-
ShardingSpherePreconditions.checkState(assistedColumnName.isPresent(),
EncryptAssistedQueryColumnNotFoundException::new);
- addedParams.add(assistQueryEncryptor.encrypt(originalValue,
encryptContext));
+ Optional<String> assistedColumnName =
encryptTable.findAssistedQueryColumn(columnName);
+ if (assistedColumnName.isPresent()) {
+
addedParams.add(encryptRule.getEncryptAssistedQueryValue(databaseName,
schemaName, tableName, columnName, originalValue));
}
- if (null != likeQueryEncryptor) {
- Optional<String> likeColumnName =
encryptTable.findLikeQueryColumn(encryptContext.getColumnName());
- ShardingSpherePreconditions.checkState(likeColumnName.isPresent(),
EncryptLikeQueryColumnNotFoundException::new);
- addedParams.add(likeQueryEncryptor.encrypt(originalValue,
encryptContext));
+ Optional<String> likeColumnName =
encryptTable.findLikeQueryColumn(columnName);
+ if (likeColumnName.isPresent()) {
+ addedParams.add(encryptRule.getEncryptLikeQueryValue(databaseName,
schemaName, tableName, columnName, originalValue));
}
if (!addedParams.isEmpty()) {
if
(!paramBuilder.getAddedIndexAndParameters().containsKey(paramIndex)) {
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
index 1b9bd2a8fb6..58e20061113 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
@@ -217,6 +217,28 @@ public final class EncryptRule implements DatabaseRule,
TableContainedRule {
return result;
}
+ /**
+ * Get encrypt assisted query value.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @param logicColumnName logic column name
+ * @param originalValue original value
+ * @return assisted query values
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEncryptAssistedQueryValue(final String databaseName,
final String schemaName, final String tableName, final String logicColumnName,
final Object originalValue) {
+ if (null == originalValue) {
+ return null;
+ }
+ @SuppressWarnings("rawtypes")
+ Optional<AssistedEncryptAlgorithm> assistedQueryEncryptor =
findAssistedQueryEncryptor(tableName, logicColumnName);
+
ShardingSpherePreconditions.checkState(assistedQueryEncryptor.isPresent(), ()
-> new MissingEncryptorException(tableName, logicColumnName, "ASSIST_QUERY"));
+ EncryptContext context = EncryptContextBuilder.build(databaseName,
schemaName, tableName, logicColumnName);
+ return assistedQueryEncryptor.get().encrypt(originalValue, context);
+ }
+
/**
* Get encrypt assisted query values.
*
@@ -245,6 +267,28 @@ public final class EncryptRule implements DatabaseRule,
TableContainedRule {
return result;
}
+ /**
+ * Get encrypt like query value.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @param logicColumnName logic column name
+ * @param originalValue original value
+ * @return like query values
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEncryptLikeQueryValue(final String databaseName, final
String schemaName, final String tableName, final String logicColumnName, final
Object originalValue) {
+ if (null == originalValue) {
+ return null;
+ }
+ @SuppressWarnings("rawtypes")
+ Optional<LikeEncryptAlgorithm> likeQueryEncryptor =
findLikeQueryEncryptor(tableName, logicColumnName);
+ ShardingSpherePreconditions.checkState(likeQueryEncryptor.isPresent(),
() -> new MissingEncryptorException(tableName, logicColumnName, "LIKE_QUERY"));
+ EncryptContext context = EncryptContextBuilder.build(databaseName,
schemaName, tableName, logicColumnName);
+ return likeQueryEncryptor.get().encrypt(originalValue, context);
+ }
+
/**
* Get encrypt like query values.
*
@@ -264,11 +308,10 @@ public final class EncryptRule implements DatabaseRule,
TableContainedRule {
}
@SuppressWarnings("unchecked")
- private List<Object>
getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final
LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues,
- final EncryptContext
encryptContext) {
+ private List<Object>
getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final
LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues,
final EncryptContext context) {
List<Object> result = new LinkedList<>();
for (Object each : originalValues) {
- result.add(null == each ? null : likeQueryEncryptor.encrypt(each,
encryptContext));
+ result.add(null == each ? null : likeQueryEncryptor.encrypt(each,
context));
}
return result;
}