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 f1e93ffb2e7 Refactor EncryptGroupByItemTokenGenerator (#32402)
f1e93ffb2e7 is described below
commit f1e93ffb2e73c1327fbc7d1a4ff1ee11770d9103
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 5 13:47:59 2024 +0800
Refactor EncryptGroupByItemTokenGenerator (#32402)
---
.../EncryptGroupByItemTokenGenerator.java | 81 +++++++++-------------
1 file changed, 33 insertions(+), 48 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
index b48717f03e3..9cb72fa1dda 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptGroupByItemTokenGenerator.java
@@ -29,7 +29,6 @@ import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -53,7 +52,7 @@ import java.util.Optional;
*/
@HighFrequencyInvocation
@Setter
-public final class EncryptGroupByItemTokenGenerator implements
CollectionSQLTokenGenerator<SQLStatementContext>, EncryptRuleAware,
SchemaMetaDataAware, DatabaseTypeAware {
+public final class EncryptGroupByItemTokenGenerator implements
CollectionSQLTokenGenerator<SelectStatementContext>, EncryptRuleAware,
SchemaMetaDataAware, DatabaseTypeAware {
private EncryptRule encryptRule;
@@ -65,72 +64,58 @@ public final class EncryptGroupByItemTokenGenerator
implements CollectionSQLToke
@Override
public boolean isGenerateSQLToken(final SQLStatementContext
sqlStatementContext) {
- return sqlStatementContext instanceof SelectStatementContext &&
containsGroupByItem(sqlStatementContext);
+ return sqlStatementContext instanceof SelectStatementContext &&
containsGroupByItem((SelectStatementContext) sqlStatementContext);
+ }
+
+ private boolean containsGroupByItem(final SelectStatementContext
sqlStatementContext) {
+ if (!sqlStatementContext.getGroupByContext().getItems().isEmpty()) {
+ return true;
+ }
+ for (SelectStatementContext each :
sqlStatementContext.getSubqueryContexts().values()) {
+ if (containsGroupByItem(each)) {
+ return true;
+ }
+ }
+ return false;
}
@Override
- public Collection<SQLToken> generateSQLTokens(final SQLStatementContext
sqlStatementContext) {
+ public Collection<SQLToken> generateSQLTokens(final SelectStatementContext
sqlStatementContext) {
Collection<SQLToken> result = new LinkedHashSet<>();
- ShardingSphereSchema schema = ((TableAvailable)
sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(()
-> defaultSchema);
+ ShardingSphereSchema schema =
sqlStatementContext.getTablesContext().getSchemaName().map(schemas::get).orElseGet(()
-> defaultSchema);
for (OrderByItem each : getGroupByItems(sqlStatementContext)) {
if (each.getSegment() instanceof ColumnOrderByItemSegment) {
ColumnSegment columnSegment = ((ColumnOrderByItemSegment)
each.getSegment()).getColumn();
- Map<String, String> columnTableNames = ((TableAvailable)
sqlStatementContext).getTablesContext().findTableNames(Collections.singleton(columnSegment),
schema);
-
result.addAll(generateSQLTokensWithColumnSegments(Collections.singleton(columnSegment),
columnTableNames));
+ Map<String, String> columnTableNames =
sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment),
schema);
+ generateSQLToken(columnSegment,
columnTableNames).ifPresent(result::add);
}
}
return result;
}
- private Collection<SubstitutableColumnNameToken>
generateSQLTokensWithColumnSegments(final Collection<ColumnSegment>
columnSegments, final Map<String, String> columnTableNames) {
- Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
- for (ColumnSegment each : columnSegments) {
- String tableName =
columnTableNames.getOrDefault(each.getExpression(), "");
- Optional<EncryptTable> encryptTable =
encryptRule.findEncryptTable(tableName);
- String columnName = each.getIdentifier().getValue();
- if (!encryptTable.isPresent() ||
!encryptTable.get().isEncryptColumn(columnName)) {
- continue;
- }
- int startIndex = each.getOwner().isPresent() ?
each.getOwner().get().getStopIndex() + 2 : each.getStartIndex();
- int stopIndex = each.getStopIndex();
- EncryptColumn encryptColumn =
encryptTable.get().getEncryptColumn(columnName);
- SubstitutableColumnNameToken encryptColumnNameToken =
encryptColumn.getAssistedQuery()
- .map(optional -> new
SubstitutableColumnNameToken(startIndex, stopIndex,
createColumnProjections(optional.getName(),
each.getIdentifier().getQuoteCharacter()), databaseType))
- .orElseGet(() -> new
SubstitutableColumnNameToken(startIndex, stopIndex,
createColumnProjections(encryptColumn.getCipher().getName(),
each.getIdentifier().getQuoteCharacter()),
- databaseType));
- result.add(encryptColumnNameToken);
+ private Optional<SubstitutableColumnNameToken> generateSQLToken(final
ColumnSegment columnSegment, final Map<String, String> columnTableNames) {
+ Optional<EncryptTable> encryptTable =
encryptRule.findEncryptTable(columnTableNames.getOrDefault(columnSegment.getExpression(),
""));
+ String columnName = columnSegment.getIdentifier().getValue();
+ if (!encryptTable.isPresent() ||
!encryptTable.get().isEncryptColumn(columnName)) {
+ return Optional.empty();
}
- return result;
+ EncryptColumn encryptColumn =
encryptTable.get().getEncryptColumn(columnName);
+ int startIndex = columnSegment.getOwner().isPresent() ?
columnSegment.getOwner().get().getStopIndex() + 2 :
columnSegment.getStartIndex();
+ int stopIndex = columnSegment.getStopIndex();
+ return Optional.of(encryptColumn.getAssistedQuery()
+ .map(optional -> new SubstitutableColumnNameToken(startIndex,
stopIndex, createColumnProjections(optional.getName(),
columnSegment.getIdentifier().getQuoteCharacter()), databaseType))
+ .orElseGet(() -> new SubstitutableColumnNameToken(startIndex,
stopIndex, createColumnProjections(encryptColumn.getCipher().getName(),
+ columnSegment.getIdentifier().getQuoteCharacter()),
databaseType)));
}
- private Collection<OrderByItem> getGroupByItems(final SQLStatementContext
sqlStatementContext) {
- if (!(sqlStatementContext instanceof SelectStatementContext)) {
- return Collections.emptyList();
- }
- SelectStatementContext statementContext = (SelectStatementContext)
sqlStatementContext;
- Collection<OrderByItem> result = new
LinkedList<>(statementContext.getGroupByContext().getItems());
- for (SelectStatementContext each :
statementContext.getSubqueryContexts().values()) {
+ private Collection<OrderByItem> getGroupByItems(final
SelectStatementContext sqlStatementContext) {
+ Collection<OrderByItem> result = new
LinkedList<>(sqlStatementContext.getGroupByContext().getItems());
+ for (SelectStatementContext each :
sqlStatementContext.getSubqueryContexts().values()) {
result.addAll(getGroupByItems(each));
}
return result;
}
- private boolean containsGroupByItem(final SQLStatementContext
sqlStatementContext) {
- if (!(sqlStatementContext instanceof SelectStatementContext)) {
- return false;
- }
- SelectStatementContext statementContext = (SelectStatementContext)
sqlStatementContext;
- if (!statementContext.getGroupByContext().getItems().isEmpty()) {
- return true;
- }
- for (SelectStatementContext each :
statementContext.getSubqueryContexts().values()) {
- if (containsGroupByItem(each)) {
- return true;
- }
- }
- return false;
- }
-
private Collection<Projection> createColumnProjections(final String
columnName, final QuoteCharacter quoteCharacter) {
return Collections.singleton(new ColumnProjection(null, new
IdentifierValue(columnName, quoteCharacter), null, databaseType));
}