From 1823fce5b95ed3c8e2c33796783ba2cb24684bb9 Mon Sep 17 00:00:00 2001 From: zhangliang Date: Sun, 5 Jan 2025 12:39:03 +0800 Subject: [PATCH] Refactor DatabaseMetaDataNode --- .../persist/node/DatabaseMetaDataNode.java | 42 +++++-------------- .../node/DatabaseMetaDataNodeTest.java | 36 +++++++++------- .../metadata/MetaDataChangedHandler.java | 4 +- .../type/DatabaseMetaDataChangedListener.java | 2 +- 4 files changed, 33 insertions(+), 51 deletions(-) diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNode.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNode.java index c35a9ef2aa49e..2c403d5ede546 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNode.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNode.java @@ -83,53 +83,31 @@ public static String getMetaDataTablesPath(final String databaseName, final Stri } /** - * Get database name. + * Find database name. * * @param path path - * @return database name + * @param containsChildPath whether contains child path + * @return found database name */ - public static Optional getDatabaseName(final String path) { - Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)$", Pattern.CASE_INSENSITIVE); + public static Optional findDatabaseName(final String path, final boolean containsChildPath) { + Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)" + (containsChildPath ? "?" : "$"), Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(path); return matcher.find() ? Optional.of(matcher.group(1)) : Optional.empty(); } /** - * Get database name by schema path. - * - * @param schemaPath database path - * @return database name - */ - public static Optional getDatabaseNameBySchemaNode(final String schemaPath) { - Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(schemaPath); - return matcher.find() ? Optional.of(matcher.group(1)) : Optional.empty(); - } - - /** - * Get schema name. + * Find schema name. * * @param path path - * @return schema name + * @param containsChildPath whether contains child path + * @return found schema name */ - public static Optional getSchemaName(final String path) { - Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)/schemas/([\\w\\-]+)$", Pattern.CASE_INSENSITIVE); + public static Optional findSchemaName(final String path, final boolean containsChildPath) { + Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)/schemas/([\\w\\-]+)" + (containsChildPath ? "?" : "$"), Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(path); return matcher.find() ? Optional.of(matcher.group(2)) : Optional.empty(); } - /** - * Get schema name by table path. - * - * @param tablePath table path - * @return schema name - */ - public static Optional getSchemaNameByTableNode(final String tablePath) { - Pattern pattern = Pattern.compile(getMetaDataNode() + "/([\\w\\-]+)/schemas/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(tablePath); - return matcher.find() ? Optional.of(matcher.group(2)) : Optional.empty(); - } - /** * Get version node by active version path. * diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNodeTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNodeTest.java index 6ae6e5134f5b6..579824a96aca7 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNodeTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/DatabaseMetaDataNodeTest.java @@ -49,51 +49,55 @@ void assertGetMetaDataTablesPath() { } @Test - void assertGetDatabaseName() { - Optional actual = DatabaseMetaDataNode.getDatabaseName("/metadata/foo_db"); + void assertFindDatabaseNameWithNotContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findDatabaseName("/metadata/foo_db", false); assertTrue(actual.isPresent()); assertThat(actual.get(), is("foo_db")); } @Test - void assertGetDatabaseNameIfNotFound() { - assertFalse(DatabaseMetaDataNode.getDatabaseName("/metadata").isPresent()); + void assertNotFindDatabaseNameWithNotContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findDatabaseName("/metadata/foo_db/schemas/foo_schema", false); + assertFalse(actual.isPresent()); } @Test - void assertGetDatabaseNameBySchemaNode() { - Optional actual = DatabaseMetaDataNode.getDatabaseNameBySchemaNode("/metadata/foo_db/schemas/foo_schema"); + void assertFindDatabaseNameWithContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findDatabaseName("/metadata/foo_db/schemas/foo_schema", true); assertTrue(actual.isPresent()); assertThat(actual.get(), is("foo_db")); } @Test - void assertGetDatabaseNameBySchemaNodeIfNotFound() { - assertFalse(DatabaseMetaDataNode.getDatabaseNameBySchemaNode("/xxx/foo_db").isPresent()); + void assertNotFindDatabaseNameWithContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findDatabaseName("/xxx/foo_db/schemas/foo_schema", true); + assertFalse(actual.isPresent()); } @Test - void assertGetSchemaName() { - Optional actual = DatabaseMetaDataNode.getSchemaName("/metadata/foo_db/schemas/foo_schema"); + void assertFindSchemaNameWithNotContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findSchemaName("/metadata/foo_db/schemas/foo_schema", false); assertTrue(actual.isPresent()); assertThat(actual.get(), is("foo_schema")); } @Test - void assertGetSchemaNameIfNotFound() { - assertFalse(DatabaseMetaDataNode.getSchemaName("/metadata/foo_db/xxx/foo_schema").isPresent()); + void assertNotFindSchemaNameWithNotContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findSchemaName("/metadata/foo_db/schemas/foo_schema/tables", false); + assertFalse(actual.isPresent()); } @Test - void assertGetSchemaNameByTableNode() { - Optional actual = DatabaseMetaDataNode.getSchemaNameByTableNode("/metadata/foo_db/schemas/foo_schema/tables"); + void assertFindSchemaNameWithContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findSchemaName("/metadata/foo_db/schemas/foo_schema/tables", true); assertTrue(actual.isPresent()); assertThat(actual.get(), is("foo_schema")); } @Test - void assertGetSchemaNameByTableNodeIfNotFound() { - assertFalse(DatabaseMetaDataNode.getSchemaNameByTableNode("/xxx/foo_db/schemas/foo_schema/tables").isPresent()); + void assertNotFindSchemaNameWithContainsChildPath() { + Optional actual = DatabaseMetaDataNode.findSchemaName("/xxx/foo_db/schemas/foo_schema/tables", true); + assertFalse(actual.isPresent()); } @Test diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/MetaDataChangedHandler.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/MetaDataChangedHandler.java index 014b6bad9f590..144c3cb7e9fc0 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/MetaDataChangedHandler.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/MetaDataChangedHandler.java @@ -59,12 +59,12 @@ public MetaDataChangedHandler(final ContextManager contextManager) { */ public boolean handle(final String databaseName, final DataChangedEvent event) { String eventKey = event.getKey(); - Optional schemaName = DatabaseMetaDataNode.getSchemaName(eventKey); + Optional schemaName = DatabaseMetaDataNode.findSchemaName(eventKey, false); if (schemaName.isPresent()) { handleSchemaChanged(databaseName, schemaName.get(), event); return true; } - schemaName = DatabaseMetaDataNode.getSchemaNameByTableNode(eventKey); + schemaName = DatabaseMetaDataNode.findSchemaName(eventKey, true); if (schemaName.isPresent() && isTableMetaDataChanged(eventKey)) { handleTableChanged(databaseName, schemaName.get(), event); return true; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/listener/type/DatabaseMetaDataChangedListener.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/listener/type/DatabaseMetaDataChangedListener.java index 3c26fbb4f60ef..fe964bdd1f3f9 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/listener/type/DatabaseMetaDataChangedListener.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/listener/type/DatabaseMetaDataChangedListener.java @@ -40,7 +40,7 @@ public final class DatabaseMetaDataChangedListener implements DataChangedEventLi @Override public void onChange(final DataChangedEvent event) { - Optional databaseName = DatabaseMetaDataNode.getDatabaseNameBySchemaNode(event.getKey()); + Optional databaseName = DatabaseMetaDataNode.findDatabaseName(event.getKey(), true); if (!databaseName.isPresent()) { return; }