You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zi...@apache.org on 2023/06/23 21:39:51 UTC

[shardingsphere] branch master updated: Add isAssistedQueryColumn and isLikeQueryColumn methods on EncryptTable (#26516)

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

zichaowang 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 9abf8e30fcb Add isAssistedQueryColumn and isLikeQueryColumn methods on EncryptTable (#26516)
9abf8e30fcb is described below

commit 9abf8e30fcb1d664b916059f7f150349e26173ac
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Jun 24 05:39:44 2023 +0800

    Add isAssistedQueryColumn and isLikeQueryColumn methods on EncryptTable (#26516)
---
 .../dal/show/EncryptShowColumnsMergedResult.java   |  2 +-
 .../show/EncryptShowCreateTableMergedResult.java   | 18 ++++++-------
 .../column/EncryptColumnExistedReviser.java        | 16 +++--------
 .../shardingsphere/encrypt/rule/EncryptTable.java  | 31 +++++++---------------
 ...ecoratedEncryptShowColumnsMergedResultTest.java |  4 +--
 ...atedEncryptShowCreateTableMergedResultTest.java |  2 ++
 .../MergedEncryptShowColumnsMergedResultTest.java  |  4 +--
 ...rgedEncryptShowCreateTableMergedResultTest.java |  5 ++--
 .../metadata/EncryptMetaDataReviseEngineTest.java  |  3 +--
 .../encrypt/rule/EncryptTableTest.java             |  5 ----
 .../parser/sql/common/enums/QuoteCharacter.java    | 10 +++++++
 11 files changed, 43 insertions(+), 57 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
index 1ff7ac08fef..74e2e0b0804 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
@@ -61,7 +61,7 @@ public abstract class EncryptShowColumnsMergedResult implements MergedResult {
             return false;
         }
         String columnName = getOriginalValue(COLUMN_FIELD_INDEX, String.class).toString();
-        while (encryptTable.get().getAssistedQueryColumns().contains(columnName) || encryptTable.get().getLikeQueryColumns().contains(columnName)) {
+        while (encryptTable.get().isAssistedQueryColumn(columnName) || encryptTable.get().isLikeQueryColumn(columnName)) {
             hasNext = nextValue();
             if (!hasNext) {
                 return false;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
index c00a882265d..033466e2873 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 
@@ -31,10 +32,8 @@ import java.io.Reader;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Encrypt show create table merged result.
@@ -45,6 +44,8 @@ public abstract class EncryptShowCreateTableMergedResult implements MergedResult
     
     private static final int CREATE_TABLE_DEFINITION_INDEX = 2;
     
+    private final DatabaseType databaseType;
+    
     private final String tableName;
     
     private final EncryptRule encryptRule;
@@ -52,6 +53,7 @@ public abstract class EncryptShowCreateTableMergedResult implements MergedResult
     protected EncryptShowCreateTableMergedResult(final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) {
         ShardingSpherePreconditions.checkState(sqlStatementContext instanceof TableAvailable && 1 == ((TableAvailable) sqlStatementContext).getAllTables().size(),
                 () -> new UnsupportedEncryptSQLException("SHOW CREATE TABLE FOR MULTI TABLE"));
+        databaseType = sqlStatementContext.getDatabaseType();
         tableName = ((TableAvailable) sqlStatementContext).getAllTables().iterator().next().getTableName().getIdentifier().getValue();
         this.encryptRule = encryptRule;
     }
@@ -81,16 +83,14 @@ public abstract class EncryptShowCreateTableMergedResult implements MergedResult
     }
     
     private Optional<String> findLogicColumnDefinition(final String columnDefinition, final EncryptTable encryptTable) {
-        Collection<String> cipherColumns = encryptTable.getLogicColumns().stream().map(each -> encryptTable.getEncryptColumn(each).getCipher().getName()).collect(Collectors.toList());
-        for (String each : cipherColumns) {
-            if (columnDefinition.contains(each)) {
-                return Optional.of(columnDefinition.replace(each, encryptTable.getLogicColumnByCipherColumn(each)));
-            }
+        String columnName = databaseType.getQuoteCharacter().unwrap(columnDefinition.trim().split("\\s+")[0]);
+        if (encryptTable.isCipherColumn(columnName)) {
+            return Optional.of(columnDefinition.replace(columnName, encryptTable.getLogicColumnByCipherColumn(columnName)));
         }
-        if (encryptTable.getAssistedQueryColumns().stream().anyMatch(columnDefinition::contains)) {
+        if (encryptTable.isAssistedQueryColumn(columnName)) {
             return Optional.empty();
         }
-        if (encryptTable.getLikeQueryColumns().stream().anyMatch(columnDefinition::contains)) {
+        if (encryptTable.isLikeQueryColumn(columnName)) {
             return Optional.empty();
         }
         return Optional.of(columnDefinition);
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/column/EncryptColumnExistedReviser.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/column/EncryptColumnExistedReviser.java
index 4dd7557e95c..417269809fd 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/column/EncryptColumnExistedReviser.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/column/EncryptColumnExistedReviser.java
@@ -17,30 +17,20 @@
 
 package org.apache.shardingsphere.encrypt.metadata.reviser.column;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.metadata.database.schema.reviser.column.ColumnExistedReviser;
 
-import java.util.Collection;
-
 /**
  * Encrypt column existed reviser.
  */
+@RequiredArgsConstructor
 public final class EncryptColumnExistedReviser implements ColumnExistedReviser {
     
     private final EncryptTable encryptTable;
     
-    private final Collection<String> assistedQueryColumns;
-    
-    private final Collection<String> likeQueryColumns;
-    
-    public EncryptColumnExistedReviser(final EncryptTable encryptTable) {
-        this.encryptTable = encryptTable;
-        assistedQueryColumns = encryptTable.getAssistedQueryColumns();
-        likeQueryColumns = encryptTable.getLikeQueryColumns();
-    }
-    
     @Override
     public boolean isExisted(final String originalName) {
-        return encryptTable.isCipherColumn(originalName) || !assistedQueryColumns.contains(originalName) && !likeQueryColumns.contains(originalName);
+        return encryptTable.isCipherColumn(originalName) || !encryptTable.isAssistedQueryColumn(originalName) && !encryptTable.isLikeQueryColumn(originalName);
     }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
index f29db5027dc..9c0a8cf6f41 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
@@ -32,7 +32,6 @@ import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -145,32 +144,22 @@ public final class EncryptTable {
     }
     
     /**
-     * Get assisted query columns.
+     * Is assisted query column or not.
      *
-     * @return assisted query columns
+     * @param columnName column name
+     * @return assisted query column or not
      */
-    public Collection<String> getAssistedQueryColumns() {
-        Collection<String> result = new LinkedList<>();
-        for (EncryptColumn each : columns.values()) {
-            if (each.getAssistedQuery().isPresent()) {
-                result.add(each.getAssistedQuery().get().getName());
-            }
-        }
-        return result;
+    public boolean isAssistedQueryColumn(final String columnName) {
+        return columns.values().stream().anyMatch(each -> columnName.equalsIgnoreCase(each.getAssistedQuery().map(AssistedQueryColumnItem::getName).orElse(null)));
     }
     
     /**
-     * Get like query columns.
+     * Is like query column or not.
      *
-     * @return like query columns
+     * @param columnName column name
+     * @return like query column or not
      */
-    public Collection<String> getLikeQueryColumns() {
-        Collection<String> result = new LinkedList<>();
-        for (EncryptColumn each : columns.values()) {
-            if (each.getLikeQuery().isPresent()) {
-                result.add(each.getLikeQuery().get().getName());
-            }
-        }
-        return result;
+    public boolean isLikeQueryColumn(final String columnName) {
+        return columns.values().stream().anyMatch(each -> columnName.equalsIgnoreCase(each.getLikeQuery().map(LikeQueryColumnItem::getName).orElse(null)));
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
index ea9b40ea162..4c2292fdacb 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
@@ -98,8 +98,8 @@ class DecoratedEncryptShowColumnsMergedResultTest {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
         when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
-        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("user_id_assisted"));
-        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singleton("user_id_like"));
+        when(encryptTable.isAssistedQueryColumn("user_id_assisted")).thenReturn(true);
+        when(encryptTable.isLikeQueryColumn("user_id_like")).thenReturn(true);
         when(encryptTable.isCipherColumn("user_id_cipher")).thenReturn(true);
         when(encryptTable.getLogicColumnByCipherColumn("user_id_cipher")).thenReturn("user_id");
         return result;
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowCreateTableMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowCreateTableMergedResultTest.java
index 6858bf9f1a9..230d8adf974 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowCreateTableMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowCreateTableMergedResultTest.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfigu
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.binder.statement.dal.ShowCreateTableStatementContext;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
@@ -131,6 +132,7 @@ class DecoratedEncryptShowCreateTableMergedResultTest {
         TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue);
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment);
         when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment));
+        when(sqlStatementContext.getDatabaseType()).thenReturn(new MySQLDatabaseType());
         return new DecoratedEncryptShowCreateTableMergedResult(mergedResult, sqlStatementContext, encryptRule);
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
index 08f8093982c..92f3f33abfa 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
@@ -98,8 +98,8 @@ class MergedEncryptShowColumnsMergedResultTest {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
         when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
-        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("user_id_assisted"));
-        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singleton("user_id_like"));
+        when(encryptTable.isAssistedQueryColumn("user_id_assisted")).thenReturn(true);
+        when(encryptTable.isLikeQueryColumn("user_id_like")).thenReturn(true);
         when(encryptTable.isCipherColumn("user_id_cipher")).thenReturn(true);
         when(encryptTable.getLogicColumnByCipherColumn("user_id_cipher")).thenReturn("user_id");
         return result;
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowCreateTableMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowCreateTableMergedResultTest.java
index f01638ebacd..795ec143c2f 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowCreateTableMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowCreateTableMergedResultTest.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfigu
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.binder.statement.dal.ShowCreateTableStatementContext;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
@@ -69,8 +70,7 @@ class MergedEncryptShowCreateTableMergedResultTest {
                         + "`user_id_assisted` VARCHAR(100) NOT NULL, `order_id` VARCHAR(30) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
         EncryptColumnRuleConfiguration columnRuleConfig = new EncryptColumnRuleConfiguration("user_id", new EncryptColumnItemRuleConfiguration("user_id_cipher"));
         columnRuleConfig.setAssistedQuery(new EncryptColumnItemRuleConfiguration("user_id_assisted"));
-        MergedEncryptShowCreateTableMergedResult actual = createMergedEncryptShowCreateTableMergedResult(queryResult,
-                mockEncryptRule(Collections.singletonList(columnRuleConfig)));
+        MergedEncryptShowCreateTableMergedResult actual = createMergedEncryptShowCreateTableMergedResult(queryResult, mockEncryptRule(Collections.singletonList(columnRuleConfig)));
         assertTrue(actual.next());
         assertThat(actual.getValue(2, String.class),
                 is("CREATE TABLE `t_encrypt` (`id` INT NOT NULL, `user_id` VARCHAR(100) NOT NULL, `order_id` VARCHAR(30) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"));
@@ -109,6 +109,7 @@ class MergedEncryptShowCreateTableMergedResultTest {
         TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue);
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment);
         when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment));
+        when(sqlStatementContext.getDatabaseType()).thenReturn(new MySQLDatabaseType());
         return new MergedEncryptShowCreateTableMergedResult(queryResult, sqlStatementContext, encryptRule);
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptMetaDataReviseEngineTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptMetaDataReviseEngineTest.java
index 78af03d6cf5..7334272e857 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptMetaDataReviseEngineTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptMetaDataReviseEngineTest.java
@@ -60,9 +60,8 @@ class EncryptMetaDataReviseEngineTest {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
         when(result.findEncryptTable(TABLE_NAME)).thenReturn(Optional.of(encryptTable));
-        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.emptyList());
-        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singletonList("pwd_like"));
         when(encryptTable.isCipherColumn("pwd_cipher")).thenReturn(true);
+        when(encryptTable.isLikeQueryColumn("pwd_like")).thenReturn(true);
         when(encryptTable.getLogicColumnByCipherColumn("pwd_cipher")).thenReturn("pwd");
         return result;
     }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
index 3cd443ce658..a5c5be22fd7 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
@@ -82,9 +82,4 @@ class EncryptTableTest {
     void assertGetLogicColumnByCipherColumnWhenNotFind() {
         assertThrows(EncryptLogicColumnNotFoundException.class, () -> encryptTable.getLogicColumnByCipherColumn("invalidColumn"));
     }
-    
-    @Test
-    void assertGetAssistedQueryColumns() {
-        assertThat(encryptTable.getAssistedQueryColumns(), is(Collections.singletonList("assistedQueryColumn")));
-    }
 }
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/enums/QuoteCharacter.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/enums/QuoteCharacter.java
index 7ae5b7f8240..11e69510ce5 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/enums/QuoteCharacter.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/enums/QuoteCharacter.java
@@ -69,6 +69,16 @@ public enum QuoteCharacter {
         return startDelimiter + value + endDelimiter;
     }
     
+    /**
+     * Unwrap value with quote character.
+     *
+     * @param value value to be unwrapped
+     * @return unwrapped value
+     */
+    public String unwrap(final String value) {
+        return isWrapped(value) ? value.substring(startDelimiter.length(), value.length() - endDelimiter.length()) : value;
+    }
+    
     /**
      * Is wrapped by quote character.
      *