This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 8c2649db8d5 Split same actual table name meta data test into
owner-focused unit tests (#39511)
8c2649db8d5 is described below
commit 8c2649db8d58be090ef8cd88beb99b33965b955e
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Aug 19 10:31:59 2026 +0800
Split same actual table name meta data test into owner-focused unit tests
(#39511)
* Support parsing Doris CREATE TABLE AS SELECT with key clause and ADMIN
REBALANCE DISK
* Split same actual table name meta data test into owner-focused unit tests
* Remove ShardingSameActualTableNameMetaDataVisibilityTest which violates
unit test naming contract
* Assert MetaDataLoader stamps storage unit name on loaded table meta data
* Assert TableMetaDataReviseEngine passes table's storage unit name to
table name reviser
* Add ShardingRuleTest for findShardingTableByDataSourceAndActualTable
disambiguation
* Add ShardingTableTest for containsDataNode branches
---
.../metadata/data/loader/MetaDataLoaderTest.java | 4 +-
...gSameActualTableNameMetaDataVisibilityTest.java | 180 ---------------------
.../sharding/rule/ShardingRuleTest.java | 11 ++
.../sharding/rule/ShardingTableTest.java | 9 ++
.../table/TableMetadataReviseEngineTest.java | 4 +-
5 files changed, 25 insertions(+), 183 deletions(-)
diff --git
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/MetaDataLoaderTest.java
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/MetaDataLoaderTest.java
index f0e60a19844..ac67661fb8f 100644
---
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/MetaDataLoaderTest.java
+++
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/MetaDataLoaderTest.java
@@ -62,7 +62,9 @@ class MetaDataLoaderTest {
new SchemaMetaData("foo_db", Collections.singleton(new
TableMetaData("foo_tbl", Collections.emptyList(), Collections.emptyList(),
Collections.emptyList())))));
try (AutoCloseable ignored =
registerDialectMetaDataLoader(dialectMetaDataLoader)) {
Map<String, SchemaMetaData> actual =
MetaDataLoader.load(Collections.singleton(material));
-
assertThat(actual.get("foo_db").getTables().iterator().next().getName(),
is("foo_tbl"));
+ TableMetaData actualTable =
actual.get("foo_db").getTables().iterator().next();
+ assertThat(actualTable.getName(), is("foo_tbl"));
+ assertThat(actualTable.getStorageUnitName(),
is("dialect_success"));
}
}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSameActualTableNameMetaDataVisibilityTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSameActualTableNameMetaDataVisibilityTest.java
deleted file mode 100644
index d14db5acfd9..00000000000
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSameActualTableNameMetaDataVisibilityTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sharding.metadata;
-
-import lombok.SneakyThrows;
-import
org.apache.shardingsphere.database.connector.core.metadata.data.loader.DialectMetaDataLoader;
-import
org.apache.shardingsphere.database.connector.core.metadata.data.loader.MetaDataLoaderMaterial;
-import
org.apache.shardingsphere.database.connector.core.metadata.data.model.ColumnMetaData;
-import
org.apache.shardingsphere.database.connector.core.metadata.data.model.SchemaMetaData;
-import
org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.datatype.DataTypeRegistry;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
-import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
-import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
-import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContextFactory;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
-import
org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
-import
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.internal.configuration.plugins.Plugins;
-import org.mockito.junit.jupiter.MockitoSettings;
-import org.mockito.quality.Strictness;
-
-import javax.sql.DataSource;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.stream.Collectors;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsInAnyOrder;
-import static org.hamcrest.Matchers.is;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@ExtendWith(AutoMockExtension.class)
-@MockitoSettings(strictness = Strictness.LENIENT)
-@StaticMockSettings(DataTypeRegistry.class)
-class ShardingSameActualTableNameMetaDataVisibilityTest {
-
- private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
-
- @Test
- void
assertBuildKeepsBothLogicTablesWhenSameActualTableNameInDifferentStorageUnits()
throws Exception {
- DialectMetaDataLoader dialectMetaDataLoader =
mock(DialectMetaDataLoader.class);
- when(dialectMetaDataLoader.getType()).thenReturn(databaseType);
-
when(dialectMetaDataLoader.load(any(MetaDataLoaderMaterial.class))).thenAnswer(invocation
-> createDialectLoadedSchema(invocation.getArgument(0)));
- try (AutoCloseable ignored =
registerDialectMetaDataLoader(dialectMetaDataLoader)) {
- assertBothLogicTablesVisible(new Properties());
- }
- }
-
- @Test
- void assertBuildKeepsBothLogicTablesWhenCheckTableMetaDataEnabled() throws
Exception {
- DialectMetaDataLoader dialectMetaDataLoader =
mock(DialectMetaDataLoader.class);
- when(dialectMetaDataLoader.getType()).thenReturn(databaseType);
-
when(dialectMetaDataLoader.load(any(MetaDataLoaderMaterial.class))).thenAnswer(invocation
-> createDialectLoadedSchema(invocation.getArgument(0)));
- Properties props = new Properties();
- props.setProperty("check-table-metadata-enabled", "true");
- try (AutoCloseable ignored =
registerDialectMetaDataLoader(dialectMetaDataLoader)) {
- assertBothLogicTablesVisible(props);
- }
- }
-
- private void assertBothLogicTablesVisible(final Properties props) throws
SQLException {
- ShardingRule rule = createShardingRule();
- GenericSchemaBuilderMaterial material = createMaterial(rule, props);
- Map<String, ShardingSphereSchema> actual =
GenericSchemaBuilder.build(Arrays.asList("t_order0", "t_order1"), databaseType,
material);
- Collection<String> actualTableNames =
actual.get(material.getDefaultSchemaName()).getAllTables().stream().map(ShardingSphereTable::getName).collect(Collectors.toList());
- assertThat(actual.size(), is(1));
- assertThat(actualTableNames.size(), is(2));
- assertThat(actualTableNames, containsInAnyOrder("t_order0",
"t_order1"));
- }
-
- private Collection<SchemaMetaData> createDialectLoadedSchema(final
MetaDataLoaderMaterial material) {
- return Collections.singleton(new
SchemaMetaData(material.getDefaultSchemaName(),
Collections.singletonList(createPhysicalTableMetaData())));
- }
-
- private TableMetaData createPhysicalTableMetaData() {
- Collection<ColumnMetaData> columns = Arrays.asList(
- new ColumnMetaData("order_id", Types.BIGINT, true, false,
true, true, false, false),
- new ColumnMetaData("user_id", Types.INTEGER, false, false,
true, true, false, false),
- new ColumnMetaData("status", Types.VARCHAR, false, false,
true, true, false, false));
- return new TableMetaData("t_order", columns, Collections.emptyList(),
Collections.emptyList());
- }
-
- private GenericSchemaBuilderMaterial createMaterial(final ShardingRule
rule, final Properties props) {
- Map<String, StorageUnit> storageUnits = new LinkedHashMap<>(2, 1F);
- storageUnits.put("ds_0", createStorageUnit());
- storageUnits.put("ds_1", createStorageUnit());
- return new GenericSchemaBuilderMaterial(storageUnits,
Collections.singleton(rule), new ConfigurationProperties(props),
- "sharding_db",
DatabaseIdentifierContextFactory.createDefault());
- }
-
- private StorageUnit createStorageUnit() {
- StorageUnit result = mock(StorageUnit.class);
- when(result.getStorageType()).thenReturn(databaseType);
- when(result.getDataSource()).thenReturn(new MockedDataSource());
- return result;
- }
-
- private ShardingRule createShardingRule() {
- ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
- ruleConfig.getTables().add(new
ShardingTableRuleConfiguration("t_order0", "ds_0.t_order"));
- ruleConfig.getTables().add(new
ShardingTableRuleConfiguration("t_order1", "ds_1.t_order"));
- ComputeNodeInstanceContext computeNodeInstanceContext =
mock(ComputeNodeInstanceContext.class);
- when(computeNodeInstanceContext.getWorkerId()).thenReturn(0);
- Map<String, DataSource> dataSources = new LinkedHashMap<>(2, 1F);
- dataSources.put("ds_0", new MockedDataSource());
- dataSources.put("ds_1", new MockedDataSource());
- return new ShardingRule(ruleConfig, dataSources,
computeNodeInstanceContext, Collections.emptyList());
- }
-
- @SneakyThrows(ReflectiveOperationException.class)
- private AutoCloseable registerDialectMetaDataLoader(final
DialectMetaDataLoader service) {
- Map<Class<?>, Object> registeredServices = getRegisteredServices();
- Object original = registeredServices.put(DialectMetaDataLoader.class,
createRegisteredService(service));
- return () -> restoreDialectMetaDataLoader(registeredServices,
original);
- }
-
- @SuppressWarnings("unchecked")
- private Map<Class<?>, Object> getRegisteredServices() throws
ReflectiveOperationException {
- Field registeredServicesField =
ShardingSphereServiceLoader.class.getDeclaredField("REGISTERED_SERVICES");
- return (Map<Class<?>, Object>)
Plugins.getMemberAccessor().get(registeredServicesField,
ShardingSphereServiceLoader.class);
- }
-
- @SuppressWarnings("unchecked")
- private Object createRegisteredService(final DialectMetaDataLoader
service) throws ReflectiveOperationException {
- Class<?> registeredServiceClass =
Class.forName("org.apache.shardingsphere.infra.spi.RegisteredShardingSphereSPI");
- Constructor<?> constructor =
registeredServiceClass.getDeclaredConstructor(Class.class);
- Object result = Plugins.getMemberAccessor().newInstance(constructor,
DialectMetaDataLoader.class);
- Field servicesField =
registeredServiceClass.getDeclaredField("services");
- Collection<DialectMetaDataLoader> services =
(Collection<DialectMetaDataLoader>)
Plugins.getMemberAccessor().get(servicesField, result);
- services.clear();
- services.add(service);
- return result;
- }
-
- private void restoreDialectMetaDataLoader(final Map<Class<?>, Object>
registeredServices, final Object original) {
- if (null == original) {
- registeredServices.remove(DialectMetaDataLoader.class);
- } else {
- registeredServices.put(DialectMetaDataLoader.class, original);
- }
- }
-}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
index cff49c0e6ed..e3d1f25e7c3 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
@@ -551,6 +551,17 @@ class ShardingRuleTest {
assertThat(shardingRule.getDataSourceNames(), is(new
LinkedHashSet<>(Arrays.asList("ds_0", "ds_1", "resource0", "resource1"))));
}
+ @Test
+ void assertFindShardingTableByDataSourceAndActualTable() {
+ ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
+ shardingRuleConfig.getTables().add(new
ShardingTableRuleConfiguration("t_order_0", "ds_0.t_order"));
+ shardingRuleConfig.getTables().add(new
ShardingTableRuleConfiguration("t_order_1", "ds_1.t_order"));
+ ShardingRule shardingRule = new ShardingRule(shardingRuleConfig,
createDataSources(), mock(ComputeNodeInstanceContext.class),
Collections.emptyList());
+
assertThat(shardingRule.findShardingTableByDataSourceAndActualTable("ds_0",
"t_order").get().getLogicTable(), is("t_order_0"));
+
assertThat(shardingRule.findShardingTableByDataSourceAndActualTable("ds_1",
"t_order").get().getLogicTable(), is("t_order_1"));
+
assertFalse(shardingRule.findShardingTableByDataSourceAndActualTable("ds_0",
"t_order_2").isPresent());
+ }
+
private ShardingRule createMaximumShardingRule() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
ShardingTableRuleConfiguration shardingTableRuleConfig =
createTableRuleConfiguration("LOGIC_TABLE", "ds_${0..1}.table_${0..2}");
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingTableTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingTableTest.java
index 057c539fcc0..0bf1203c145 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingTableTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingTableTest.java
@@ -34,6 +34,7 @@ import java.util.Arrays;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ShardingTableTest {
@@ -54,6 +55,14 @@ class ShardingTableTest {
assertThat(actual.getKeyGeneratorName(), is("increment"));
}
+ @Test
+ void assertContainsDataNode() {
+ ShardingTable actual = createShardingTable();
+ assertTrue(actual.containsDataNode("ds0", "table_0"));
+ assertFalse(actual.containsDataNode("ds0", "table_9"));
+ assertFalse(actual.containsDataNode("ds9", "table_0"));
+ }
+
private ShardingTable createShardingTable() {
ShardingTableRuleConfiguration shardingTableRuleConfig = new
ShardingTableRuleConfiguration("LOGIC_TABLE", "ds${0..1}.table_${0..2}");
shardingTableRuleConfig.setDatabaseShardingStrategy(new
NoneShardingStrategyConfiguration());
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java
index eba5273bd42..cea0b9aa43b 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java
@@ -36,7 +36,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -63,8 +62,9 @@ class TableMetadataReviseEngineTest<T extends
ShardingSphereRule> {
void assertGetRevisedTableName() {
TableNameReviser tableNameReviser = mock(TableNameReviser.class);
TableMetaData originalMetaData = new
TableMetaData("originalTableName", new LinkedList<>(), null, null);
+ originalMetaData.setStorageUnitName("ds_0");
when(metaDataReviseEntry.getTableNameReviser()).thenReturn(Optional.of(tableNameReviser));
- when(tableNameReviser.revise(anyString(), eq(rule),
isNull())).thenReturn("revisedTableName");
+ when(tableNameReviser.revise(anyString(), eq(rule),
eq("ds_0"))).thenReturn("revisedTableName");
TableMetaData revisedMetaData = engine.revise(originalMetaData);
assertThat(revisedMetaData.getName(), is("revisedTableName"));
}