You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2024/07/25 07:58:19 UTC

(shardingsphere) branch master updated: Refactor EncryptTokenGeneratorUtils (#32262)

This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 f7434771b7f Refactor EncryptTokenGeneratorUtils (#32262)
f7434771b7f is described below

commit f7434771b7f4d72038178940843fabc5a64e78a4
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jul 25 15:58:13 2024 +0800

    Refactor EncryptTokenGeneratorUtils (#32262)
---
 .../EncryptPredicateColumnTokenGenerator.java      |  2 +-
 .../generator/EncryptProjectionTokenGenerator.java |  2 +-
 .../EncryptInsertCipherNameTokenGenerator.java     |  2 +-
 .../EncryptInsertDefaultColumnsTokenGenerator.java |  2 +-
 .../token/util/EncryptTokenGeneratorUtils.java     | 81 +++++++++++-----------
 5 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
index 1def333581b..a4bd16903bb 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
@@ -84,7 +84,7 @@ public final class EncryptPredicateColumnTokenGenerator implements CollectionSQL
             whereSegments = ((WhereAvailable) sqlStatementContext).getWhereSegments();
             joinConditions = ((WhereAvailable) sqlStatementContext).getJoinConditions();
         }
-        ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isAllJoinConditionsUseSameEncryptor(joinConditions, encryptRule),
+        ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isUseSameEncryptor(joinConditions, encryptRule),
                 () -> new UnsupportedSQLOperationException("Can not use different encryptor in join condition"));
         String defaultSchema = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName);
         ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> schemas.get(defaultSchema));
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 53966830456..db1521ec783 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
@@ -92,7 +92,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
     
     private void addGenerateSQLTokens(final Collection<SQLToken> sqlTokens, final SelectStatementContext selectStatementContext) {
         ShardingSpherePreconditions.checkState(
-                !selectStatementContext.isContainsCombine() || !EncryptTokenGeneratorUtils.isContainsEncryptProjectionInCombineStatement(selectStatementContext, encryptRule),
+                !selectStatementContext.isContainsCombine() || !EncryptTokenGeneratorUtils.containsEncryptProjectionInCombineStatement(selectStatementContext, encryptRule),
                 () -> new UnsupportedSQLOperationException("Can not support encrypt projection in combine statement"));
         for (ProjectionSegment each : selectStatementContext.getSqlStatement().getProjections().getProjections()) {
             SubqueryType subqueryType = selectStatementContext.getSubqueryType();
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertCipherNameTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertCipherNameTokenGenerator.java
index 0fb8b973d63..bcf849aa34f 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertCipherNameTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertCipherNameTokenGenerator.java
@@ -65,7 +65,7 @@ public final class EncryptInsertCipherNameTokenGenerator implements CollectionSQ
         if (null != insertStatementContext.getInsertSelectContext()) {
             Collection<Projection> projections = insertStatementContext.getInsertSelectContext().getSelectStatementContext().getProjectionsContext().getExpandProjections();
             ShardingSpherePreconditions.checkState(insertColumns.size() == projections.size(), () -> new UnsupportedSQLOperationException("Column count doesn't match value count."));
-            ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isAllInsertSelectColumnsUseSameEncryptor(insertColumns, projections, encryptRule),
+            ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isUseSameEncryptor(insertColumns, projections, encryptRule),
                     () -> new UnsupportedSQLOperationException("Can not use different encryptor in insert select columns"));
         }
         EncryptTable encryptTable = encryptRule.getEncryptTable(insertStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue());
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDefaultColumnsTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDefaultColumnsTokenGenerator.java
index 06ec1a02f82..b3ed7c58837 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDefaultColumnsTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDefaultColumnsTokenGenerator.java
@@ -90,7 +90,7 @@ public final class EncryptInsertDefaultColumnsTokenGenerator implements Optional
             Collection<ColumnSegment> derivedInsertColumns = insertStatementContext.getSqlStatement().getDerivedInsertColumns();
             Collection<Projection> projections = insertStatementContext.getInsertSelectContext().getSelectStatementContext().getProjectionsContext().getExpandProjections();
             ShardingSpherePreconditions.checkState(derivedInsertColumns.size() == projections.size(), () -> new UnsupportedSQLOperationException("Column count doesn't match value count."));
-            ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isAllInsertSelectColumnsUseSameEncryptor(derivedInsertColumns, projections, encryptRule),
+            ShardingSpherePreconditions.checkState(EncryptTokenGeneratorUtils.isUseSameEncryptor(derivedInsertColumns, projections, encryptRule),
                     () -> new UnsupportedSQLOperationException("Can not use different encryptor in insert select columns"));
         }
         return new UseDefaultInsertColumnsToken(
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
index 6da1244a8c5..35e96a59653 100644
--- 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
@@ -20,8 +20,8 @@ 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.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.Projection;
 import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
@@ -34,7 +34,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Bina
 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.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
@@ -52,7 +51,7 @@ public final class EncryptTokenGeneratorUtils {
      * @param encryptRule encrypt rule
      * @return whether all join conditions use same encryptor or not
      */
-    public static boolean isAllJoinConditionsUseSameEncryptor(final Collection<BinaryOperationExpression> joinConditions, final EncryptRule encryptRule) {
+    public static boolean isUseSameEncryptor(final Collection<BinaryOperationExpression> joinConditions, final EncryptRule encryptRule) {
         for (BinaryOperationExpression each : joinConditions) {
             if (!(each.getLeft() instanceof ColumnSegment) || !(each.getRight() instanceof ColumnSegment)) {
                 continue;
@@ -66,30 +65,6 @@ public final class EncryptTokenGeneratorUtils {
         return true;
     }
     
-    private static boolean isDifferentEncryptor(final EncryptAlgorithm leftColumnEncryptor, final EncryptAlgorithm rightColumnEncryptor) {
-        if (null != leftColumnEncryptor && null != rightColumnEncryptor) {
-            if (!leftColumnEncryptor.getType().equals(rightColumnEncryptor.getType())) {
-                return true;
-            }
-            return !leftColumnEncryptor.equals(rightColumnEncryptor);
-        }
-        return null != leftColumnEncryptor || null != rightColumnEncryptor;
-    }
-    
-    private static EncryptAlgorithm getColumnEncryptor(final ColumnSegmentBoundInfo columnBoundInfo, final EncryptRule encryptRule) {
-        String tableName = columnBoundInfo.getOriginalTable().getValue();
-        String columnName = columnBoundInfo.getOriginalColumn().getValue();
-        if (!encryptRule.findEncryptTable(tableName).isPresent() || !encryptRule.getEncryptTable(tableName).isEncryptColumn(columnName)) {
-            return null;
-        }
-        EncryptTable encryptTable = encryptRule.getEncryptTable(tableName);
-        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
-        if (encryptColumn.getAssistedQuery().isPresent()) {
-            return encryptColumn.getAssistedQuery().get().getEncryptor();
-        }
-        return encryptColumn.getCipher().getEncryptor();
-    }
-    
     /**
      * Judge whether all insert select columns use same encryptor or not.
      *
@@ -98,16 +73,14 @@ public final class EncryptTokenGeneratorUtils {
      * @param encryptRule encrypt rule
      * @return whether all insert select columns use same encryptor or not 
      */
-    public static boolean isAllInsertSelectColumnsUseSameEncryptor(final Collection<ColumnSegment> insertColumns, final Collection<Projection> projections, final EncryptRule encryptRule) {
+    public static boolean isUseSameEncryptor(final Collection<ColumnSegment> insertColumns, final Collection<Projection> projections, final EncryptRule encryptRule) {
         Iterator<ColumnSegment> insertColumnsIterator = insertColumns.iterator();
         Iterator<Projection> projectionIterator = projections.iterator();
         while (insertColumnsIterator.hasNext()) {
             ColumnSegment columnSegment = insertColumnsIterator.next();
             EncryptAlgorithm leftColumnEncryptor = getColumnEncryptor(columnSegment.getColumnBoundInfo(), encryptRule);
             Projection projection = projectionIterator.next();
-            ColumnSegmentBoundInfo columnBoundInfo = projection instanceof ColumnProjection
-                    ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection) projection).getOriginalTable(), ((ColumnProjection) projection).getOriginalColumn())
-                    : new ColumnSegmentBoundInfo(new IdentifierValue(projection.getColumnLabel()));
+            ColumnSegmentBoundInfo columnBoundInfo = getColumnSegmentBoundInfo(projection);
             EncryptAlgorithm rightColumnEncryptor = getColumnEncryptor(columnBoundInfo, encryptRule);
             if (isDifferentEncryptor(leftColumnEncryptor, rightColumnEncryptor)) {
                 return false;
@@ -116,6 +89,36 @@ public final class EncryptTokenGeneratorUtils {
         return true;
     }
     
+    private static EncryptAlgorithm getColumnEncryptor(final ColumnSegmentBoundInfo columnBoundInfo, final EncryptRule encryptRule) {
+        String tableName = columnBoundInfo.getOriginalTable().getValue();
+        String columnName = columnBoundInfo.getOriginalColumn().getValue();
+        if (!encryptRule.findEncryptTable(tableName).isPresent() || !encryptRule.getEncryptTable(tableName).isEncryptColumn(columnName)) {
+            return null;
+        }
+        EncryptTable encryptTable = encryptRule.getEncryptTable(tableName);
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
+        if (encryptColumn.getAssistedQuery().isPresent()) {
+            return encryptColumn.getAssistedQuery().get().getEncryptor();
+        }
+        return encryptColumn.getCipher().getEncryptor();
+    }
+    
+    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()));
+    }
+    
+    private static boolean isDifferentEncryptor(final EncryptAlgorithm leftColumnEncryptor, final EncryptAlgorithm rightColumnEncryptor) {
+        if (null != leftColumnEncryptor && null != rightColumnEncryptor) {
+            if (!leftColumnEncryptor.getType().equals(rightColumnEncryptor.getType())) {
+                return true;
+            }
+            return !leftColumnEncryptor.equals(rightColumnEncryptor);
+        }
+        return null != leftColumnEncryptor || null != rightColumnEncryptor;
+    }
+    
     /**
      * Judge whether contains encrypt projection in combine statement or not.
      *
@@ -123,25 +126,19 @@ public final class EncryptTokenGeneratorUtils {
      * @param encryptRule encrypt rule
      * @return whether contains encrypt projection in combine statement or not
      */
-    public static boolean isContainsEncryptProjectionInCombineStatement(final SelectStatementContext selectStatementContext, final EncryptRule encryptRule) {
+    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 = new ArrayList<>(selectStatementContext.getSubqueryContexts().get(combineSegment.getLeft().getStartIndex()).getProjectionsContext().getExpandProjections());
-        List<Projection> rightProjections = new ArrayList<>(selectStatementContext.getSubqueryContexts().get(combineSegment.getRight().getStartIndex()).getProjectionsContext().getExpandProjections());
+        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 leftColumnBoundInfo = leftProjection instanceof ColumnProjection
-                    ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection) leftProjection).getOriginalTable(), ((ColumnProjection) leftProjection).getOriginalColumn())
-                    : new ColumnSegmentBoundInfo(new IdentifierValue(leftProjection.getColumnLabel()));
-            ColumnSegmentBoundInfo rightColumnBoundInfo = rightProjection instanceof ColumnProjection
-                    ? new ColumnSegmentBoundInfo(null, null, ((ColumnProjection) rightProjection).getOriginalTable(), ((ColumnProjection) rightProjection).getOriginalColumn())
-                    : new ColumnSegmentBoundInfo(new IdentifierValue(rightProjection.getColumnLabel()));
-            EncryptAlgorithm leftColumnEncryptor = getColumnEncryptor(leftColumnBoundInfo, encryptRule);
-            EncryptAlgorithm rightColumnEncryptor = getColumnEncryptor(rightColumnBoundInfo, encryptRule);
+            EncryptAlgorithm leftColumnEncryptor = getColumnEncryptor(getColumnSegmentBoundInfo(leftProjection), encryptRule);
+            EncryptAlgorithm rightColumnEncryptor = getColumnEncryptor(getColumnSegmentBoundInfo(rightProjection), encryptRule);
             if (null != leftColumnEncryptor || null != rightColumnEncryptor) {
                 return true;
             }