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;
- }
}