This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 573531d6957 Add test cases on TableMetaDataPersistService (#32982)
573531d6957 is described below
commit 573531d69570191693099fa5d405576eca9e536e
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Sep 24 20:14:59 2024 +0800
Add test cases on TableMetaDataPersistService (#32982)
---
.../schema/TableMetaDataPersistService.java | 27 +++----
.../schema/TableMetaDataPersistServiceTest.java | 94 ++++++++++++++++++++++
2 files changed, 107 insertions(+), 14 deletions(-)
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
index 4562f5ea9a5..3df33a65db5 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -35,6 +35,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
/**
* Table meta data persist service.
@@ -53,7 +54,7 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
String tableName = entry.getKey().toLowerCase();
List<String> versions =
repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName,
schemaName, tableName));
String nextActiveVersion = versions.isEmpty() ?
MetaDataVersion.DEFAULT_VERSION :
String.valueOf(Integer.parseInt(versions.get(0)) + 1);
- if (entry.getValue() != null) {
+ if (null != entry.getValue()) {
repository.persist(TableMetaDataNode.getTableVersionNode(databaseName,
schemaName, tableName, nextActiveVersion),
YamlEngine.marshal(new
YamlTableSwapper().swapToYamlConfiguration(entry.getValue())));
}
@@ -71,25 +72,23 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
@Override
public Map<String, ShardingSphereTable> load(final String databaseName,
final String schemaName) {
- Collection<String> tableNames =
repository.getChildrenKeys(TableMetaDataNode.getMetaDataTablesNode(databaseName,
schemaName));
- return tableNames.isEmpty() ? Collections.emptyMap() :
getTableMetaDataByTableNames(databaseName, schemaName, tableNames);
+ List<String> tableNames =
repository.getChildrenKeys(TableMetaDataNode.getMetaDataTablesNode(databaseName,
schemaName));
+ Map<String, ShardingSphereTable> result = new
LinkedHashMap<>(tableNames.size(), 1F);
+ for (String each : tableNames) {
+ getTableMetaData(databaseName, schemaName,
each).ifPresent(optional -> result.put(each.toLowerCase(), optional));
+ }
+ return result;
}
@Override
public Map<String, ShardingSphereTable> load(final String databaseName,
final String schemaName, final String tableName) {
- return getTableMetaDataByTableNames(databaseName, schemaName,
Collections.singletonList(tableName));
+ return getTableMetaData(databaseName, schemaName,
tableName).map(optional -> Collections.singletonMap(tableName.toLowerCase(),
optional)).orElse(Collections.emptyMap());
}
- private Map<String, ShardingSphereTable>
getTableMetaDataByTableNames(final String databaseName, final String
schemaName, final Collection<String> tableNames) {
- Map<String, ShardingSphereTable> result = new
LinkedHashMap<>(tableNames.size(), 1F);
- tableNames.forEach(each -> {
- String table =
repository.query(TableMetaDataNode.getTableVersionNode(databaseName,
schemaName, each,
-
repository.query(TableMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, each))));
- if (!Strings.isNullOrEmpty(table)) {
- result.put(each.toLowerCase(), new
YamlTableSwapper().swapToObject(YamlEngine.unmarshal(table,
YamlShardingSphereTable.class)));
- }
- });
- return result;
+ private Optional<ShardingSphereTable> getTableMetaData(final String
databaseName, final String schemaName, final String tableName) {
+ String tableContent =
repository.query(TableMetaDataNode.getTableVersionNode(databaseName,
schemaName, tableName,
+
repository.query(TableMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, tableName))));
+ return Strings.isNullOrEmpty(tableContent) ? Optional.empty() :
Optional.of(new
YamlTableSwapper().swapToObject(YamlEngine.unmarshal(tableContent,
YamlShardingSphereTable.class)));
}
@Override
diff --git
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
new file mode 100644
index 00000000000..355cbb9064c
--- /dev/null
+++
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.metadata.persist.service.schema;
+
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import
org.apache.shardingsphere.metadata.persist.node.metadata.TableMetaDataNode;
+import
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Collections;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class TableMetaDataPersistServiceTest {
+
+ private TableMetaDataPersistService persistService;
+
+ @Mock
+ private PersistRepository repository;
+
+ @Mock
+ private MetaDataVersionPersistService metaDataVersionPersistService;
+
+ @BeforeEach
+ void setUp() {
+ persistService = new TableMetaDataPersistService(repository,
metaDataVersionPersistService);
+ }
+
+ @Test
+ void assertPersist() {
+ persistService.persist("foo_db", "foo_schema",
Collections.singletonMap("foo_tbl", mock(ShardingSphereTable.class)));
+
verify(repository).persist("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/versions/0",
"{}" + System.lineSeparator());
+
verify(repository).persist("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version",
"0");
+ verify(metaDataVersionPersistService).switchActiveVersion(any());
+ }
+
+ @Test
+ void assertLoadWithEmptyTables() {
+ assertTrue(persistService.load("foo_db", "foo_schema").isEmpty());
+ }
+
+ @Test
+ void assertLoadWithTables() {
+
when(repository.getChildrenKeys("/metadata/foo_db/schemas/foo_schema/tables")).thenReturn(Collections.singletonList("foo_tbl"));
+
when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version")).thenReturn("0");
+
when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/versions/0")).thenReturn("{name:
foo_tbl}");
+ Map<String, ShardingSphereTable> actual =
persistService.load("foo_db", "foo_schema");
+ assertThat(actual.size(), is(1));
+ assertThat(actual.get("foo_tbl").getName(), is("foo_tbl"));
+ }
+
+ @Test
+ void assertLoadWithTable() {
+
when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version")).thenReturn("0");
+
when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/versions/0")).thenReturn("{name:
foo_tbl}");
+ Map<String, ShardingSphereTable> actual =
persistService.load("foo_db", "foo_schema", "foo_tbl");
+ assertThat(actual.size(), is(1));
+ assertThat(actual.get("foo_tbl").getName(), is("foo_tbl"));
+ }
+
+ @Test
+ void assertDelete() {
+ persistService.delete("foo_db", "foo_schema", "foo_tbl");
+ verify(repository).delete(TableMetaDataNode.getTableNode("foo_db",
"foo_schema", "foo_tbl"));
+ }
+}