This is an automated email from the ASF dual-hosted git repository. chengzhang 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 05d9b258a6b Minor refactor for encrypt merge decorate logic (#33479) 05d9b258a6b is described below commit 05d9b258a6baf96b8ec24f9963f923ba9b84c9d1 Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Thu Oct 31 15:51:24 2024 +0800 Minor refactor for encrypt merge decorate logic (#33479) --- .../encrypt/merge/EncryptResultDecoratorEngine.java | 8 ++++---- .../encrypt/merge/dql/EncryptDQLResultDecorator.java | 7 ++++--- .../encrypt/merge/dql/EncryptMergedResult.java | 7 ++++++- .../projection/EncryptProjectionTokenGenerator.java | 3 +-- .../EncryptSelectProjectionSupportedCheckerTest.java | 13 +++++-------- .../encrypt/merge/EncryptResultDecoratorEngineTest.java | 8 ++++---- .../encrypt/merge/dql/EncryptDQLResultDecoratorTest.java | 5 +++-- .../encrypt/merge/dql/EncryptMergedResultTest.java | 14 +++++++------- .../mask/merge/MaskResultDecoratorEngine.java | 4 ++-- .../mask/merge/MaskResultDecoratorEngineTest.java | 6 +++--- .../select/projection/engine/ProjectionEngine.java | 3 +-- .../segment/select/projection/impl/ColumnProjection.java | 14 +++++++------- .../select/projection/impl/ColumnProjectionTest.java | 9 +++++---- .../apache/shardingsphere/infra/merge/MergeEngine.java | 10 +++++----- .../merge/engine/decorator/ResultDecoratorEngine.java | 6 +++--- .../shardingsphere/infra/merge/MergeEngineTest.java | 16 ++++++++++------ .../fixture/decorator/ResultDecoratorEngineFixture.java | 4 ++-- .../pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java | 2 +- .../jdbc/DriverJDBCPushDownExecuteQueryExecutor.java | 9 ++++----- .../raw/DriverRawPushDownExecuteQueryExecutor.java | 9 ++++----- .../core/resultset/ShardingSphereResultSetFactory.java | 6 +++--- .../executor/enumerable/EnumerableScanExecutor.java | 2 +- .../proxy/backend/connector/DatabaseConnector.java | 2 +- 23 files changed, 86 insertions(+), 81 deletions(-) diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java index dd36e718dc1..9dd12b54067 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java @@ -26,8 +26,8 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement; import java.util.Optional; @@ -38,13 +38,13 @@ import java.util.Optional; public final class EncryptResultDecoratorEngine implements ResultDecoratorEngine<EncryptRule> { @Override - public Optional<ResultDecorator<EncryptRule>> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional<ResultDecorator<EncryptRule>> newInstance(final ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final EncryptRule encryptRule, final ConfigurationProperties props, final SQLStatementContext sqlStatementContext) { if (sqlStatementContext instanceof SelectStatementContext) { - return Optional.of(new EncryptDQLResultDecorator(database, encryptRule, (SelectStatementContext) sqlStatementContext)); + return Optional.of(new EncryptDQLResultDecorator(database, metaData, (SelectStatementContext) sqlStatementContext)); } if (sqlStatementContext.getSqlStatement() instanceof DALStatement) { - return Optional.of(new EncryptDALResultDecorator(globalRuleMetaData)); + return Optional.of(new EncryptDALResultDecorator(metaData.getGlobalRuleMetaData())); } return Optional.empty(); } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java index 07b4535d18c..679e46bf8ce 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; /** @@ -35,17 +36,17 @@ public final class EncryptDQLResultDecorator implements ResultDecorator<EncryptR private final ShardingSphereDatabase database; - private final EncryptRule encryptRule; + private final ShardingSphereMetaData metaData; private final SelectStatementContext selectStatementContext; @Override public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { - return new EncryptMergedResult(database, encryptRule, selectStatementContext, new TransparentMergedResult(queryResult)); + return new EncryptMergedResult(database, metaData, selectStatementContext, new TransparentMergedResult(queryResult)); } @Override public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { - return new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult); + return new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult); } } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java index a7b7141385e..4eafb680c7a 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import java.io.InputStream; @@ -42,7 +43,7 @@ public final class EncryptMergedResult implements MergedResult { private final ShardingSphereDatabase database; - private final EncryptRule encryptRule; + private final ShardingSphereMetaData metaData; private final SelectStatementContext selectStatementContext; @@ -61,6 +62,10 @@ public final class EncryptMergedResult implements MergedResult { } String originalTableName = columnProjection.get().getOriginalTable().getValue(); String originalColumnName = columnProjection.get().getOriginalColumn().getValue(); + ShardingSphereDatabase database = metaData.containsDatabase(columnProjection.get().getColumnBoundInfo().getOriginalDatabase().getValue()) + ? metaData.getDatabase(columnProjection.get().getColumnBoundInfo().getOriginalDatabase().getValue()) + : this.database; + EncryptRule encryptRule = database.getRuleMetaData().getSingleRule(EncryptRule.class); if (!encryptRule.findEncryptTable(originalTableName).map(optional -> optional.isEncryptColumn(originalColumnName)).orElse(false)) { return mergedResult.getValue(columnIndex, type); } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java index 2949565bcaf..bb001274e5e 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java @@ -144,8 +144,7 @@ public final class EncryptProjectionTokenGenerator { IdentifierValue owner = segment.getColumn().getOwner().map(OwnerSegment::getIdentifier).orElse(null); ColumnProjection result = new ColumnProjection(owner, segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ? segment.getAlias().orElse(null) : null, databaseType, segment.getColumn().getLeftParentheses().orElse(null), segment.getColumn().getRightParentheses().orElse(null)); - result.setOriginalColumn(segment.getColumn().getColumnBoundInfo().getOriginalColumn()); - result.setOriginalTable(segment.getColumn().getColumnBoundInfo().getOriginalTable()); + result.setColumnBoundInfo(segment.getColumn().getColumnBoundInfo()); return result; } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java index 96b52ee0bb1..af8131f0eb8 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -58,19 +59,15 @@ class EncryptSelectProjectionSupportedCheckerTest { CombineSegment combineSegment = mock(CombineSegment.class, RETURNS_DEEP_STUBS); when(sqlStatementContext.getSqlStatement().getCombine().get()).thenReturn(combineSegment); ColumnProjection orderIdColumn = new ColumnProjection("o", "order_id", null, new MySQLDatabaseType()); - orderIdColumn.setOriginalTable(new IdentifierValue("t_order")); - orderIdColumn.setOriginalColumn(new IdentifierValue("order_id")); + orderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_order"), new IdentifierValue("order_id"))); ColumnProjection userIdColumn = new ColumnProjection("o", "user_id", null, new MySQLDatabaseType()); - userIdColumn.setOriginalTable(new IdentifierValue("t_order")); - userIdColumn.setOriginalColumn(new IdentifierValue("user_id")); + userIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_order"), new IdentifierValue("user_id"))); SelectStatementContext leftSelectStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); when(leftSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(orderIdColumn, userIdColumn)); ColumnProjection merchantIdColumn = new ColumnProjection("m", "merchant_id", null, new MySQLDatabaseType()); - merchantIdColumn.setOriginalTable(new IdentifierValue("t_merchant")); - merchantIdColumn.setOriginalColumn(new IdentifierValue("merchant_id")); + merchantIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_merchant"), new IdentifierValue("merchant_id"))); ColumnProjection merchantNameColumn = new ColumnProjection("m", "merchant_name", null, new MySQLDatabaseType()); - merchantNameColumn.setOriginalTable(new IdentifierValue("t_merchant")); - merchantNameColumn.setOriginalColumn(new IdentifierValue("merchant_name")); + merchantNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_merchant"), new IdentifierValue("merchant_name"))); SelectStatementContext rightSelectStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); when(rightSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(merchantIdColumn, merchantNameColumn)); Map<Integer, SelectStatementContext> subqueryContexts = new LinkedHashMap<>(2, 1F); diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java index ac3cf265b97..9254e1dd623 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java @@ -27,8 +27,8 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLExplainStatement; import org.junit.jupiter.api.Test; @@ -60,7 +60,7 @@ class EncryptResultDecoratorEngineTest { void assertNewInstanceWithSelectStatement() { EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) OrderedSPILoader.getServices(ResultProcessEngine.class, Collections.singleton(rule)).get(rule); Optional<ResultDecorator<EncryptRule>> actual = - engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS)); + engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS)); assertTrue(actual.isPresent()); assertThat(actual.get(), instanceOf(EncryptDQLResultDecorator.class)); } @@ -70,7 +70,7 @@ class EncryptResultDecoratorEngineTest { SQLStatementContext sqlStatementContext = mock(ExplainStatementContext.class); when(sqlStatementContext.getSqlStatement()).thenReturn(mock(MySQLExplainStatement.class)); EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) OrderedSPILoader.getServices(ResultProcessEngine.class, Collections.singleton(rule)).get(rule); - Optional<ResultDecorator<EncryptRule>> actual = engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), sqlStatementContext); + Optional<ResultDecorator<EncryptRule>> actual = engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, mock(ConfigurationProperties.class), sqlStatementContext); assertTrue(actual.isPresent()); assertThat(actual.get(), instanceOf(EncryptDALResultDecorator.class)); } @@ -78,6 +78,6 @@ class EncryptResultDecoratorEngineTest { @Test void assertNewInstanceWithOtherStatement() { EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) OrderedSPILoader.getServices(ResultProcessEngine.class, Collections.singleton(rule)).get(rule); - assertFalse(engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(InsertStatementContext.class)).isPresent()); + assertFalse(engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(InsertStatementContext.class)).isPresent()); } } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java index f9c1709a055..0b73a14bd52 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.junit.jupiter.api.Test; @@ -37,7 +38,7 @@ class EncryptDQLResultDecoratorTest { void assertDecorateQueryResult() throws SQLException { QueryResult queryResult = mock(QueryResult.class); when(queryResult.next()).thenReturn(true); - EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), mock(EncryptRule.class), mock(SelectStatementContext.class)); + EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class)); MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(EncryptRule.class)); assertTrue(actual.next()); } @@ -46,7 +47,7 @@ class EncryptDQLResultDecoratorTest { void assertDecorateMergedResult() throws SQLException { MergedResult mergedResult = mock(MergedResult.class); when(mergedResult.next()).thenReturn(true); - EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), mock(EncryptRule.class), mock(SelectStatementContext.class)); + EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class)); MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(EncryptRule.class)); assertTrue(actual.next()); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java index 76e9ae65702..13f0082f2df 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java @@ -17,9 +17,9 @@ package org.apache.shardingsphere.encrypt.merge.dql; -import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -45,7 +45,7 @@ class EncryptMergedResultTest { private ShardingSphereDatabase database; @Mock - private EncryptRule encryptRule; + private ShardingSphereMetaData metaData; @Mock private SelectStatementContext selectStatementContext; @@ -55,32 +55,32 @@ class EncryptMergedResultTest { @Test void assertNext() throws SQLException { - assertFalse(new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult).next()); + assertFalse(new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult).next()); } @Test void assertGetCalendarValue() throws SQLException { Calendar calendar = Calendar.getInstance(); when(mergedResult.getCalendarValue(1, Date.class, calendar)).thenReturn(new Date(0L)); - assertThat(new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult).getCalendarValue(1, Date.class, calendar), is(new Date(0L))); + assertThat(new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult).getCalendarValue(1, Date.class, calendar), is(new Date(0L))); } @Test void assertGetInputStream() throws SQLException { InputStream inputStream = mock(InputStream.class); when(mergedResult.getInputStream(1, "asc")).thenReturn(inputStream); - assertThat(new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult).getInputStream(1, "asc"), is(inputStream)); + assertThat(new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult).getInputStream(1, "asc"), is(inputStream)); } @Test void assertGetCharacterStream() throws SQLException { Reader reader = mock(Reader.class); when(mergedResult.getCharacterStream(1)).thenReturn(reader); - assertThat(new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult).getCharacterStream(1), is(reader)); + assertThat(new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult).getCharacterStream(1), is(reader)); } @Test void assertWasNull() throws SQLException { - assertFalse(new EncryptMergedResult(database, encryptRule, selectStatementContext, mergedResult).wasNull()); + assertFalse(new EncryptMergedResult(database, metaData, selectStatementContext, mergedResult).wasNull()); } } diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java index 01d8e896e20..12f2dadbde7 100644 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java +++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java @@ -22,8 +22,8 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mask.constant.MaskOrder; import org.apache.shardingsphere.mask.merge.dql.MaskDQLResultDecorator; import org.apache.shardingsphere.mask.rule.MaskRule; @@ -36,7 +36,7 @@ import java.util.Optional; public final class MaskResultDecoratorEngine implements ResultDecoratorEngine<MaskRule> { @Override - public Optional<ResultDecorator<MaskRule>> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional<ResultDecorator<MaskRule>> newInstance(final ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final MaskRule maskRule, final ConfigurationProperties props, final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof SelectStatementContext ? Optional.of(new MaskDQLResultDecorator(maskRule, (SelectStatementContext) sqlStatementContext)) : Optional.empty(); } diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java index c7db8e81096..cac3b85b121 100644 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java +++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java @@ -22,8 +22,8 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; import org.apache.shardingsphere.mask.merge.dql.MaskDQLResultDecorator; import org.apache.shardingsphere.mask.rule.MaskRule; @@ -55,7 +55,7 @@ class MaskResultDecoratorEngineTest { void assertNewInstanceWithSelectStatement() { MaskResultDecoratorEngine engine = (MaskResultDecoratorEngine) OrderedSPILoader.getServices(ResultProcessEngine.class, Collections.singleton(rule)).get(rule); Optional<ResultDecorator<MaskRule>> actual = - engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS)); + engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS)); assertTrue(actual.isPresent()); assertThat(actual.get(), instanceOf(MaskDQLResultDecorator.class)); } @@ -63,6 +63,6 @@ class MaskResultDecoratorEngineTest { @Test void assertNewInstanceWithOtherStatement() { MaskResultDecoratorEngine engine = (MaskResultDecoratorEngine) OrderedSPILoader.getServices(ResultProcessEngine.class, Collections.singleton(rule)).get(rule); - assertFalse(engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(InsertStatementContext.class)).isPresent()); + assertFalse(engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, mock(ConfigurationProperties.class), mock(InsertStatementContext.class)).isPresent()); } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java index f6b86183941..46a24422a41 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java @@ -110,8 +110,7 @@ public final class ProjectionEngine { IdentifierValue alias = projectionSegment.getAliasName().isPresent() ? projectionSegment.getAlias().orElse(null) : null; ColumnProjection result = new ColumnProjection(owner, projectionSegment.getColumn().getIdentifier(), alias, databaseType, projectionSegment.getColumn().getLeftParentheses().orElse(null), projectionSegment.getColumn().getRightParentheses().orElse(null)); - result.setOriginalColumn(projectionSegment.getColumn().getColumnBoundInfo().getOriginalColumn()); - result.setOriginalTable(projectionSegment.getColumn().getColumnBoundInfo().getOriginalTable()); + result.setColumnBoundInfo(projectionSegment.getColumn().getColumnBoundInfo()); return result; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java index 039d6f8be08..dc53d030945 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java @@ -29,6 +29,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.enums.Quo import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParenthesesSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Optional; @@ -39,7 +40,7 @@ import java.util.Optional; @RequiredArgsConstructor @Getter @Setter -@EqualsAndHashCode(exclude = {"originalTable", "originalColumn"}) +@EqualsAndHashCode(exclude = "columnBoundInfo") @ToString public final class ColumnProjection implements Projection { @@ -55,9 +56,7 @@ public final class ColumnProjection implements Projection { private final ParenthesesSegment rightParentheses; - private IdentifierValue originalTable; - - private IdentifierValue originalColumn; + private ColumnSegmentBoundInfo columnBoundInfo; public ColumnProjection(final String owner, final String name, final String alias, final DatabaseType databaseType) { this(null == owner ? null : new IdentifierValue(owner, QuoteCharacter.NONE), new IdentifierValue(name, QuoteCharacter.NONE), @@ -83,10 +82,10 @@ public final class ColumnProjection implements Projection { * @return original table */ public IdentifierValue getOriginalTable() { - if (null == originalTable || Strings.isNullOrEmpty(originalTable.getValue())) { + if (null == columnBoundInfo || null == columnBoundInfo.getOriginalTable() || Strings.isNullOrEmpty(columnBoundInfo.getOriginalTable().getValue())) { return null == owner ? new IdentifierValue("") : owner; } - return originalTable; + return columnBoundInfo.getOriginalTable(); } /** @@ -95,7 +94,8 @@ public final class ColumnProjection implements Projection { * @return original column */ public IdentifierValue getOriginalColumn() { - return null == originalColumn || Strings.isNullOrEmpty(originalColumn.getValue()) ? name : originalColumn; + return null == columnBoundInfo || null == columnBoundInfo.getOriginalColumn() || Strings.isNullOrEmpty(columnBoundInfo.getOriginalColumn().getValue()) ? name + : columnBoundInfo.getOriginalColumn(); } /** diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java index 5f7ed51cc9e..6e5193671b3 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.binder.context.segment.select.projection import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -45,14 +46,14 @@ class ColumnProjectionTest { @Test void assertGetOriginalTableWithEmptyOriginalTableAndWithOwner() { ColumnProjection projection = new ColumnProjection("owner", "name", "alias", databaseType); - projection.setOriginalTable(new IdentifierValue("")); + projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""))); assertThat(projection.getOriginalTable(), is(new IdentifierValue("owner"))); } @Test void assertGetOriginalTable() { ColumnProjection projection = new ColumnProjection("owner", "name", "alias", databaseType); - projection.setOriginalTable(new IdentifierValue("tbl")); + projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("tbl"), new IdentifierValue(""))); assertThat(projection.getOriginalTable(), is(new IdentifierValue("tbl"))); } @@ -64,14 +65,14 @@ class ColumnProjectionTest { @Test void assertGetOriginalColumnWithEmptyOriginalColumn() { ColumnProjection projection = new ColumnProjection(null, "name", "alias", databaseType); - projection.setOriginalColumn(new IdentifierValue("")); + projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue(""))); assertThat(projection.getOriginalColumn(), is(new IdentifierValue("name"))); } @Test void assertGetOriginalColumn() { ColumnProjection projection = new ColumnProjection(null, "name", "alias", databaseType); - projection.setOriginalColumn(new IdentifierValue("col")); + projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new IdentifierValue("col"))); assertThat(projection.getOriginalColumn(), is(new IdentifierValue("col"))); } diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java index cd931787c1d..f410b4240c9 100644 --- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java +++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java @@ -29,8 +29,8 @@ import org.apache.shardingsphere.infra.merge.engine.merger.ResultMerger; import org.apache.shardingsphere.infra.merge.engine.merger.ResultMergerEngine; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; @@ -47,7 +47,7 @@ import java.util.Optional; @HighFrequencyInvocation public final class MergeEngine { - private final RuleMetaData globalRuleMetaData; + private final ShardingSphereMetaData metaData; private final ShardingSphereDatabase database; @@ -58,8 +58,8 @@ public final class MergeEngine { private final ConnectionContext connectionContext; - public MergeEngine(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final ConfigurationProperties props, final ConnectionContext connectionContext) { - this.globalRuleMetaData = globalRuleMetaData; + public MergeEngine(final ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final ConfigurationProperties props, final ConnectionContext connectionContext) { + this.metaData = metaData; this.database = database; this.props = props; engines = OrderedSPILoader.getServices(ResultProcessEngine.class, database.getRuleMetaData().getRules()); @@ -117,7 +117,7 @@ public final class MergeEngine { @SuppressWarnings({"unchecked", "rawtypes"}) private ResultDecorator getResultDecorator(final SQLStatementContext sqlStatementContext, final Entry<ShardingSphereRule, ResultProcessEngine> entry) { - return (ResultDecorator) ((ResultDecoratorEngine) entry.getValue()).newInstance(globalRuleMetaData, database, entry.getKey(), props, sqlStatementContext) + return (ResultDecorator) ((ResultDecoratorEngine) entry.getValue()).newInstance(metaData, database, entry.getKey(), props, sqlStatementContext) .orElseGet(TransparentResultDecorator::new); } } diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java index 83baab91121..b2a1d282eb6 100644 --- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java +++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java @@ -20,8 +20,8 @@ package org.apache.shardingsphere.infra.merge.engine.decorator; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import java.util.Optional; @@ -36,12 +36,12 @@ public interface ResultDecoratorEngine<T extends ShardingSphereRule> extends Res /** * Create new instance of result decorator. * - * @param globalRuleMetaData global rule meta data + * @param metaData meta data * @param database database * @param rule rule * @param props configuration properties * @param sqlStatementContext SQL statement context * @return created instance */ - Optional<ResultDecorator<T>> newInstance(RuleMetaData globalRuleMetaData, ShardingSphereDatabase database, T rule, ConfigurationProperties props, SQLStatementContext sqlStatementContext); + Optional<ResultDecorator<T>> newInstance(ShardingSphereMetaData metaData, ShardingSphereDatabase database, T rule, ConfigurationProperties props, SQLStatementContext sqlStatementContext); } diff --git a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java index e22aed41204..ee2810b5bea 100644 --- a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java +++ b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java @@ -19,13 +19,13 @@ package org.apache.shardingsphere.infra.merge; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; -import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult; import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture; import org.apache.shardingsphere.infra.merge.fixture.rule.MergerRuleFixture; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.test.fixture.infra.rule.MockedRule; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -60,7 +60,8 @@ class MergeEngineTest { when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new MockedRule())); when(queryResult.getValue(1, String.class)).thenReturn("test"); MergedResult actual = - new MergeEngine(mock(RuleMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult), + new MergeEngine(mock(ShardingSphereMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge( + Collections.singletonList(queryResult), mock(SQLStatementContext.class)); assertThat(actual.getValue(1, String.class), is("test")); } @@ -69,7 +70,8 @@ class MergeEngineTest { void assertMergeWithMergerRuleOnly() throws SQLException { when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new MergerRuleFixture())); MergedResult actual = - new MergeEngine(mock(RuleMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult), + new MergeEngine(mock(ShardingSphereMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge( + Collections.singletonList(queryResult), mock(SQLStatementContext.class)); assertThat(actual.getValue(1, String.class), is("merged_value")); } @@ -78,7 +80,8 @@ class MergeEngineTest { void assertMergeWithDecoratorRuleOnly() throws SQLException { when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new DecoratorRuleFixture())); MergedResult actual = - new MergeEngine(mock(RuleMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult), + new MergeEngine(mock(ShardingSphereMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge( + Collections.singletonList(queryResult), mock(SQLStatementContext.class)); assertThat(actual.getValue(1, String.class), is("decorated_value")); } @@ -87,7 +90,8 @@ class MergeEngineTest { void assertMergeWithMergerRuleAndDecoratorRuleTogether() throws SQLException { when(database.getRuleMetaData().getRules()).thenReturn(Arrays.asList(new MergerRuleFixture(), new DecoratorRuleFixture())); MergedResult actual = - new MergeEngine(mock(RuleMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult), + new MergeEngine(mock(ShardingSphereMetaData.class), database, new ConfigurationProperties(new Properties()), mock(ConnectionContext.class)).merge( + Collections.singletonList(queryResult), mock(SQLStatementContext.class)); assertThat(actual.getValue(1, String.class), is("decorated_merged_value")); } diff --git a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java index fe559ebbae9..7c0296f9cc1 100644 --- a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java +++ b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java @@ -22,15 +22,15 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine; import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import java.util.Optional; public final class ResultDecoratorEngineFixture implements ResultDecoratorEngine<DecoratorRuleFixture> { @Override - public Optional<ResultDecorator<DecoratorRuleFixture>> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional<ResultDecorator<DecoratorRuleFixture>> newInstance(final ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final DecoratorRuleFixture rule, final ConfigurationProperties props, final SQLStatementContext sqlStatementContext) { return Optional.of(new ResultDecoratorFixture()); } diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java index 19fc46a5ea1..b385d5d2ab9 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java @@ -145,7 +145,7 @@ public final class DriverJDBCPushDownExecuteExecutor { return Optional.empty(); } List<QueryResult> queryResults = getQueryResults(resultSets); - MergedResult mergedResult = new MergeEngine(metaData.getGlobalRuleMetaData(), database, metaData.getProps(), connection.getDatabaseConnectionManager().getConnectionContext()) + MergedResult mergedResult = new MergeEngine(metaData, database, metaData.getProps(), connection.getDatabaseConnectionManager().getConnectionContext()) .merge(queryResults, sqlStatementContext); return Optional.of(new ShardingSphereResultSet(resultSets, mergedResult, statement, sqlStatementContext)); } diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java index 35b8a7cb171..ed64ea06e64 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java @@ -36,7 +36,6 @@ import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriv import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; @@ -59,7 +58,7 @@ public final class DriverJDBCPushDownExecuteQueryExecutor { private final String processId; - private final RuleMetaData globalRuleMetaData; + private final ShardingSphereMetaData metaData; private final ConfigurationProperties props; @@ -70,7 +69,7 @@ public final class DriverJDBCPushDownExecuteQueryExecutor { public DriverJDBCPushDownExecuteQueryExecutor(final ShardingSphereConnection connection, final ShardingSphereMetaData metaData, final JDBCExecutor jdbcExecutor) { connectionContext = connection.getDatabaseConnectionManager().getConnectionContext(); processId = connection.getProcessId(); - globalRuleMetaData = metaData.getGlobalRuleMetaData(); + this.metaData = metaData; props = metaData.getProps(); this.jdbcExecutor = jdbcExecutor; statements = new LinkedList<>(); @@ -95,14 +94,14 @@ public final class DriverJDBCPushDownExecuteQueryExecutor { final Map<String, Integer> columnLabelAndIndexMap, final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException { List<QueryResult> queryResults = getQueryResults(database, queryContext, prepareEngine, addCallback, replayCallback); - return new ShardingSphereResultSetFactory(connectionContext, globalRuleMetaData, props, statements).newInstance(database, queryContext, queryResults, statement, columnLabelAndIndexMap); + return new ShardingSphereResultSetFactory(connectionContext, metaData, props, statements).newInstance(database, queryContext, queryResults, statement, columnLabelAndIndexMap); } @SuppressWarnings({"rawtypes", "unchecked"}) private List<QueryResult> getQueryResults(final ShardingSphereDatabase database, final QueryContext queryContext, final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException { statements.clear(); - ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, props); + ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, metaData.getGlobalRuleMetaData(), props); ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = prepareEngine.prepare(database.getName(), executionContext.getRouteContext(), executionContext.getExecutionUnits(), new ExecutionGroupReportContext(processId, database.getName(), connectionContext.getGrantee())); for (ExecutionGroup<JDBCExecutionUnit> each : executionGroupContext.getInputGroups()) { diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java index 2fd83d4c978..a115f340f22 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java @@ -32,7 +32,6 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe import org.apache.shardingsphere.infra.executor.sql.prepare.raw.RawExecutionPrepareEngine; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; @@ -53,7 +52,7 @@ public final class DriverRawPushDownExecuteQueryExecutor { private final String processId; - private final RuleMetaData globalRuleMetaData; + private final ShardingSphereMetaData metaData; private final ConfigurationProperties props; @@ -62,7 +61,7 @@ public final class DriverRawPushDownExecuteQueryExecutor { public DriverRawPushDownExecuteQueryExecutor(final ShardingSphereConnection connection, final ShardingSphereMetaData metaData, final RawExecutor rawExecutor) { connectionContext = connection.getDatabaseConnectionManager().getConnectionContext(); processId = connection.getProcessId(); - globalRuleMetaData = metaData.getGlobalRuleMetaData(); + this.metaData = metaData; props = metaData.getProps(); this.rawExecutor = rawExecutor; } @@ -80,12 +79,12 @@ public final class DriverRawPushDownExecuteQueryExecutor { public ResultSet executeQuery(final ShardingSphereDatabase database, final QueryContext queryContext, final Statement statement, final Map<String, Integer> columnLabelAndIndexMap) throws SQLException { List<QueryResult> queryResults = getQueryResults(database, queryContext); - return new ShardingSphereResultSetFactory(connectionContext, globalRuleMetaData, props, Collections.emptyList()) + return new ShardingSphereResultSetFactory(connectionContext, metaData, props, Collections.emptyList()) .newInstance(database, queryContext, queryResults, statement, columnLabelAndIndexMap); } private List<QueryResult> getQueryResults(final ShardingSphereDatabase database, final QueryContext queryContext) throws SQLException { - ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, props); + ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, metaData.getGlobalRuleMetaData(), props); return rawExecutor.execute( createRawExecutionGroupContext(database, executionContext), queryContext, new RawSQLExecutorCallback()).stream().map(QueryResult.class::cast).collect(Collectors.toList()); } diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java index 4d9f8ade6e3..fe5de62de54 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java @@ -23,8 +23,8 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult; import org.apache.shardingsphere.infra.merge.MergeEngine; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; @@ -45,7 +45,7 @@ public final class ShardingSphereResultSetFactory { private final ConnectionContext connectionContext; - private final RuleMetaData globalRuleMetaData; + private final ShardingSphereMetaData metaData; private final ConfigurationProperties props; @@ -65,7 +65,7 @@ public final class ShardingSphereResultSetFactory { public ResultSet newInstance(final ShardingSphereDatabase database, final QueryContext queryContext, final List<QueryResult> queryResults, final Statement statement, final Map<String, Integer> columnLabelAndIndexMap) throws SQLException { List<ResultSet> resultSets = getResultSets(); - MergedResult mergedResult = new MergeEngine(globalRuleMetaData, database, props, connectionContext).merge(queryResults, queryContext.getSqlStatementContext()); + MergedResult mergedResult = new MergeEngine(metaData, database, props, connectionContext).merge(queryResults, queryContext.getSqlStatementContext()); return new ShardingSphereResultSet(resultSets, mergedResult, statement, queryContext.getSqlStatementContext(), null == columnLabelAndIndexMap ? ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(), resultSets.get(0).getMetaData()) diff --git a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java index 6242a06c745..3be60e46f33 100644 --- a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java +++ b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java @@ -135,7 +135,7 @@ public final class EnumerableScanExecutor implements ScanExecutor { ShardingSpherePreconditions.checkState(!ProcessRegistry.getInstance().get(federationContext.getProcessId()).isInterrupted(), SQLExecutionInterruptedException::new); processEngine.executeSQL(executionGroupContext, federationContext.getQueryContext()); List<QueryResult> queryResults = jdbcExecutor.execute(executionGroupContext, callback).stream().map(QueryResult.class::cast).collect(Collectors.toList()); - MergeEngine mergeEngine = new MergeEngine(federationContext.getMetaData().getGlobalRuleMetaData(), database, executorContext.getProps(), new ConnectionContext(Collections::emptySet)); + MergeEngine mergeEngine = new MergeEngine(federationContext.getMetaData(), database, executorContext.getProps(), new ConnectionContext(Collections::emptySet)); MergedResult mergedResult = mergeEngine.merge(queryResults, queryContext.getSqlStatementContext()); Collection<Statement> statements = getStatements(executionGroupContext.getInputGroups()); return new JDBCRowEnumerator(mergedResult, queryResults.get(0).getMetaData(), statements); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java index 42bec4c3bc0..46cd93db397 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java @@ -314,7 +314,7 @@ public final class DatabaseConnector implements DatabaseBackendHandler { } private MergedResult mergeQuery(final SQLStatementContext sqlStatementContext, final List<QueryResult> queryResults) throws SQLException { - MergeEngine mergeEngine = new MergeEngine(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData(), + MergeEngine mergeEngine = new MergeEngine(contextManager.getMetaDataContexts().getMetaData(), database, contextManager.getMetaDataContexts().getMetaData().getProps(), databaseConnectionManager.getConnectionSession().getConnectionContext()); return mergeEngine.merge(queryResults, sqlStatementContext); }