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 dd36e718dc1d7..9dd12b54067ee 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.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 @@ public final class EncryptResultDecoratorEngine implements ResultDecoratorEngine { @Override - public Optional> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional> 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 07b4535d18cef..679e46bf8ce54 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.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 type) throws SQLExc } 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 2949565bcaf99..bb001274e5e83 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 @@ private ColumnProjection buildColumnProjection(final ColumnProjectionSegment seg 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 96b52ee0bb1bb..af8131f0eb863 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.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 @@ void assertCheckWhenCombineStatementContainsEncryptColumn() { 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 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 ac3cf265b97c4..9254e1dd623ab 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.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> 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 @@ void assertNewInstanceWithDALStatement() { 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> actual = engine.newInstance(mock(RuleMetaData.class), database, rule, mock(ConfigurationProperties.class), sqlStatementContext); + Optional> 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 @@ void assertNewInstanceWithDALStatement() { @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 f9c1709a0552a..0b73a14bd5267 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.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 @@ void assertDecorateQueryResult() throws SQLException { 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 76e9ae6570205..13f0082f2df32 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 01d8e896e204f..12f2dadbde72b 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.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 @@ public final class MaskResultDecoratorEngine implements ResultDecoratorEngine { @Override - public Optional> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional> 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 c7db8e8109655..cac3b85b121ee 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.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> 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 @@ void assertNewInstanceWithSelectStatement() { @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 f6b8618394152..46a24422a41d0 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 @@ private ColumnProjection createProjection(final ColumnProjectionSegment projecti 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 039d6f8be0816..dc53d03094572 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.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 @@ @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 Optional getOwner() { * @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 IdentifierValue getOriginalTable() { * @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 5f7ed51cc9e59..6e5193671b393 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 @@ 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 @@ void assertGetOriginalTableWithNullOriginalTableAndWithoutOwner() { @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 @@ void assertGetOriginalColumnWithNullOriginalColumn() { @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 cd931787c1db8..f410b4240c999 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.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 @@ @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 @@ private Optional decorate(final QueryResult queryResult, final SQL @SuppressWarnings({"unchecked", "rawtypes"}) private ResultDecorator getResultDecorator(final SQLStatementContext sqlStatementContext, final Entry 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 83baab91121b7..b2a1d282eb68d 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 @@ 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 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> newInstance(RuleMetaData globalRuleMetaData, ShardingSphereDatabase database, T rule, ConfigurationProperties props, SQLStatementContext sqlStatementContext); + Optional> 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 e22aed412046a..ee2810b5bea2b 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 @@ 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 @@ void assertMergeWithIndependentRule() throws SQLException { 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 @@ void assertMergeWithIndependentRule() throws SQLException { 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 @@ void assertMergeWithMergerRuleOnly() throws SQLException { 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 @@ void assertMergeWithDecoratorRuleOnly() throws SQLException { 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 fe559ebbae985..7c0296f9cc124 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.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 { @Override - public Optional> newInstance(final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, + public Optional> 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 19fc46a5ea12b..b385d5d2ab927 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 Optional getResultSet(final ShardingSphereDatabase database, f return Optional.empty(); } List 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 35b8a7cb171d6..ed64ea06e64d0 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.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 ResultSet executeQuery(final ShardingSphereDatabase database, final Query final Map columnLabelAndIndexMap, final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException { List 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 getQueryResults(final ShardingSphereDatabase database, final QueryContext queryContext, final DriverExecutionPrepareEngine 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 executionGroupContext = prepareEngine.prepare(database.getName(), executionContext.getRouteContext(), executionContext.getExecutionUnits(), new ExecutionGroupReportContext(processId, database.getName(), connectionContext.getGrantee())); for (ExecutionGroup 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 2fd83d4c978b4..a115f340f22c6 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.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 DriverRawPushDownExecuteQueryExecutor(final ShardingSphereConnection conn public ResultSet executeQuery(final ShardingSphereDatabase database, final QueryContext queryContext, final Statement statement, final Map columnLabelAndIndexMap) throws SQLException { List 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 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 4d9f8ade6e3a1..fe5de62de54d4 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.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 queryResults, final Statement statement, final Map columnLabelAndIndexMap) throws SQLException { List 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 6242a06c745db..3be60e46f33dd 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 Enumerator enumerator() { ShardingSpherePreconditions.checkState(!ProcessRegistry.getInstance().get(federationContext.getProcessId()).isInterrupted(), SQLExecutionInterruptedException::new); processEngine.executeSQL(executionGroupContext, federationContext.getQueryContext()); List 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 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 42bec4c3bc0d6..46cd93db39795 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 @@ private QueryHeader createQueryHeader(final QueryHeaderBuilderEngine queryHeader } private MergedResult mergeQuery(final SQLStatementContext sqlStatementContext, final List 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); }