You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/12 12:40:14 UTC

[shardingsphere] branch master updated: Refactor EncryptCreateTableTokenGenerator (#26307)

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

duanzhengqiang 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 bd7769c50b3 Refactor EncryptCreateTableTokenGenerator (#26307)
bd7769c50b3 is described below

commit bd7769c50b37542f3dde4992b3d4a18ae0081da9
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon Jun 12 20:39:59 2023 +0800

    Refactor EncryptCreateTableTokenGenerator (#26307)
---
 .../EncryptCreateTableTokenGenerator.java          | 29 +++++----
 .../EncryptCreateTableTokenGeneratorTest.java      | 71 +++++++++++-----------
 2 files changed, 54 insertions(+), 46 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
index 8799a76a153..499f4b94946 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
@@ -21,6 +21,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlgorithm;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -57,50 +58,54 @@ public final class EncryptCreateTableTokenGenerator implements CollectionSQLToke
     public Collection<SQLToken> generateSQLTokens(final CreateTableStatementContext createTableStatementContext) {
         Collection<SQLToken> result = new LinkedList<>();
         String tableName = createTableStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue();
+        Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
+        if (!encryptTable.isPresent()) {
+            return Collections.emptyList();
+        }
         List<ColumnDefinitionSegment> columns = new ArrayList<>(createTableStatementContext.getSqlStatement().getColumnDefinitions());
         for (int index = 0; index < columns.size(); index++) {
             ColumnDefinitionSegment each = columns.get(index);
             String columnName = each.getColumnName().getIdentifier().getValue();
             Optional<StandardEncryptAlgorithm> encryptor = encryptRule.findStandardEncryptor(tableName, columnName);
             if (encryptor.isPresent()) {
-                result.addAll(getColumnTokens(tableName, columnName, each, columns, index));
+                result.addAll(getColumnTokens(encryptTable.get(), columnName, each, columns, index));
             }
         }
         return result;
     }
     
-    private Collection<SQLToken> getColumnTokens(final String tableName, final String columnName, final ColumnDefinitionSegment column,
+    private Collection<SQLToken> getColumnTokens(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
                                                  final List<ColumnDefinitionSegment> columns, final int index) {
         boolean lastColumn = columns.size() - 1 == index;
         int columnStopIndex = lastColumn ? column.getStopIndex() : columns.get(index + 1).getStartIndex() - 1;
         Collection<SQLToken> result = new LinkedList<>();
         result.add(new RemoveToken(column.getStartIndex(), columnStopIndex));
-        result.add(getCipherColumnToken(tableName, columnName, column, columnStopIndex));
-        getAssistedQueryColumnToken(tableName, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
-        getLikeQueryColumnToken(tableName, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
+        result.add(getCipherColumnToken(encryptTable, columnName, column, columnStopIndex));
+        getAssistedQueryColumnToken(encryptTable, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
+        getLikeQueryColumnToken(encryptTable, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
         return result;
     }
     
-    private SQLToken getCipherColumnToken(final String tableName, final String columnName, final ColumnDefinitionSegment column, final int stopIndex) {
-        return new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(), getColumnProjections(new IdentifierValue(encryptRule.getCipherColumn(tableName, columnName),
+    private SQLToken getCipherColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column, final int stopIndex) {
+        return new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(), getColumnProjections(new IdentifierValue(encryptTable.getCipherColumn(columnName),
                 column.getColumnName().getIdentifier().getQuoteCharacter())));
     }
     
-    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final String tableName, final String columnName, final ColumnDefinitionSegment column,
+    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
                                                                      final int stopIndex, final boolean lastColumn) {
-        Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, columnName);
+        Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(columnName);
         return assistedQueryColumn.map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
                 getColumnProjections(new IdentifierValue(optional, column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
     }
     
-    private Optional<? extends SQLToken> getLikeQueryColumnToken(final String tableName, final String columnName, final ColumnDefinitionSegment column,
+    private Optional<? extends SQLToken> getLikeQueryColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
                                                                  final int stopIndex, final boolean lastColumn) {
-        Optional<String> likeQueryColumn = encryptRule.findLikeQueryColumn(tableName, columnName);
+        Optional<String> likeQueryColumn = encryptTable.findLikeQueryColumn(columnName);
         return likeQueryColumn.map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
                 getColumnProjections(new IdentifierValue(optional, column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
     }
     
     private Collection<Projection> getColumnProjections(final IdentifierValue columnIdentifier) {
-        return Collections.singletonList(new ColumnProjection(null, columnIdentifier, null));
+        return Collections.singleton(new ColumnProjection(null, columnIdentifier, null));
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
index 005bc7d535c..c11bf9ae83d 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
@@ -48,61 +48,64 @@ import static org.mockito.Mockito.when;
 
 class EncryptCreateTableTokenGeneratorTest {
     
-    private EncryptCreateTableTokenGenerator generator;
+    private final EncryptCreateTableTokenGenerator generator = new EncryptCreateTableTokenGenerator();
     
     @BeforeEach
     void setup() {
-        generator = new EncryptCreateTableTokenGenerator();
-        generator.setEncryptRule(buildEncryptRule());
+        generator.setEncryptRule(mockEncryptRule());
+    }
+    
+    private EncryptRule mockEncryptRule() {
+        EncryptRule result = mock(EncryptRule.class);
+        when(result.findStandardEncryptor("t_encrypt", "certificate_number")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
+        EncryptTable encryptTable = mockEncryptTable();
+        when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
+        return result;
+    }
+    
+    private EncryptTable mockEncryptTable() {
+        EncryptTable result = mock(EncryptTable.class);
+        EncryptColumn column = mockEncryptColumn();
+        when(result.getLogicColumns()).thenReturn(Collections.singletonList("t_encrypt"));
+        when(result.getCipherColumn("certificate_number")).thenReturn(column.getCipher().getName());
+        when(result.findAssistedQueryColumn("certificate_number")).thenReturn(column.getAssistedQuery().map(EncryptColumnItem::getName));
+        when(result.findLikeQueryColumn("certificate_number")).thenReturn(column.getLikeQuery().map(EncryptColumnItem::getName));
+        when(result.findEncryptColumn("certificate_number")).thenReturn(Optional.of(column));
+        return result;
+    }
+    
+    private EncryptColumn mockEncryptColumn() {
+        EncryptColumn result = new EncryptColumn("certificate_number", new EncryptColumnItem("cipher_certificate_number", "test"));
+        result.setAssistedQuery(new EncryptColumnItem("assisted_certificate_number", "assisted_encryptor"));
+        result.setLikeQuery(new EncryptColumnItem("like_certificate_number", "like_encryptor"));
+        return result;
     }
     
     @Test
     void assertGenerateSQLTokens() {
-        Collection<SQLToken> sqlTokens = generator.generateSQLTokens(buildCreateTableStatementContext());
-        assertThat(sqlTokens.size(), is(4));
-        Iterator<SQLToken> iterator = sqlTokens.iterator();
-        assertThat(iterator.next(), instanceOf(RemoveToken.class));
-        SubstitutableColumnNameToken cipherToken = (SubstitutableColumnNameToken) iterator.next();
+        Collection<SQLToken> actual = generator.generateSQLTokens(mockCreateTableStatementContext());
+        assertThat(actual.size(), is(4));
+        Iterator<SQLToken> actualIterator = actual.iterator();
+        assertThat(actualIterator.next(), instanceOf(RemoveToken.class));
+        SubstitutableColumnNameToken cipherToken = (SubstitutableColumnNameToken) actualIterator.next();
         assertThat(cipherToken.toString(mock(RouteUnit.class)), is("cipher_certificate_number"));
         assertThat(cipherToken.getStartIndex(), is(79));
         assertThat(cipherToken.getStopIndex(), is(42));
-        SubstitutableColumnNameToken assistedToken = (SubstitutableColumnNameToken) iterator.next();
+        SubstitutableColumnNameToken assistedToken = (SubstitutableColumnNameToken) actualIterator.next();
         assertThat(assistedToken.toString(mock(RouteUnit.class)), is(", assisted_certificate_number"));
         assertThat(assistedToken.getStartIndex(), is(79));
         assertThat(assistedToken.getStopIndex(), is(42));
-        SubstitutableColumnNameToken likeToken = (SubstitutableColumnNameToken) iterator.next();
+        SubstitutableColumnNameToken likeToken = (SubstitutableColumnNameToken) actualIterator.next();
         assertThat(likeToken.toString(mock(RouteUnit.class)), is(", like_certificate_number"));
         assertThat(likeToken.getStartIndex(), is(79));
         assertThat(likeToken.getStopIndex(), is(42));
     }
     
-    private CreateTableStatementContext buildCreateTableStatementContext() {
+    private CreateTableStatementContext mockCreateTableStatementContext() {
         CreateTableStatementContext result = mock(CreateTableStatementContext.class, RETURNS_DEEP_STUBS);
         when(result.getSqlStatement().getTable().getTableName().getIdentifier().getValue()).thenReturn("t_encrypt");
-        ColumnDefinitionSegment segment = new ColumnDefinitionSegment(25, 78,
-                new ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new DataTypeSegment(), false, false);
+        ColumnDefinitionSegment segment = new ColumnDefinitionSegment(25, 78, new ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new DataTypeSegment(), false, false);
         when(result.getSqlStatement().getColumnDefinitions()).thenReturn(Collections.singletonList(segment));
         return result;
     }
-    
-    private EncryptRule buildEncryptRule() {
-        EncryptRule result = mock(EncryptRule.class);
-        EncryptTable encryptTable = mock(EncryptTable.class);
-        when(encryptTable.getLogicColumns()).thenReturn(Collections.singletonList("t_encrypt"));
-        when(result.findStandardEncryptor("t_encrypt", "certificate_number")).thenReturn(Optional.of(mock(StandardEncryptAlgorithm.class)));
-        when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
-        EncryptColumn column = mockEncryptColumn();
-        when(result.getCipherColumn("t_encrypt", "certificate_number")).thenReturn(column.getCipher().getName());
-        when(result.findAssistedQueryColumn("t_encrypt", "certificate_number")).thenReturn(column.getAssistedQuery().map(EncryptColumnItem::getName));
-        when(result.findLikeQueryColumn("t_encrypt", "certificate_number")).thenReturn(column.getLikeQuery().map(EncryptColumnItem::getName));
-        when(encryptTable.findEncryptColumn("certificate_number")).thenReturn(Optional.of(column));
-        return result;
-    }
-    
-    private EncryptColumn mockEncryptColumn() {
-        EncryptColumn result = new EncryptColumn("certificate_number", new EncryptColumnItem("cipher_certificate_number", "test"));
-        result.setAssistedQuery(new EncryptColumnItem("assisted_certificate_number", "assisted_encryptor"));
-        result.setLikeQuery(new EncryptColumnItem("like_certificate_number", "like_encryptor"));
-        return result;
-    }
 }