This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 c7d5e37fbf3 Refactor EncryptProjectionTokenGenerator (#32277)
c7d5e37fbf3 is described below
commit c7d5e37fbf32415bd5d3bf51b29d729d6b288fe2
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jul 26 11:37:30 2024 +0800
Refactor EncryptProjectionTokenGenerator (#32277)
* Remove useless codes on EncryptAlgorithmMetaData
* Refactor EncryptProjectionTokenGenerator
---
.../generator/EncryptProjectionTokenGenerator.java | 36 ++++++++++-
.../token/util/EncryptTokenGeneratorUtils.java | 75 ----------------------
2 files changed, 33 insertions(+), 78 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index db1521ec783..deef748d8e6 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -20,10 +20,10 @@ package
org.apache.shardingsphere.encrypt.rewrite.token.generator;
import lombok.Setter;
import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseTypeAware;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
-import
org.apache.shardingsphere.encrypt.rewrite.token.util.EncryptTokenGeneratorUtils;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
+import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
+import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.DerivedColumn;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.ProjectionsContext;
@@ -41,10 +41,12 @@ import
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.Previou
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
import
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.sql.parser.statement.core.enums.SubqueryType;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import java.util.Collection;
@@ -92,7 +94,7 @@ public final class EncryptProjectionTokenGenerator implements
CollectionSQLToken
private void addGenerateSQLTokens(final Collection<SQLToken> sqlTokens,
final SelectStatementContext selectStatementContext) {
ShardingSpherePreconditions.checkState(
- !selectStatementContext.isContainsCombine() ||
!EncryptTokenGeneratorUtils.containsEncryptProjectionInCombineStatement(selectStatementContext,
encryptRule),
+ !selectStatementContext.isContainsCombine() ||
!containsEncryptProjectionInCombineStatement(selectStatementContext),
() -> new UnsupportedSQLOperationException("Can not support
encrypt projection in combine statement"));
for (ProjectionSegment each :
selectStatementContext.getSqlStatement().getProjections().getProjections()) {
SubqueryType subqueryType =
selectStatementContext.getSubqueryType();
@@ -117,6 +119,34 @@ public final class EncryptProjectionTokenGenerator
implements CollectionSQLToken
}
}
+ private boolean containsEncryptProjectionInCombineStatement(final
SelectStatementContext selectStatementContext) {
+ if
(!selectStatementContext.getSqlStatement().getCombine().isPresent()) {
+ return false;
+ }
+ CombineSegment combineSegment =
selectStatementContext.getSqlStatement().getCombine().get();
+ List<Projection> leftProjections =
selectStatementContext.getSubqueryContexts().get(combineSegment.getLeft().getStartIndex()).getProjectionsContext().getExpandProjections();
+ List<Projection> rightProjections =
selectStatementContext.getSubqueryContexts().get(combineSegment.getRight().getStartIndex()).getProjectionsContext().getExpandProjections();
+ ShardingSpherePreconditions.checkState(leftProjections.size() ==
rightProjections.size(), () -> new UnsupportedSQLOperationException("Column
projections must be same for combine statement"));
+ for (int i = 0; i < leftProjections.size(); i++) {
+ Projection leftProjection = leftProjections.get(i);
+ Projection rightProjection = rightProjections.get(i);
+ ColumnSegmentBoundInfo leftColumnInfo =
getColumnSegmentBoundInfo(leftProjection);
+ EncryptAlgorithm leftColumnEncryptor =
encryptRule.findQueryEncryptor(leftColumnInfo.getOriginalTable().getValue(),
leftColumnInfo.getOriginalColumn().getValue()).orElse(null);
+ ColumnSegmentBoundInfo rightColumnInfo =
getColumnSegmentBoundInfo(rightProjection);
+ EncryptAlgorithm rightColumnEncryptor =
encryptRule.findQueryEncryptor(rightColumnInfo.getOriginalTable().getValue(),
rightColumnInfo.getOriginalColumn().getValue()).orElse(null);
+ if (null != leftColumnEncryptor || null != rightColumnEncryptor) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private ColumnSegmentBoundInfo getColumnSegmentBoundInfo(final Projection
projection) {
+ return projection instanceof ColumnProjection
+ ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection)
projection).getOriginalTable(), ((ColumnProjection)
projection).getOriginalColumn())
+ : new ColumnSegmentBoundInfo(new
IdentifierValue(projection.getColumnLabel()));
+ }
+
private ColumnProjection buildColumnProjection(final
ColumnProjectionSegment segment) {
IdentifierValue owner =
segment.getColumn().getOwner().map(OwnerSegment::getIdentifier).orElse(null);
ColumnProjection result = new ColumnProjection(owner,
segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ?
segment.getAlias().orElse(null) : null, databaseType);
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/util/EncryptTokenGeneratorUtils.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/util/EncryptTokenGeneratorUtils.java
deleted file mode 100644
index 41ea106b846..00000000000
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/util/EncryptTokenGeneratorUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.encrypt.rewrite.token.util;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
-import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
-import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
-import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
-import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
-import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
-
-import java.util.List;
-
-/**
- * Encrypt token generator utils.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class EncryptTokenGeneratorUtils {
-
- /**
- * Judge whether contains encrypt projection in combine statement or not.
- *
- * @param selectStatementContext select statement context
- * @param encryptRule encrypt rule
- * @return whether contains encrypt projection in combine statement or not
- */
- public static boolean containsEncryptProjectionInCombineStatement(final
SelectStatementContext selectStatementContext, final EncryptRule encryptRule) {
- if
(!selectStatementContext.getSqlStatement().getCombine().isPresent()) {
- return false;
- }
- CombineSegment combineSegment =
selectStatementContext.getSqlStatement().getCombine().get();
- List<Projection> leftProjections =
selectStatementContext.getSubqueryContexts().get(combineSegment.getLeft().getStartIndex()).getProjectionsContext().getExpandProjections();
- List<Projection> rightProjections =
selectStatementContext.getSubqueryContexts().get(combineSegment.getRight().getStartIndex()).getProjectionsContext().getExpandProjections();
- ShardingSpherePreconditions.checkState(leftProjections.size() ==
rightProjections.size(), () -> new UnsupportedSQLOperationException("Column
projections must be same for combine statement"));
- for (int i = 0; i < leftProjections.size(); i++) {
- Projection leftProjection = leftProjections.get(i);
- Projection rightProjection = rightProjections.get(i);
- ColumnSegmentBoundInfo leftColumnInfo =
getColumnSegmentBoundInfo(leftProjection);
- EncryptAlgorithm leftColumnEncryptor =
encryptRule.findQueryEncryptor(leftColumnInfo.getOriginalTable().getValue(),
leftColumnInfo.getOriginalColumn().getValue()).orElse(null);
- ColumnSegmentBoundInfo rightColumnInfo =
getColumnSegmentBoundInfo(rightProjection);
- EncryptAlgorithm rightColumnEncryptor =
encryptRule.findQueryEncryptor(rightColumnInfo.getOriginalTable().getValue(),
rightColumnInfo.getOriginalColumn().getValue()).orElse(null);
- if (null != leftColumnEncryptor || null != rightColumnEncryptor) {
- return true;
- }
- }
- return false;
- }
-
- private static ColumnSegmentBoundInfo getColumnSegmentBoundInfo(final
Projection projection) {
- return projection instanceof ColumnProjection
- ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection)
projection).getOriginalTable(), ((ColumnProjection)
projection).getOriginalColumn())
- : new ColumnSegmentBoundInfo(new
IdentifierValue(projection.getColumnLabel()));
- }
-}