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.
*