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 <zhangli...@apache.org> 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())); - } -}