You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/07/30 15:39:27 UTC
(shardingsphere) branch master updated: Move sequence metadata ownership back to MCP (#39282)
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 a372d850eff Move sequence metadata ownership back to MCP (#39282)
a372d850eff is described below
commit a372d850effe9ab2adf3829535c6a22f29e5bb9e
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jul 30 23:39:20 2026 +0800
Move sequence metadata ownership back to MCP (#39282)
* Move sequence metadata ownership back to MCP
- restore shared metadata and connector contracts to their pre-sequence state
- keep sequence discovery and request-scoped caching within MCP
- preserve MCP resource, search, and completion behavior
* Move sequence metadata ownership back to MCP
- restore shared metadata and connector contracts to their pre-sequence state
- keep sequence discovery and request-scoped caching within MCP
- preserve MCP resource, search, and completion behavior
---
.../data/loader/type/SequenceMetaDataLoader.java | 85 ----------------
.../database/metadata/DialectDatabaseMetaData.java | 10 --
.../core/metadata/identifier/IdentifierScope.java | 2 -
.../loader/type/SequenceMetaDataLoaderTest.java | 106 --------------------
.../database/FirebirdDatabaseMetaData.java | 7 --
.../database/FirebirdDatabaseMetaDataTest.java | 7 --
.../metadata/database/MariaDBDatabaseMetaData.java | 6 --
.../database/MariaDBDatabaseMetaDataTest.java | 7 --
.../database/OpenGaussDatabaseMetaData.java | 6 --
.../database/OpenGaussDatabaseMetaDataTest.java | 7 --
.../metadata/database/OracleDatabaseMetaData.java | 6 --
.../database/OracleDatabaseMetaDataTest.java | 7 --
.../database/PostgreSQLDatabaseMetaData.java | 7 --
.../database/PostgreSQLDatabaseMetaDataTest.java | 7 --
.../database/SQLServerDatabaseMetaData.java | 7 --
.../database/SQLServerDatabaseMetaDataTest.java | 7 --
.../schema/model/ShardingSphereSchema.java | 109 +--------------------
.../schema/model/ShardingSphereSchemaTest.java | 56 -----------
.../DatabaseIdentifierContextFactoryTest.java | 1 -
.../handler/MetadataCompletionHandler.java | 4 +-
.../metadata/MetadataResourcePayloadMapper.java | 24 +++--
.../handler/metadata/MetadataSearchCollector.java | 6 +-
.../handler/MetadataCompletionHandlerTest.java | 4 +-
.../mcp/core/resource/ResourceTestDataFactory.java | 9 +-
.../MetadataResourcePayloadMapperTest.java | 27 ++++-
.../database/capability/MCPDatabaseCapability.java | 8 +-
.../capability/MCPDatabaseCapabilityOption.java | 11 +++
.../database/capability/MCPDatabaseDialect.java | 10 +-
.../FirebirdMCPDatabaseCapabilityOption.java | 7 ++
.../MariaDBMCPDatabaseCapabilityOption.java | 7 ++
.../OpenGaussMCPDatabaseCapabilityOption.java | 7 ++
.../dialect/OracleMCPDatabaseCapabilityOption.java | 7 ++
.../PostgreSQLMCPDatabaseCapabilityOption.java | 7 ++
.../SQLServerMCPDatabaseCapabilityOption.java | 8 ++
.../context/RequestScopedMetadataContext.java | 29 ++++--
.../metadata/jdbc/MCPJdbcMetadataLoader.java | 66 ++++++++-----
.../metadata/model/MCPMetadataSnapshot.java | 27 ++++-
.../metadata/model/MCPSequenceMetadata.java | 14 +--
.../metadata/query/MetadataQueryService.java | 16 +--
.../database/spi/MCPMetadataQueryFacade.java | 6 +-
.../service/RuntimeDatabaseValidationService.java | 2 +-
.../MCPDatabaseCapabilityProviderTest.java | 15 +--
.../capability/MCPDatabaseDialectTest.java | 18 ++--
.../context/RequestScopedMetadataContextTest.java | 22 +++++
.../jdbc/AbstractMCPJdbcMetadataLoaderTest.java | 38 ++++---
.../jdbc/MCPJdbcMetadataLoaderSequenceTest.java | 24 +++--
.../metadata/jdbc/MCPJdbcMetadataLoaderTest.java | 2 +-
.../metadata/model/MCPMetadataSnapshotTest.java | 44 +++++++++
.../metadata/query/MetadataQueryServiceTest.java | 34 +++----
.../RuntimeDatabaseValidationServiceTest.java | 5 +-
50 files changed, 366 insertions(+), 592 deletions(-)
diff --git a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoader.java b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoader.java
deleted file mode 100644
index 076de8c4066..00000000000
--- a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoader.java
+++ /dev/null
@@ -1,85 +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.database.connector.core.metadata.data.loader.type;
-
-import com.google.common.base.Strings;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.system.SystemDatabase;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Sequence meta data loader.
- */
-@RequiredArgsConstructor
-public final class SequenceMetaDataLoader {
-
- private static final String SEQUENCE_SCHEMA = "SEQUENCE_SCHEMA";
-
- private static final String SEQUENCE_NAME = "SEQUENCE_NAME";
-
- private final DatabaseType databaseType;
-
- /**
- * Load sequence names by schema.
- *
- * @param connection connection
- * @return loaded sequence names by schema
- * @throws SQLException SQL exception
- */
- public Map<String, Collection<String>> load(final Connection connection) throws SQLException {
- Optional<DialectSequenceOption> option = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSequenceOption();
- return option.isPresent() ? loadSequences(connection, option.get().getSequenceMetadataQuerySQL()) : Collections.emptyMap();
- }
-
- private Map<String, Collection<String>> loadSequences(final Connection connection, final String sequenceMetadataQuery) throws SQLException {
- Map<String, Collection<String>> result = new LinkedHashMap<>(16, 1F);
- Collection<String> systemSchemas = new SystemDatabase(databaseType).getSystemSchemas();
- try (
- Statement statement = connection.createStatement();
- ResultSet sequences = statement.executeQuery(sequenceMetadataQuery)) {
- while (sequences.next()) {
- addSequence(result, sequences, systemSchemas);
- }
- }
- return result;
- }
-
- private void addSequence(final Map<String, Collection<String>> sequences, final ResultSet resultSet, final Collection<String> systemSchemas) throws SQLException {
- String sequenceName = resultSet.getString(SEQUENCE_NAME);
- if (Strings.isNullOrEmpty(sequenceName)) {
- return;
- }
- String schemaName = resultSet.getString(SEQUENCE_SCHEMA);
- if (Strings.isNullOrEmpty(schemaName) || systemSchemas.stream().noneMatch(schemaName::equalsIgnoreCase)) {
- sequences.computeIfAbsent(schemaName, unused -> new LinkedHashSet<>()).add(sequenceName);
- }
- }
-}
diff --git a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
index c9c170da25b..c2b7786ddaa 100644
--- a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
+++ b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
@@ -34,7 +34,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sql.DefaultSQLOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sql.DialectSQLOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sqlbatch.DialectSQLBatchOption;
@@ -166,15 +165,6 @@ public interface DialectDatabaseMetaData extends DatabaseTypedSPI {
return Optional.empty();
}
- /**
- * Get sequence option.
- *
- * @return sequence option
- */
- default Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.empty();
- }
-
/**
* Get alter table option.
*
diff --git a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/identifier/IdentifierScope.java b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/identifier/IdentifierScope.java
index ed8063782fa..61ebfae59b9 100644
--- a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/identifier/IdentifierScope.java
+++ b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/identifier/IdentifierScope.java
@@ -36,7 +36,5 @@ public enum IdentifierScope {
INDEX,
- SEQUENCE,
-
CONSTRAINT
}
diff --git a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoaderTest.java b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoaderTest.java
deleted file mode 100644
index 8d0e30ba0f4..00000000000
--- a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SequenceMetaDataLoaderTest.java
+++ /dev/null
@@ -1,106 +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.database.connector.core.metadata.data.loader.type;
-
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.system.DialectSystemDatabase;
-import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.junit.jupiter.api.Test;
-import org.mockito.MockedStatic;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.mockStatic;
-import static org.mockito.Mockito.verifyNoInteractions;
-import static org.mockito.Mockito.when;
-
-class SequenceMetaDataLoaderTest {
-
- private final DatabaseType databaseType = mock(DatabaseType.class);
-
- @Test
- void assertLoadWithoutSequenceOption() throws SQLException {
- DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(Optional.empty());
- Connection connection = mock(Connection.class);
- try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader = mockStatic(DatabaseTypedSPILoader.class)) {
- databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
- assertThat(new SequenceMetaDataLoader(databaseType).load(connection), is(Collections.emptyMap()));
- }
- verifyNoInteractions(connection);
- }
-
- @Test
- void assertLoad() throws SQLException {
- DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(Optional.of(new DialectSequenceOption("SELECT SEQUENCES")));
- DialectSystemDatabase dialectSystemDatabase = mock(DialectSystemDatabase.class);
- when(dialectSystemDatabase.getSystemSchemas()).thenReturn(Collections.singleton("pg_catalog"));
- Connection connection = mock(Connection.class);
- Statement statement = mock(Statement.class);
- ResultSet resultSet = mockResultSet(Arrays.asList(
- createRow("public", "order_seq"),
- createRow("PG_CATALOG", "system_seq"),
- createRow("public", ""),
- createRow("", "global_seq")));
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeQuery("SELECT SEQUENCES")).thenReturn(resultSet);
- try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader = mockStatic(DatabaseTypedSPILoader.class)) {
- databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
- databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectSystemDatabase.class, databaseType)).thenReturn(Optional.of(dialectSystemDatabase));
- Map<String, Collection<String>> actual = new SequenceMetaDataLoader(databaseType).load(connection);
- Map<String, Collection<String>> expected = new LinkedHashMap<>(2, 1F);
- expected.put("public", new LinkedHashSet<>(Collections.singleton("order_seq")));
- expected.put("", new LinkedHashSet<>(Collections.singleton("global_seq")));
- assertThat(actual, is(expected));
- }
- }
-
- private Map<String, String> createRow(final String sequenceSchema, final String sequenceName) {
- Map<String, String> result = new LinkedHashMap<>(2, 1F);
- result.put("SEQUENCE_SCHEMA", sequenceSchema);
- result.put("SEQUENCE_NAME", sequenceName);
- return result;
- }
-
- private ResultSet mockResultSet(final List<Map<String, String>> rows) throws SQLException {
- ResultSet result = mock(ResultSet.class);
- AtomicInteger rowIndex = new AtomicInteger(-1);
- when(result.next()).thenAnswer(invocation -> rowIndex.incrementAndGet() < rows.size());
- when(result.getString("SEQUENCE_SCHEMA")).thenAnswer(invocation -> rows.get(rowIndex.get()).get("SEQUENCE_SCHEMA"));
- when(result.getString("SEQUENCE_NAME")).thenAnswer(invocation -> rows.get(rowIndex.get()).get("SEQUENCE_NAME"));
- return result;
- }
-}
diff --git a/database/connector/dialect/firebird/src/main/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaData.java b/database/connector/dialect/firebird/src/main/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaData.java
index f206a5fc963..099d05672b0 100644
--- a/database/connector/dialect/firebird/src/main/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaData.java
+++ b/database/connector/dialect/firebird/src/main/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaData.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.function.DialectFunctionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.version.DialectProtocolVersionOption;
@@ -31,7 +30,6 @@ import org.apache.shardingsphere.database.connector.firebird.metadata.database.o
import org.apache.shardingsphere.database.connector.firebird.metadata.database.option.FirebirdSchemaOption;
import java.util.Collections;
-import java.util.Optional;
/**
* Database metadata of Firebird.
@@ -74,11 +72,6 @@ public final class FirebirdDatabaseMetaData implements DialectDatabaseMetaData {
return new FirebirdFunctionOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption("SELECT '' AS SEQUENCE_SCHEMA, TRIM(RDB$GENERATOR_NAME) AS SEQUENCE_NAME FROM RDB$GENERATORS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0"));
- }
-
@Override
public String getDatabaseType() {
return "Firebird";
diff --git a/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaDataTest.java b/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaDataTest.java
index e0a7040ea4b..2d646837aed 100644
--- a/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaDataTest.java
+++ b/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/database/FirebirdDatabaseMetaDataTest.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -82,12 +81,6 @@ class FirebirdDatabaseMetaDataTest {
assertTrue(actual.getXaDriverClassNames().contains("org.firebirdsql.ds.FBXADataSource"));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(dialectDatabaseMetaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT '' AS SEQUENCE_SCHEMA, TRIM(RDB$GENERATOR_NAME) AS SEQUENCE_NAME FROM RDB$GENERATORS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0"));
- }
-
@Test
void assertGetProtocolVersionOption() {
assertThat(dialectDatabaseMetaData.getProtocolVersionOption().getDefaultVersion(), is("18"));
diff --git a/database/connector/dialect/mariadb/src/main/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaData.java b/database/connector/dialect/mariadb/src/main/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaData.java
index 163e384bdc1..94b66b761f2 100644
--- a/database/connector/dialect/mariadb/src/main/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaData.java
+++ b/database/connector/dialect/mariadb/src/main/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaData.java
@@ -27,7 +27,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.join.DialectJoinOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.keygen.DialectGeneratedKeyOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.version.DialectProtocolVersionOption;
@@ -94,11 +93,6 @@ public final class MariaDBDatabaseMetaData implements DialectDatabaseMetaData {
return delegate.getGeneratedKeyOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption("SELECT TABLE_SCHEMA AS SEQUENCE_SCHEMA, TABLE_NAME AS SEQUENCE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'SEQUENCE'"));
- }
-
@Override
public DialectProtocolVersionOption getProtocolVersionOption() {
return delegate.getProtocolVersionOption();
diff --git a/database/connector/dialect/mariadb/src/test/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaDataTest.java b/database/connector/dialect/mariadb/src/test/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaDataTest.java
index ba50da38565..53cfabc2226 100644
--- a/database/connector/dialect/mariadb/src/test/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaDataTest.java
+++ b/database/connector/dialect/mariadb/src/test/java/org/apache/shardingsphere/database/connector/mariadb/metadata/database/MariaDBDatabaseMetaDataTest.java
@@ -26,7 +26,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.keygen.DialectGeneratedKeyOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -115,12 +114,6 @@ class MariaDBDatabaseMetaDataTest {
assertThat(actual.map(DialectGeneratedKeyOption::getColumnName).orElse(""), is("GENERATED_KEY"));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(metaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT TABLE_SCHEMA AS SEQUENCE_SCHEMA, TABLE_NAME AS SEQUENCE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'SEQUENCE'"));
- }
-
@Test
void assertGetProtocolVersionOption() {
assertThat(metaData.getProtocolVersionOption().getDefaultVersion(), is("5.7.22"));
diff --git a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
index 87c18171c1f..948a55d99fa 100644
--- a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
+++ b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.function.DialectFunctionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sql.DialectSQLOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.table.DialectDriverQuerySystemCatalogOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
@@ -87,11 +86,6 @@ public final class OpenGaussDatabaseMetaData implements DialectDatabaseMetaData
return new PostgreSQLFunctionOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences"));
- }
-
@Override
public DialectTransactionOption getTransactionOption() {
return new DialectTransactionOption(true, DDLCommitPolicy.NO_ADDITIONAL_COMMIT, false, true, false, true, true,
diff --git a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
index 96ffefb3f1a..623bbf7c1fe 100644
--- a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
+++ b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
@@ -24,7 +24,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.table.DialectDriverQuerySystemCatalogOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
@@ -101,12 +100,6 @@ class OpenGaussDatabaseMetaDataTest {
assertThat(actual.getIndexNameMaxLength(), is(63));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(dialectDatabaseMetaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences"));
- }
-
@Test
void assertGetTransactionOption() {
DialectTransactionOption actual = dialectDatabaseMetaData.getTransactionOption();
diff --git a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
index 40a63bd913d..166b77bff1a 100644
--- a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
+++ b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
@@ -29,7 +29,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.oracle.metadata.database.option.OracleDataTypeOption;
@@ -102,11 +101,6 @@ public final class OracleDatabaseMetaData implements DialectDatabaseMetaData {
return new OracleFunctionOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption("SELECT USER AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM USER_SEQUENCES"));
- }
-
@Override
public String getDatabaseType() {
return "Oracle";
diff --git a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
index 4965013baa0..1d9e99c21cd 100644
--- a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
+++ b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
@@ -26,7 +26,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
@@ -85,12 +84,6 @@ class OracleDatabaseMetaDataTest {
assertThat(actual.getIndexNameMaxLength(), is(30));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(dialectDatabaseMetaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT USER AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM USER_SEQUENCES"));
- }
-
@Test
void assertGetConnectionOption() {
DialectConnectionOption actualConnectionOption = dialectDatabaseMetaData.getConnectionOption();
diff --git a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
index a68438ade4d..f103aa474e2 100644
--- a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
+++ b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.function.DialectFunctionOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sql.DialectSQLOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
@@ -36,7 +35,6 @@ import org.apache.shardingsphere.database.connector.postgresql.metadata.database
import org.apache.shardingsphere.database.connector.postgresql.metadata.database.option.PostgreSQLSchemaOption;
import java.util.Collections;
-import java.util.Optional;
/**
* Database meta data of PostgreSQL.
@@ -80,11 +78,6 @@ public final class PostgreSQLDatabaseMetaData implements DialectDatabaseMetaData
return new PostgreSQLFunctionOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences"));
- }
-
@Override
public DialectTransactionOption getTransactionOption() {
return new DialectTransactionOption(false, DDLCommitPolicy.NO_ADDITIONAL_COMMIT, false, true, false, true, true,
diff --git a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
index 95b7f3a459f..305ca5c6a5a 100644
--- a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
+++ b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -86,12 +85,6 @@ class PostgreSQLDatabaseMetaDataTest {
assertThat(actual.getIndexNameMaxLength(), is(63));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(dialectDatabaseMetaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences"));
- }
-
@Test
void assertGetTransactionOption() {
DialectTransactionOption actual = dialectDatabaseMetaData.getTransactionOption();
diff --git a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaData.java b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
index bb749ebdcd0..4ec5f9d6087 100644
--- a/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
+++ b/database/connector/dialect/sqlserver/src/main/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
@@ -28,7 +28,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.sql92.sqlserver.metadata.database.option.SQLServerFunctionOption;
@@ -77,12 +76,6 @@ public final class SQLServerDatabaseMetaData implements DialectDatabaseMetaData
return new SQLServerFunctionOption();
}
- @Override
- public Optional<DialectSequenceOption> getSequenceOption() {
- return Optional.of(new DialectSequenceOption(
- "SELECT schemas.name AS SEQUENCE_SCHEMA, seq.name AS SEQUENCE_NAME FROM sys.sequences seq INNER JOIN sys.schemas schemas ON seq.schema_id = schemas.schema_id"));
- }
-
@Override
public Optional<DialectAlterTableOption> getAlterTableOption() {
return Optional.of(new DialectAlterTableOption(false, false, false, new DialectAddColumnOption("")));
diff --git a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaDataTest.java b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaDataTest.java
index 9494a7bdb88..9d630791733 100644
--- a/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaDataTest.java
+++ b/database/connector/dialect/sqlserver/src/test/java/org/apache/shardingsphere/database/connector/sql92/sqlserver/metadata/database/SQLServerDatabaseMetaDataTest.java
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.metad
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DDLCommitPolicy;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -86,12 +85,6 @@ class SQLServerDatabaseMetaDataTest {
assertTrue(actual.getXaDriverClassNames().contains("com.microsoft.sqlserver.jdbc.SQLServerXADataSource"));
}
- @Test
- void assertGetSequenceOption() {
- assertThat(dialectDatabaseMetaData.getSequenceOption().map(DialectSequenceOption::getSequenceMetadataQuerySQL).orElse(""),
- is("SELECT schemas.name AS SEQUENCE_SCHEMA, seq.name AS SEQUENCE_NAME FROM sys.sequences seq INNER JOIN sys.schemas schemas ON seq.schema_id = schemas.schema_id"));
- }
-
@Test
void assertGetPaginationOption() {
DialectPaginationOption actual = dialectDatabaseMetaData.getPaginationOption();
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
index 734f2de7e9a..d104a004516 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
@@ -54,8 +54,6 @@ public final class ShardingSphereSchema {
private IdentifierIndex<ShardingSphereView> viewIndex;
- private IdentifierIndex<ShardingSphereSequence> sequenceIndex;
-
/**
* Construct schema with the temporary default identifier context.
*
@@ -71,10 +69,8 @@ public final class ShardingSphereSchema {
tableIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.TABLE);
logicalTableIndex = null;
viewIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.VIEW);
- sequenceIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.SEQUENCE);
tableIndex.rebuild(Collections.emptyMap());
viewIndex.rebuild(Collections.emptyMap());
- sequenceIndex.rebuild(Collections.emptyMap());
}
/**
@@ -88,29 +84,12 @@ public final class ShardingSphereSchema {
* @param views views
*/
public ShardingSphereSchema(final String name, final DatabaseType protocolType, final Collection<ShardingSphereTable> tables, final Collection<ShardingSphereView> views) {
- this(name, protocolType, tables, views, Collections.emptyList());
- }
-
- /**
- * Construct schema with tables, views and sequences by using the temporary default identifier context.
- *
- * <p>TODO(haoran): Replace this fallback with explicit identifier context injection after all schema creation paths migrate.</p>
- *
- * @param name schema name
- * @param protocolType protocol type
- * @param tables tables
- * @param views views
- * @param sequences sequences
- */
- public ShardingSphereSchema(final String name, final DatabaseType protocolType, final Collection<ShardingSphereTable> tables,
- final Collection<ShardingSphereView> views, final Collection<ShardingSphereSequence> sequences) {
this(name, protocolType);
Map<String, ShardingSphereTable> tableMap = createTableMap(tables);
Map<String, ShardingSphereView> viewMap = createViewMap(views);
tableMap.values().forEach(this::refreshTableIdentifierContext);
tableIndex.rebuild(tableMap);
viewIndex.rebuild(viewMap);
- sequenceIndex.rebuild(createSequenceMap(sequences));
}
/**
@@ -297,84 +276,6 @@ public final class ShardingSphereSchema {
viewIndex.remove(view.getName());
}
- /**
- * Get all sequences.
- *
- * @return all sequences
- */
- public Collection<ShardingSphereSequence> getAllSequences() {
- return sequenceIndex.getAll();
- }
-
- /**
- * Judge whether contains sequence.
- *
- * @param sequenceName sequence name
- * @return contains sequence or not
- */
- public boolean containsSequence(final String sequenceName) {
- return containsSequence(new IdentifierValue(sequenceName, QuoteCharacter.NONE));
- }
-
- /**
- * Judge whether contains sequence.
- *
- * @param sequenceName sequence name
- * @return contains sequence or not
- */
- private boolean containsSequence(final IdentifierValue sequenceName) {
- return findSequence(sequenceName).isPresent();
- }
-
- /**
- * Get sequence.
- *
- * @param sequenceName sequence name
- * @return sequence
- */
- public ShardingSphereSequence getSequence(final String sequenceName) {
- return getSequence(new IdentifierValue(sequenceName, QuoteCharacter.NONE));
- }
-
- /**
- * Get sequence.
- *
- * @param sequenceName sequence name
- * @return sequence
- */
- private ShardingSphereSequence getSequence(final IdentifierValue sequenceName) {
- return findSequence(sequenceName).orElse(null);
- }
-
- private Optional<ShardingSphereSequence> findSequence(final IdentifierValue sequenceName) {
- return sequenceIndex.find(sequenceName);
- }
-
- /**
- * Add sequence.
- *
- * @param sequence sequence
- */
- public void putSequence(final ShardingSphereSequence sequence) {
- sequenceIndex.put(sequence.getName(), sequence);
- }
-
- /**
- * Remove sequence.
- *
- * @param sequenceName sequence name
- */
- public void removeSequence(final String sequenceName) {
- if (null != sequenceIndex.remove(sequenceName)) {
- return;
- }
- ShardingSphereSequence sequence = getSequence(sequenceName);
- if (null == sequence) {
- return;
- }
- sequenceIndex.remove(sequence.getName());
- }
-
/**
* Refresh shared database identifier context.
*
@@ -394,9 +295,6 @@ public final class ShardingSphereSchema {
Collection<ShardingSphereView> views = new LinkedList<>(viewIndex.getAll());
viewIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.VIEW);
viewIndex.rebuild(createViewMap(views));
- Collection<ShardingSphereSequence> sequences = new LinkedList<>(sequenceIndex.getAll());
- sequenceIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.SEQUENCE);
- sequenceIndex.rebuild(createSequenceMap(sequences));
}
/**
@@ -456,7 +354,7 @@ public final class ShardingSphereSchema {
* @return empty schema or not
*/
public boolean isEmpty() {
- return tableIndex.isEmpty() && viewIndex.isEmpty() && sequenceIndex.isEmpty();
+ return tableIndex.isEmpty() && viewIndex.isEmpty();
}
private void refreshTableIdentifierContext(final ShardingSphereTable table) {
@@ -473,11 +371,6 @@ public final class ShardingSphereSchema {
() -> new LinkedHashMap<>(views.size(), 1F)));
}
- private Map<String, ShardingSphereSequence> createSequenceMap(final Collection<ShardingSphereSequence> sequences) {
- return sequences.stream().collect(Collectors.toMap(ShardingSphereSequence::getName, each -> each, (oldValue, currentValue) -> currentValue,
- () -> new LinkedHashMap<>(sequences.size(), 1F)));
- }
-
private IdentifierIndex<ShardingSphereTable> createLogicalTableIndex(final DatabaseIdentifierContext context) {
if (!context.isHeterogeneousTableLookupEnabled()) {
return null;
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
index bc6ccd2b1a8..db912016107 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
@@ -113,40 +113,6 @@ class ShardingSphereSchemaTest {
assertFalse(schema.containsView("foo_view"));
}
- @Test
- void assertGetAllSequences() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- assertThat(new HashSet<>(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence))
- .getAllSequences()), is(Collections.singleton(sequence)));
- }
-
- @Test
- void assertContainsSequence() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- assertTrue(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence)).containsSequence("foo_seq"));
- }
-
- @Test
- void assertGetSequence() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- assertThat(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence)).getSequence("foo_seq"), is(sequence));
- }
-
- @Test
- void assertPutSequence() {
- ShardingSphereSchema schema = new ShardingSphereSchema("foo_db", postgreSQLDatabaseType);
- schema.putSequence(new ShardingSphereSequence("foo_seq"));
- assertTrue(schema.containsSequence("foo_seq"));
- }
-
- @Test
- void assertRemoveSequence() {
- ShardingSphereSchema schema = new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(),
- Collections.singleton(new ShardingSphereSequence("foo_seq")));
- schema.removeSequence("foo_seq");
- assertFalse(schema.containsSequence("foo_seq"));
- }
-
@Test
void assertContainsIndex() {
ShardingSphereTable table = new ShardingSphereTable(
@@ -213,12 +179,6 @@ class ShardingSphereSchemaTest {
assertFalse(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.singleton(view)).isEmpty());
}
- @Test
- void assertIsEmptyWithEmptySequence() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- assertFalse(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence)).isEmpty());
- }
-
@Test
void assertIsEmpty() {
assertTrue(new ShardingSphereSchema("foo_db", postgreSQLDatabaseType).isEmpty());
@@ -272,22 +232,6 @@ class ShardingSphereSchemaTest {
assertThat(schema.getView("FOO_VIEW"), is(view));
}
- @Test
- void assertContainsUpperCaseSequence() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence));
- schema.refreshIdentifierContext(new DatabaseIdentifierContext(IdentifierCasePolicyFactory.newLowerCasePolicySet()));
- assertTrue(schema.containsSequence("FOO_SEQ"));
- }
-
- @Test
- void assertGetUpperCaseSequence() {
- ShardingSphereSequence sequence = new ShardingSphereSequence("foo_seq");
- ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema", postgreSQLDatabaseType, Collections.emptyList(), Collections.emptyList(), Collections.singleton(sequence));
- schema.refreshIdentifierContext(new DatabaseIdentifierContext(IdentifierCasePolicyFactory.newLowerCasePolicySet()));
- assertThat(schema.getSequence("FOO_SEQ"), is(sequence));
- }
-
@Test
void assertAttachIdentifierContext() {
ShardingSphereTable table = new ShardingSphereTable("Foo_Tbl", Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
index 5634bd0cb79..8d2bc7ba3b5 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
@@ -571,7 +571,6 @@ class DatabaseIdentifierContextFactoryTest {
Arguments.of("view", IdentifierScope.VIEW, LookupMode.EXACT, false),
Arguments.of("column", IdentifierScope.COLUMN, LookupMode.NORMALIZED, true),
Arguments.of("index", IdentifierScope.INDEX, LookupMode.NORMALIZED, true),
- Arguments.of("sequence", IdentifierScope.SEQUENCE, LookupMode.EXACT, false),
Arguments.of("constraint", IdentifierScope.CONSTRAINT, LookupMode.NORMALIZED, true));
}
diff --git a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandler.java b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandler.java
index 7cbb7cccd54..e25ecf1387b 100644
--- a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandler.java
+++ b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandler.java
@@ -21,7 +21,6 @@ import org.apache.shardingsphere.mcp.api.exception.MCPUnsupportedException;
import org.apache.shardingsphere.mcp.core.metadata.GovernanceMetadataQueryService;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.api.capability.completion.MCPCompletionCandidate;
import org.apache.shardingsphere.mcp.api.capability.completion.MCPCompletionHandler;
@@ -30,6 +29,7 @@ import org.apache.shardingsphere.mcp.api.capability.completion.MCPCompletionRequ
import org.apache.shardingsphere.mcp.support.MCPFeatureRequestContext;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureQueryFacade;
import org.apache.shardingsphere.mcp.support.resource.MCPUriPathSegmentUtils;
@@ -178,7 +178,7 @@ public final class MetadataCompletionHandler implements MCPCompletionHandler<MCP
return List.of();
}
try {
- return handlerContext.getMetadataQueryFacade().querySequences(database, schema).stream().map(ShardingSphereSequence::getName)
+ return handlerContext.getMetadataQueryFacade().querySequences(database, schema).stream().map(MCPSequenceMetadata::getSequence)
.map(each -> new MCPCompletionCandidate(each, "sequence", "metadata")).toList();
} catch (final MCPUnsupportedException ignored) {
return List.of();
diff --git a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
index a5b876cba28..0b80d52ab5e 100644
--- a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
+++ b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
@@ -21,11 +21,12 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.api.capability.resource.MCPResourceURIVariables;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
+import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
import org.apache.shardingsphere.mcp.support.descriptor.ShardingSphereMCPResourceMetadata;
@@ -74,8 +75,8 @@ public final class MetadataResourcePayloadMapper {
if (item instanceof ShardingSphereIndex) {
return createIndexPayload((ShardingSphereIndex) item);
}
- if (item instanceof ShardingSphereSequence) {
- return createSequencePayload((ShardingSphereSequence) item);
+ if (item instanceof MCPSequenceMetadata) {
+ return createSequencePayload((MCPSequenceMetadata) item);
}
return item;
}
@@ -104,8 +105,9 @@ public final class MetadataResourcePayloadMapper {
.map(each -> createViewPayload(database, schema.getName(), each, false)).toList()
: List.of());
result.put("sequences", detail
- ? schema.getAllSequences().stream().sorted(Comparator.comparing(ShardingSphereSequence::getName)).map(each -> createSequencePayload(database, schema.getName(), each)).toList()
- : List.of());
+ && metadataQueryFacade.isSupportedMetadataObjectType(database, SupportedMCPMetadataObjectType.SEQUENCE)
+ ? metadataQueryFacade.querySequences(database, schema.getName()).stream().map(this::createSequencePayload).toList()
+ : List.of());
return result;
}
@@ -169,15 +171,11 @@ public final class MetadataResourcePayloadMapper {
return result;
}
- private Map<String, Object> createSequencePayload(final ShardingSphereSequence sequence) {
- return createSequencePayload(getDatabase(), getSchema(), sequence);
- }
-
- private Map<String, Object> createSequencePayload(final String database, final String schema, final ShardingSphereSequence sequence) {
+ private Map<String, Object> createSequencePayload(final MCPSequenceMetadata sequence) {
Map<String, Object> result = new LinkedHashMap<>(3, 1F);
- result.put("database", database);
- result.put("schema", schema);
- result.put("sequence", sequence.getName());
+ result.put("database", sequence.getDatabase());
+ result.put("schema", sequence.getSchema());
+ result.put("sequence", sequence.getSequence());
return result;
}
diff --git a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/MetadataSearchCollector.java b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/MetadataSearchCollector.java
index 6d0d3fba660..be60a4201c1 100644
--- a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/MetadataSearchCollector.java
+++ b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/MetadataSearchCollector.java
@@ -22,7 +22,6 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.core.metadata.GovernanceMetadataQueryService;
import org.apache.shardingsphere.mcp.core.tool.request.MetadataSearchRequest;
@@ -30,6 +29,7 @@ import org.apache.shardingsphere.mcp.core.tool.payload.MetadataSearchHit;
import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureQueryFacade;
import org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
@@ -189,8 +189,8 @@ final class MetadataSearchCollector {
return createSearchHit(database, schema.getName(), SupportedMCPMetadataObjectType.SCHEMA, "", "", schema.getName());
}
- private MetadataSearchHit createSearchHit(final String database, final String schema, final ShardingSphereSequence sequence) {
- return createSearchHit(database, schema, SupportedMCPMetadataObjectType.SEQUENCE, "", "", sequence.getName());
+ private MetadataSearchHit createSearchHit(final String database, final String schema, final MCPSequenceMetadata sequence) {
+ return createSearchHit(database, schema, SupportedMCPMetadataObjectType.SEQUENCE, "", "", sequence.getSequence());
}
private MetadataSearchHit createSearchHit(final String database, final String schema, final SupportedMCPMetadataObjectType objectType,
diff --git a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandlerTest.java b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandlerTest.java
index 382999e1e4e..3a5b2cdd175 100644
--- a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandlerTest.java
+++ b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/handler/MetadataCompletionHandlerTest.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.enums
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.api.capability.completion.MCPCompletionCandidate;
import org.apache.shardingsphere.mcp.api.capability.completion.MCPCompletionHandlerResult;
@@ -33,6 +32,7 @@ import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatab
import org.apache.shardingsphere.mcp.support.database.metadata.TransactionCapability;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata.Nullability;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureCapabilityFacade;
import org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureQueryFacade;
import org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
@@ -182,7 +182,7 @@ class MetadataCompletionHandlerTest {
@Test
void assertCompleteSequence() {
MCPMetadataQueryFacade metadataQueryFacade = mock(MCPMetadataQueryFacade.class);
- when(metadataQueryFacade.querySequences("logic_db", "public")).thenReturn(List.of(new ShardingSphereSequence("order_seq")));
+ when(metadataQueryFacade.querySequences("logic_db", "public")).thenReturn(List.of(new MCPSequenceMetadata("logic_db", "public", "order_seq")));
MCPCompletionHandlerResult actual = new MetadataCompletionHandler().complete(createHandlerContext(metadataQueryFacade),
createRequestContext("sequence", Map.of("database", "logic_db", "schema", "public")));
assertCandidate(actual, "order_seq");
diff --git a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/ResourceTestDataFactory.java b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/ResourceTestDataFactory.java
index 0782f00b51c..c53a305358a 100644
--- a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/ResourceTestDataFactory.java
+++ b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/ResourceTestDataFactory.java
@@ -23,7 +23,6 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.system.DialectSystemDatabase;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -35,6 +34,7 @@ import org.apache.shardingsphere.mcp.core.context.MCPFeatureRuntimeRequestContex
import org.apache.shardingsphere.mcp.core.context.MCPRuntimeContext;
import org.apache.shardingsphere.mcp.core.session.MCPSessionManager;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import org.mockito.MockedStatic;
@@ -230,10 +230,13 @@ public final class ResourceTestDataFactory {
when(databaseTypeFromSPI.getTrunkDatabaseType()).thenReturn(Optional.empty());
typedSPILoader.when(() -> TypedSPILoader.findService(DatabaseType.class, databaseType)).thenReturn(Optional.of(databaseTypeFromSPI));
typedSPILoader.when(() -> TypedSPILoader.getService(DatabaseType.class, databaseType)).thenReturn(databaseTypeFromSPI);
+ MCPDatabaseCapabilityOption capabilityOption = mock(MCPDatabaseCapabilityOption.class);
+ when(capabilityOption.getType()).thenReturn(databaseType);
+ when(capabilityOption.getSequenceQuery()).thenReturn(
+ sequenceSupported ? Optional.of("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM TEST_SEQUENCES") : Optional.empty());
+ typedSPILoader.when(() -> TypedSPILoader.findService(MCPDatabaseCapabilityOption.class, databaseType)).thenReturn(Optional.of(capabilityOption));
DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new DefaultSchemaOption(true, null, DialectSchemaSemantics.NATIVE_SCHEMA));
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(
- sequenceSupported ? Optional.of(new DialectSequenceOption("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM TEST_SEQUENCES")) : Optional.empty());
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, databaseTypeFromSPI)).thenReturn(Optional.of(dialectDatabaseMetaData));
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseTypeFromSPI)).thenReturn(dialectDatabaseMetaData);
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectSystemDatabase.class, databaseTypeFromSPI)).thenReturn(Optional.empty());
diff --git a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapperTest.java b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapperTest.java
index e82f9671252..0a173c1f766 100644
--- a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapperTest.java
+++ b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapperTest.java
@@ -25,12 +25,13 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.enums
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.api.capability.resource.MCPResourceURIVariables;
+import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata.Nullability;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
import org.apache.shardingsphere.mcp.support.descriptor.ShardingSphereMCPResourceMetadata;
import org.junit.jupiter.api.Test;
@@ -43,6 +44,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class MetadataResourcePayloadMapperTest {
@@ -51,6 +54,8 @@ class MetadataResourcePayloadMapperTest {
void assertMapDatabaseDetail() {
MCPMetadataQueryFacade metadataQueryFacade = mock(MCPMetadataQueryFacade.class);
when(metadataQueryFacade.querySchemas("logic_db")).thenReturn(List.of(createSchemaMetadata()));
+ when(metadataQueryFacade.isSupportedMetadataObjectType("logic_db", SupportedMCPMetadataObjectType.SEQUENCE)).thenReturn(true);
+ when(metadataQueryFacade.querySequences("logic_db", "public")).thenReturn(List.of(new MCPSequenceMetadata("logic_db", "public", "order_seq")));
List<?> actual = new MetadataResourcePayloadMapper(metadataQueryFacade, new MCPResourceURIVariables(Map.of()), true)
.map(createMetadata("logical-database"), List.of(
new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0", TransactionCapability.LOCAL_WITH_SAVEPOINT,
@@ -65,6 +70,24 @@ class MetadataResourcePayloadMapperTest {
assertThat(getNames(actualSchema, "sequences", "sequence"), is(List.of("order_seq")));
}
+ @Test
+ void assertMapSchemaDetailWithoutSequenceSupport() {
+ MCPResourceURIVariables uriVariables = new MCPResourceURIVariables(Map.of("database", "logic_db"));
+ MCPMetadataQueryFacade metadataQueryFacade = mock(MCPMetadataQueryFacade.class);
+ List<?> actual = new MetadataResourcePayloadMapper(metadataQueryFacade, uriVariables, true)
+ .map(createMetadata("schema"), List.of(createSchemaMetadata()));
+ assertThat(((Map<?, ?>) actual.getFirst()).get("sequences"), is(List.of()));
+ verify(metadataQueryFacade, never()).querySequences("logic_db", "public");
+ }
+
+ @Test
+ void assertMapSequence() {
+ MCPSequenceMetadata sequence = new MCPSequenceMetadata("logic_db", "public", "order_seq");
+ List<?> actual = new MetadataResourcePayloadMapper(mock(MCPMetadataQueryFacade.class), new MCPResourceURIVariables(Map.of()), false)
+ .map(createMetadata("sequence"), List.of(sequence));
+ assertThat(actual, is(List.of(Map.of("database", "logic_db", "schema", "public", "sequence", "order_seq"))));
+ }
+
@Test
void assertMapTableDetail() {
MCPResourceURIVariables uriVariables = new MCPResourceURIVariables(Map.of("database", "logic_db", "schema", "public"));
@@ -111,7 +134,7 @@ class MetadataResourcePayloadMapperTest {
return new ShardingSphereSchema("public", mock(DatabaseType.class), List.of(
createTable("orders", TableType.TABLE),
createTable("order_items", TableType.TABLE),
- createTable("active_orders", TableType.VIEW)), List.of(), List.of(new ShardingSphereSequence("order_seq")));
+ createTable("active_orders", TableType.VIEW)), List.of());
}
private ShardingSphereTable createTable(final String name, final TableType tableType) {
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
index 775aa498e42..b681f30d496 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
@@ -51,10 +51,10 @@ public final class MCPDatabaseCapability {
MCPDatabaseCapability(final RuntimeDatabaseProfile databaseProfile, final MCPDatabaseCapabilityOption option) {
databaseName = databaseProfile.getDatabase();
databaseType = option.getType();
- MCPDatabaseDialect databaseDialect = MCPDatabaseDialect.of(option.getType());
- supportedMetadataObjectTypes = createSupportedMetadataObjectTypes(databaseDialect);
+ supportedMetadataObjectTypes = createSupportedMetadataObjectTypes(option);
transactionCapability = databaseProfile.getTransactionCapability();
supportedStatementClasses = createSupportedStatementClasses(transactionCapability, option.isExplainSupported());
+ MCPDatabaseDialect databaseDialect = MCPDatabaseDialect.of(option.getType());
defaultSchemaSemantics = databaseDialect.getDefaultSchemaSemantics();
schemaExecutionSemantics = createSchemaExecutionSemantics(defaultSchemaSemantics);
identifierContext = databaseProfile.getIdentifierContext();
@@ -64,14 +64,14 @@ public final class MCPDatabaseCapability {
return DialectSchemaSemantics.DATABASE_AS_SCHEMA == defaultSchemaSemantics ? SchemaExecutionSemantics.FIXED_TO_DATABASE : SchemaExecutionSemantics.BEST_EFFORT;
}
- private Set<SupportedMCPMetadataObjectType> createSupportedMetadataObjectTypes(final MCPDatabaseDialect databaseDialect) {
+ private Set<SupportedMCPMetadataObjectType> createSupportedMetadataObjectTypes(final MCPDatabaseCapabilityOption option) {
Set<SupportedMCPMetadataObjectType> result = new LinkedHashSet<>(16, 1F);
result.add(SupportedMCPMetadataObjectType.SCHEMA);
result.add(SupportedMCPMetadataObjectType.TABLE);
result.add(SupportedMCPMetadataObjectType.VIEW);
result.add(SupportedMCPMetadataObjectType.COLUMN);
result.add(SupportedMCPMetadataObjectType.INDEX);
- if (databaseDialect.isSequenceSupported()) {
+ if (option.getSequenceQuery().isPresent()) {
result.add(SupportedMCPMetadataObjectType.SEQUENCE);
}
return result;
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityOption.java
index a6788b9af1d..46ae3cce114 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityOption.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.mcp.support.database.capability;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
+import java.util.Optional;
+
/**
* MCP database capability option.
*/
@@ -33,6 +35,15 @@ public interface MCPDatabaseCapabilityOption extends TypedSPI {
*/
boolean isExplainSupported();
+ /**
+ * Get sequence metadata query.
+ *
+ * @return sequence metadata query
+ */
+ default Optional<String> getSequenceQuery() {
+ return Optional.empty();
+ }
+
@Override
String getType();
}
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialect.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialect.java
index e9e924ae1b2..6cd8aa5a8ad 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialect.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialect.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundExce
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import java.util.Collection;
+import java.util.Optional;
/**
* MCP database dialect capabilities.
@@ -39,6 +40,8 @@ public final class MCPDatabaseDialect {
private final SystemDatabase systemDatabase;
+ private final Optional<MCPDatabaseCapabilityOption> capabilityOption;
+
/**
* Create MCP database dialect capabilities.
*
@@ -51,7 +54,8 @@ public final class MCPDatabaseDialect {
.orElseThrow(() -> new ServiceProviderNotFoundException(DatabaseType.class, actualDatabaseType));
DialectDatabaseMetaData dialectDatabaseMetaData = DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, databaseTypeFromSPI)
.orElseThrow(() -> new ServiceProviderNotFoundException(DialectDatabaseMetaData.class, actualDatabaseType));
- return new MCPDatabaseDialect(dialectDatabaseMetaData, new SystemDatabase(databaseTypeFromSPI));
+ return new MCPDatabaseDialect(dialectDatabaseMetaData, new SystemDatabase(databaseTypeFromSPI),
+ TypedSPILoader.findService(MCPDatabaseCapabilityOption.class, actualDatabaseType));
}
/**
@@ -68,8 +72,8 @@ public final class MCPDatabaseDialect {
*
* @return sequence metadata query
*/
- public boolean isSequenceSupported() {
- return dialectDatabaseMetaData.getSequenceOption().isPresent();
+ public Optional<String> getSequenceQuery() {
+ return capabilityOption.flatMap(MCPDatabaseCapabilityOption::getSequenceQuery);
}
/**
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/FirebirdMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/FirebirdMCPDatabaseCapabilityOption.java
index d16030391ef..79ba19f34ee 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/FirebirdMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/FirebirdMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for Firebird.
*/
@@ -29,6 +31,11 @@ public final class FirebirdMCPDatabaseCapabilityOption implements MCPDatabaseCap
return false;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of("SELECT '' AS SEQUENCE_SCHEMA, TRIM(RDB$GENERATOR_NAME) AS SEQUENCE_NAME FROM RDB$GENERATORS WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0");
+ }
+
@Override
public String getType() {
return "Firebird";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/MariaDBMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/MariaDBMCPDatabaseCapabilityOption.java
index 031bf25af48..2d34b6cfe86 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/MariaDBMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/MariaDBMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for MariaDB.
*/
@@ -29,6 +31,11 @@ public final class MariaDBMCPDatabaseCapabilityOption implements MCPDatabaseCapa
return true;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of("SELECT TABLE_SCHEMA AS SEQUENCE_SCHEMA, TABLE_NAME AS SEQUENCE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'SEQUENCE'");
+ }
+
@Override
public String getType() {
return "MariaDB";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OpenGaussMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OpenGaussMCPDatabaseCapabilityOption.java
index 9bd5bef07d8..e250c99a67b 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OpenGaussMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OpenGaussMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for openGauss.
*/
@@ -29,6 +31,11 @@ public final class OpenGaussMCPDatabaseCapabilityOption implements MCPDatabaseCa
return true;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences");
+ }
+
@Override
public String getType() {
return "openGauss";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OracleMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OracleMCPDatabaseCapabilityOption.java
index 96affc869f6..04a8d1eebba 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OracleMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/OracleMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for Oracle.
*/
@@ -29,6 +31,11 @@ public final class OracleMCPDatabaseCapabilityOption implements MCPDatabaseCapab
return false;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of("SELECT USER AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM USER_SEQUENCES");
+ }
+
@Override
public String getType() {
return "Oracle";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/PostgreSQLMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/PostgreSQLMCPDatabaseCapabilityOption.java
index 41cee057bce..3bdd0f01d89 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/PostgreSQLMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/PostgreSQLMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for PostgreSQL.
*/
@@ -29,6 +31,11 @@ public final class PostgreSQLMCPDatabaseCapabilityOption implements MCPDatabaseC
return true;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of("SELECT sequence_schema AS SEQUENCE_SCHEMA, sequence_name AS SEQUENCE_NAME FROM information_schema.sequences");
+ }
+
@Override
public String getType() {
return "PostgreSQL";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/SQLServerMCPDatabaseCapabilityOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/SQLServerMCPDatabaseCapabilityOption.java
index 18914674073..455d83f8905 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/SQLServerMCPDatabaseCapabilityOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/dialect/SQLServerMCPDatabaseCapabilityOption.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mcp.support.database.capability.dialect;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import java.util.Optional;
+
/**
* MCP database capability option for SQLServer.
*/
@@ -29,6 +31,12 @@ public final class SQLServerMCPDatabaseCapabilityOption implements MCPDatabaseCa
return false;
}
+ @Override
+ public Optional<String> getSequenceQuery() {
+ return Optional.of(
+ "SELECT schemas.name AS SEQUENCE_SCHEMA, seq.name AS SEQUENCE_NAME FROM sys.sequences seq INNER JOIN sys.schemas schemas ON seq.schema_id = schemas.schema_id");
+ }
+
@Override
public String getType() {
return "SQLServer";
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContext.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContext.java
index 18e75d955ac..160059ba289 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContext.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContext.java
@@ -25,6 +25,8 @@ import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.MCPJdbcMetad
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -44,7 +46,7 @@ public final class RequestScopedMetadataContext {
private final MCPJdbcMetadataLoader metadataLoader = new MCPJdbcMetadataLoader();
- private final Map<String, Collection<ShardingSphereSchema>> loadedSchemas = new LinkedHashMap<>(4, 1F);
+ private final Map<String, MCPMetadataSnapshot> loadedMetadata = new LinkedHashMap<>(4, 1F);
private final Map<RelationKey, List<MCPColumnMetadata>> loadedColumns = new LinkedHashMap<>(16, 1F);
@@ -59,17 +61,32 @@ public final class RequestScopedMetadataContext {
* @return schema metadata
*/
public Optional<Collection<ShardingSphereSchema>> loadSchemas(final String databaseName) {
- Collection<ShardingSphereSchema> loadedMetadata = loadedSchemas.get(databaseName);
- if (null != loadedMetadata) {
- return Optional.of(loadedMetadata);
+ return loadMetadata(databaseName).map(MCPMetadataSnapshot::getSchemas);
+ }
+
+ /**
+ * Load sequence metadata lazily within the current request.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @return sequence metadata
+ */
+ public Optional<Collection<MCPSequenceMetadata>> loadSequences(final String databaseName, final String schemaName) {
+ return loadMetadata(databaseName).map(each -> each.getSequences(schemaName));
+ }
+
+ private Optional<MCPMetadataSnapshot> loadMetadata(final String databaseName) {
+ MCPMetadataSnapshot loadedSnapshot = loadedMetadata.get(databaseName);
+ if (null != loadedSnapshot) {
+ return Optional.of(loadedSnapshot);
}
RuntimeDatabaseConfiguration runtimeDatabaseConfig = runtimeDatabases.get(databaseName);
Optional<RuntimeDatabaseProfile> databaseProfile = databaseCapabilityProvider.findDatabaseProfile(databaseName);
if (null == runtimeDatabaseConfig || databaseProfile.isEmpty()) {
return Optional.empty();
}
- Collection<ShardingSphereSchema> result = metadataLoader.load(databaseName, runtimeDatabaseConfig, databaseProfile.get());
- loadedSchemas.put(databaseName, result);
+ MCPMetadataSnapshot result = metadataLoader.load(databaseName, runtimeDatabaseConfig, databaseProfile.get());
+ loadedMetadata.put(databaseName, result);
return Optional.of(result);
}
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoader.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoader.java
index f72edd424d4..11d224fc9a0 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoader.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoader.java
@@ -19,24 +19,25 @@ package org.apache.shardingsphere.mcp.support.database.metadata.jdbc;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.database.connector.core.metadata.data.loader.type.SequenceMetaDataLoader;
import org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseDialect;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata.Nullability;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Statement;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -46,6 +47,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Optional;
/**
* MCP JDBC metadata loader.
@@ -53,17 +55,17 @@ import java.util.Objects;
public final class MCPJdbcMetadataLoader {
/**
- * Load schema metadata.
+ * Load database metadata.
*
* @param databaseName database name
* @param runtimeDatabaseConfig runtime database configuration
* @param databaseProfile runtime database profile
- * @return schema metadata
+ * @return database metadata snapshot
* @throws RuntimeDatabaseConnectionException when metadata loading fails
*/
- public Collection<ShardingSphereSchema> load(final String databaseName, final RuntimeDatabaseConfiguration runtimeDatabaseConfig, final RuntimeDatabaseProfile databaseProfile) {
+ public MCPMetadataSnapshot load(final String databaseName, final RuntimeDatabaseConfiguration runtimeDatabaseConfig, final RuntimeDatabaseProfile databaseProfile) {
try (Connection connection = runtimeDatabaseConfig.openConnection(databaseName)) {
- return loadSchemas(databaseName, databaseProfile, connection, connection.getMetaData());
+ return loadMetadata(databaseName, databaseProfile, connection, connection.getMetaData());
} catch (final SQLException ex) {
throw RuntimeDatabaseConnectionException.connectionFailed(databaseName, databaseProfile.getDatabaseType(), ex);
}
@@ -129,15 +131,15 @@ public final class MCPJdbcMetadataLoader {
}
}
- private Collection<ShardingSphereSchema> loadSchemas(final String databaseName, final RuntimeDatabaseProfile databaseProfile,
- final Connection connection, final DatabaseMetaData databaseMetaData) throws SQLException {
+ private MCPMetadataSnapshot loadMetadata(final String databaseName, final RuntimeDatabaseProfile databaseProfile,
+ final Connection connection, final DatabaseMetaData databaseMetaData) throws SQLException {
DatabaseType protocolType = TypedSPILoader.getService(DatabaseType.class, databaseProfile.getDatabaseType());
MCPDatabaseDialect databaseDialect = MCPDatabaseDialect.of(databaseProfile.getDatabaseType());
DialectSchemaSemantics defaultSchemaSemantics = databaseDialect.getDefaultSchemaSemantics();
- DatabaseMetadataAccumulator accumulator = new DatabaseMetadataAccumulator(protocolType);
+ DatabaseMetadataAccumulator accumulator = new DatabaseMetadataAccumulator(databaseName, protocolType);
loadTables(databaseName, defaultSchemaSemantics, databaseDialect, accumulator, databaseMetaData);
loadViews(databaseName, defaultSchemaSemantics, databaseDialect, accumulator, databaseMetaData);
- loadSequences(databaseName, defaultSchemaSemantics, protocolType, accumulator, connection);
+ loadSequences(databaseName, defaultSchemaSemantics, databaseDialect, accumulator, connection);
return accumulator.build();
}
@@ -177,12 +179,22 @@ public final class MCPJdbcMetadataLoader {
}
}
- private void loadSequences(final String databaseName, final DialectSchemaSemantics defaultSchemaSemantics, final DatabaseType protocolType,
+ private void loadSequences(final String databaseName, final DialectSchemaSemantics defaultSchemaSemantics, final MCPDatabaseDialect databaseDialect,
final DatabaseMetadataAccumulator accumulator, final Connection connection) throws SQLException {
- for (Entry<String, Collection<String>> entry : new SequenceMetaDataLoader(protocolType).load(connection).entrySet()) {
- SchemaMetadataAccumulator schema = accumulator.getSchemaAccumulator(normalizeSchemaName(databaseName, defaultSchemaSemantics, entry.getKey()));
- for (String each : entry.getValue()) {
- schema.addSequence(each);
+ Optional<String> sequenceQuery = databaseDialect.getSequenceQuery();
+ if (sequenceQuery.isEmpty()) {
+ return;
+ }
+ try (Statement statement = connection.createStatement(); ResultSet sequences = statement.executeQuery(sequenceQuery.get())) {
+ while (sequences.next()) {
+ String schemaName = Objects.toString(sequences.getString("SEQUENCE_SCHEMA"), "").trim();
+ if (databaseDialect.isSystemSchema(schemaName)) {
+ continue;
+ }
+ String sequenceName = Objects.toString(sequences.getString("SEQUENCE_NAME"), "");
+ if (!sequenceName.isEmpty()) {
+ accumulator.getSchemaAccumulator(normalizeSchemaName(databaseName, defaultSchemaSemantics, schemaName)).addSequence(sequenceName);
+ }
}
}
}
@@ -273,6 +285,8 @@ public final class MCPJdbcMetadataLoader {
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
private static final class DatabaseMetadataAccumulator {
+ private final String database;
+
private final DatabaseType protocolType;
private final Map<String, SchemaMetadataAccumulator> schemaAccumulators = new LinkedHashMap<>(16, 1F);
@@ -280,42 +294,46 @@ public final class MCPJdbcMetadataLoader {
private SchemaMetadataAccumulator getSchemaAccumulator(final String schema) {
SchemaMetadataAccumulator result = schemaAccumulators.get(schema);
if (null == result) {
- result = new SchemaMetadataAccumulator(schema, protocolType);
+ result = new SchemaMetadataAccumulator(database, schema, protocolType);
schemaAccumulators.put(schema, result);
}
return result;
}
- private Collection<ShardingSphereSchema> build() {
- List<ShardingSphereSchema> result = new LinkedList<>();
+ private MCPMetadataSnapshot build() {
+ List<ShardingSphereSchema> schemas = new LinkedList<>();
+ Map<String, Collection<MCPSequenceMetadata>> sequences = new LinkedHashMap<>(schemaAccumulators.size(), 1F);
for (SchemaMetadataAccumulator each : schemaAccumulators.values()) {
- result.add(each.build());
+ schemas.add(each.buildSchema());
+ sequences.put(each.schema, new LinkedList<>(each.sequences.values()));
}
- return result;
+ return new MCPMetadataSnapshot(schemas, sequences);
}
}
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
private static final class SchemaMetadataAccumulator {
+ private final String database;
+
private final String schema;
private final DatabaseType protocolType;
private final Map<String, ShardingSphereTable> relations = new LinkedHashMap<>(16, 1F);
- private final Map<String, ShardingSphereSequence> sequences = new LinkedHashMap<>(16, 1F);
+ private final Map<String, MCPSequenceMetadata> sequences = new LinkedHashMap<>(16, 1F);
private void addRelation(final String name, final TableType type) {
relations.putIfAbsent(name, new ShardingSphereTable(name, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), type));
}
private void addSequence(final String sequence) {
- sequences.putIfAbsent(sequence, new ShardingSphereSequence(sequence));
+ sequences.putIfAbsent(sequence, new MCPSequenceMetadata(database, schema, sequence));
}
- private ShardingSphereSchema build() {
- return new ShardingSphereSchema(schema, protocolType, relations.values(), Collections.emptyList(), sequences.values());
+ private ShardingSphereSchema buildSchema() {
+ return new ShardingSphereSchema(schema, protocolType, relations.values(), Collections.emptyList());
}
}
diff --git a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/sequence/DialectSequenceOption.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshot.java
similarity index 54%
rename from database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/sequence/DialectSequenceOption.java
rename to mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshot.java
index 1ccfff4c46a..a73c4437593 100644
--- a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/sequence/DialectSequenceOption.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshot.java
@@ -15,17 +15,34 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence;
+package org.apache.shardingsphere.mcp.support.database.metadata.model;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
/**
- * Dialect sequence option.
+ * MCP metadata snapshot.
*/
@RequiredArgsConstructor
-@Getter
-public final class DialectSequenceOption {
+public final class MCPMetadataSnapshot {
+
+ @Getter
+ private final Collection<ShardingSphereSchema> schemas;
+
+ private final Map<String, Collection<MCPSequenceMetadata>> sequences;
- private final String sequenceMetadataQuerySQL;
+ /**
+ * Get sequence metadata in a schema.
+ *
+ * @param schemaName schema name
+ * @return sequence metadata
+ */
+ public Collection<MCPSequenceMetadata> getSequences(final String schemaName) {
+ return sequences.getOrDefault(schemaName, Collections.emptyList());
+ }
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSequence.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPSequenceMetadata.java
similarity index 78%
rename from infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSequence.java
rename to mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPSequenceMetadata.java
index df32955cf3b..6580c5f5337 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSequence.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPSequenceMetadata.java
@@ -15,19 +15,21 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.metadata.database.schema.model;
+package org.apache.shardingsphere.mcp.support.database.metadata.model;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import lombok.ToString;
/**
- * ShardingSphere sequence.
+ * MCP sequence metadata.
*/
@RequiredArgsConstructor
@Getter
-@ToString
-public final class ShardingSphereSequence {
+public final class MCPSequenceMetadata {
- private final String name;
+ private final String database;
+
+ private final String schema;
+
+ private final String sequence;
}
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryService.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryService.java
index c600508444c..49e35391922 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryService.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryService.java
@@ -22,7 +22,6 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.enums
import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.api.exception.MCPUnsupportedException;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
@@ -31,6 +30,7 @@ import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMet
import org.apache.shardingsphere.mcp.support.database.metadata.context.RequestScopedMetadataContext;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
import java.util.Collection;
@@ -172,21 +172,21 @@ public final class MetadataQueryService implements MCPMetadataQueryFacade {
}
@Override
- public List<ShardingSphereSequence> querySequences(final String databaseName, final String schemaName) {
+ public List<MCPSequenceMetadata> querySequences(final String databaseName, final String schemaName) {
ShardingSpherePreconditions.checkState(isSupportedMetadataObjectType(databaseName, SupportedMCPMetadataObjectType.SEQUENCE),
() -> new MCPUnsupportedException("Sequence resources are not supported for the current database."));
- return findSchema(databaseName, schemaName).map(optional -> sortSequences(optional.getAllSequences())).orElse(Collections.emptyList());
+ return metadataContext.loadSequences(databaseName, schemaName).map(this::sortSequences).orElse(Collections.emptyList());
}
@Override
- public Optional<ShardingSphereSequence> querySequence(final String databaseName, final String schemaName, final String sequenceName) {
+ public Optional<MCPSequenceMetadata> querySequence(final String databaseName, final String schemaName, final String sequenceName) {
ShardingSpherePreconditions.checkState(isSupportedMetadataObjectType(databaseName, SupportedMCPMetadataObjectType.SEQUENCE),
() -> new MCPUnsupportedException("Sequence resources are not supported for the current database."));
return findSequence(querySequences(databaseName, schemaName), sequenceName);
}
- private List<ShardingSphereSequence> sortSequences(final Collection<ShardingSphereSequence> sequences) {
- return sequences.stream().sorted(Comparator.comparing(ShardingSphereSequence::getName)).toList();
+ private List<MCPSequenceMetadata> sortSequences(final Collection<MCPSequenceMetadata> sequences) {
+ return sequences.stream().sorted(Comparator.comparing(MCPSequenceMetadata::getSequence)).toList();
}
private Optional<ShardingSphereSchema> findSchema(final String databaseName, final String schemaName) {
@@ -205,8 +205,8 @@ public final class MetadataQueryService implements MCPMetadataQueryFacade {
return indexes.stream().filter(each -> indexName.equals(each.getName())).findFirst();
}
- private Optional<ShardingSphereSequence> findSequence(final Collection<ShardingSphereSequence> sequences, final String sequenceName) {
- return sequences.stream().filter(each -> sequenceName.equals(each.getName())).findFirst();
+ private Optional<MCPSequenceMetadata> findSequence(final Collection<MCPSequenceMetadata> sequences, final String sequenceName) {
+ return sequences.stream().filter(each -> sequenceName.equals(each.getSequence())).findFirst();
}
@Override
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/spi/MCPMetadataQueryFacade.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/spi/MCPMetadataQueryFacade.java
index 2df0f14ed3c..c294ffcefbf 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/spi/MCPMetadataQueryFacade.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/spi/MCPMetadataQueryFacade.java
@@ -19,11 +19,11 @@ package org.apache.shardingsphere.mcp.support.database.spi;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import java.util.List;
import java.util.Optional;
@@ -182,7 +182,7 @@ public interface MCPMetadataQueryFacade {
* @param schemaName schema name
* @return sequence metadata list
*/
- List<ShardingSphereSequence> querySequences(String databaseName, String schemaName);
+ List<MCPSequenceMetadata> querySequences(String databaseName, String schemaName);
/**
* Query one sequence in a schema.
@@ -192,7 +192,7 @@ public interface MCPMetadataQueryFacade {
* @param sequenceName sequence name
* @return sequence metadata
*/
- Optional<ShardingSphereSequence> querySequence(String databaseName, String schemaName, String sequenceName);
+ Optional<MCPSequenceMetadata> querySequence(String databaseName, String schemaName, String sequenceName);
/**
* Check whether the database supports the specified metadata object type.
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationService.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationService.java
index 3d431d61472..aa88f7e3701 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationService.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationService.java
@@ -85,7 +85,7 @@ public final class RuntimeDatabaseValidationService {
}
Collection<ShardingSphereSchema> schemas;
try {
- schemas = metadataLoader.load(database, runtimeDatabaseConfig.get(), databaseProfile);
+ schemas = metadataLoader.load(database, runtimeDatabaseConfig.get(), databaseProfile).getSchemas();
checks.add(RuntimeDatabaseValidationCheckResult.passed("metadata_read", "Read metadata through the configured JDBC connection."));
} catch (final RuntimeDatabaseConnectionException ex) {
checks.add(RuntimeDatabaseValidationCheckResult.failed("metadata_read", ex.getCategory(), "Failed to read metadata through the configured JDBC connection."));
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityProviderTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityProviderTest.java
index 2b94e8dff3e..040373aa69e 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityProviderTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapabilityProviderTest.java
@@ -24,7 +24,6 @@ import org.apache.shardingsphere.mcp.support.database.metadata.TransactionCapabi
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicyFactory;
import org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
@@ -97,7 +96,7 @@ class MCPDatabaseCapabilityProviderTest {
@Test
void assertProvideWithoutCapabilityOption() {
- MCPDatabaseCapabilityProvider provider = createCapabilityProvider("FixtureDB", new CapabilityFixture(false, false, false, DialectSchemaSemantics.NATIVE_SCHEMA));
+ MCPDatabaseCapabilityProvider provider = createCapabilityProvider("FixtureDB", new CapabilityFixture(false, false, DialectSchemaSemantics.NATIVE_SCHEMA));
assertThat(provider.findDatabaseProfile("logic_db").orElseThrow().getDatabaseType(), is("FixtureDB"));
assertFalse(provider.provide("logic_db").isPresent());
}
@@ -109,7 +108,7 @@ class MCPDatabaseCapabilityProviderTest {
insensitivePolicySet.getPolicy(IdentifierScope.TABLE),
Map.of(IdentifierScope.TABLE, IdentifierCasePolicyFactory.newSensitivePolicySet().getPolicy(IdentifierScope.TABLE),
IdentifierScope.COLUMN, insensitivePolicySet.getPolicy(IdentifierScope.COLUMN)));
- CapabilityFixture capabilityFixture = new CapabilityFixture(true, true, false, DialectSchemaSemantics.DATABASE_AS_SCHEMA);
+ CapabilityFixture capabilityFixture = new CapabilityFixture(true, true, DialectSchemaSemantics.DATABASE_AS_SCHEMA);
MCPDatabaseCapabilityProvider provider = createCapabilityProvider(
Map.of("logic_db", createDatabaseProfile("logic_db", "MySQL", capabilityFixture, scopedPolicySet)), Map.of("MySQL", capabilityFixture));
DatabaseIdentifierContext actual = provider.provide("logic_db").orElseThrow().getIdentifierContext();
@@ -122,7 +121,7 @@ class MCPDatabaseCapabilityProviderTest {
void assertProvideWithCapabilityMatrix(final String name, final String databaseType, final boolean expectedTransactionControl,
final boolean expectedSavepoint, final boolean expectedSequenceSupport,
final SchemaExecutionSemantics expectedSchemaExecutionSemantics, final boolean expectedExplainSupport) {
- CapabilityFixture capabilityFixture = new CapabilityFixture(expectedTransactionControl, expectedSavepoint, expectedSequenceSupport,
+ CapabilityFixture capabilityFixture = new CapabilityFixture(expectedTransactionControl, expectedSavepoint,
SchemaExecutionSemantics.FIXED_TO_DATABASE == expectedSchemaExecutionSemantics ? DialectSchemaSemantics.DATABASE_AS_SCHEMA : DialectSchemaSemantics.NATIVE_SCHEMA);
Optional<MCPDatabaseCapability> actual = createCapabilityProvider(databaseType, capabilityFixture).provide("logic_db");
assertTrue(actual.isPresent());
@@ -137,8 +136,8 @@ class MCPDatabaseCapabilityProviderTest {
private MCPDatabaseCapabilityProvider createCapabilityProvider() {
Map<String, CapabilityFixture> capabilityFixtures = Map.of(
- "MySQL", new CapabilityFixture(true, true, false, DialectSchemaSemantics.DATABASE_AS_SCHEMA),
- "Hive", new CapabilityFixture(false, false, false, DialectSchemaSemantics.DATABASE_AS_SCHEMA));
+ "MySQL", new CapabilityFixture(true, true, DialectSchemaSemantics.DATABASE_AS_SCHEMA),
+ "Hive", new CapabilityFixture(false, false, DialectSchemaSemantics.DATABASE_AS_SCHEMA));
Map<String, RuntimeDatabaseProfile> databaseProfiles = new LinkedHashMap<>(2, 1F);
databaseProfiles.put("logic_db", createDatabaseProfile("logic_db", "MySQL", capabilityFixtures.get("MySQL"), IdentifierCasePolicyFactory.newSensitivePolicySet()));
databaseProfiles.put("warehouse", createDatabaseProfile("warehouse", "Hive", capabilityFixtures.get("Hive"), IdentifierCasePolicyFactory.newSensitivePolicySet()));
@@ -178,8 +177,6 @@ class MCPDatabaseCapabilityProviderTest {
DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(
new DefaultSchemaOption(false, null, capabilityFixture.schemaSemantics));
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(
- capabilityFixture.sequenceSupported ? Optional.of(new DialectSequenceOption("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM TEST_SEQUENCES")) : Optional.empty());
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, databaseTypeFromSPI)).thenReturn(Optional.of(dialectDatabaseMetaData));
}
@@ -212,8 +209,6 @@ class MCPDatabaseCapabilityProviderTest {
private final boolean savepointSupported;
- private final boolean sequenceSupported;
-
private final DialectSchemaSemantics schemaSemantics;
}
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialectTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialectTest.java
index 0ef35c57bff..4c2fd486a4a 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialectTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseDialectTest.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.mcp.support.database.capability;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.system.DialectSystemDatabase;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -77,26 +76,27 @@ class MCPDatabaseDialectTest {
}
@Test
- void assertIsSequenceSupported() {
+ void assertGetSequenceQuery() {
try (
MockedStatic<TypedSPILoader> typedSPILoader = mockStatic(TypedSPILoader.class);
MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader = mockStatic(DatabaseTypedSPILoader.class)) {
DatabaseType databaseType = mockDatabaseType("Fixture", typedSPILoader);
- DialectDatabaseMetaData dialectDatabaseMetaData = mockDialectDatabaseMetaData(databaseType, databaseTypedSPILoader);
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(Optional.of(new DialectSequenceOption("SELECT 1")));
- assertTrue(MCPDatabaseDialect.of("Fixture").isSequenceSupported());
+ mockDialectDatabaseMetaData(databaseType, databaseTypedSPILoader);
+ MCPDatabaseCapabilityOption capabilityOption = mock(MCPDatabaseCapabilityOption.class);
+ when(capabilityOption.getSequenceQuery()).thenReturn(Optional.of("SELECT 1"));
+ typedSPILoader.when(() -> TypedSPILoader.findService(MCPDatabaseCapabilityOption.class, "Fixture")).thenReturn(Optional.of(capabilityOption));
+ assertThat(MCPDatabaseDialect.of("Fixture").getSequenceQuery(), is(Optional.of("SELECT 1")));
}
}
@Test
- void assertIsSequenceSupportedAbsent() {
+ void assertGetSequenceQueryAbsent() {
try (
MockedStatic<TypedSPILoader> typedSPILoader = mockStatic(TypedSPILoader.class);
MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader = mockStatic(DatabaseTypedSPILoader.class)) {
DatabaseType databaseType = mockDatabaseType("Fixture", typedSPILoader);
- DialectDatabaseMetaData dialectDatabaseMetaData = mockDialectDatabaseMetaData(databaseType, databaseTypedSPILoader);
- when(dialectDatabaseMetaData.getSequenceOption()).thenReturn(Optional.empty());
- assertFalse(MCPDatabaseDialect.of("Fixture").isSequenceSupported());
+ mockDialectDatabaseMetaData(databaseType, databaseTypedSPILoader);
+ assertThat(MCPDatabaseDialect.of("Fixture").getSequenceQuery(), is(Optional.empty()));
}
}
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContextTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContextTest.java
index fcef3ab4a60..0a454d35f4f 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContextTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/context/RequestScopedMetadataContextTest.java
@@ -18,12 +18,16 @@
package org.apache.shardingsphere.mcp.support.database.metadata.context;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
+import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.MCPJdbcMetadataLoader;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata.Nullability;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;
@@ -43,6 +47,24 @@ import static org.mockito.Mockito.when;
class RequestScopedMetadataContextTest {
+ @Test
+ void assertLoadSchemasAndSequencesOncePerDatabase() {
+ RuntimeDatabaseConfiguration configuration = mock(RuntimeDatabaseConfiguration.class);
+ RuntimeDatabaseProfile profile = mock(RuntimeDatabaseProfile.class);
+ MCPDatabaseCapabilityProvider capabilityProvider = createCapabilityProvider(profile);
+ MCPMetadataSnapshot expected = new MCPMetadataSnapshot(
+ List.of(new ShardingSphereSchema("public", mock(DatabaseType.class))),
+ Map.of("public", List.of(new MCPSequenceMetadata("logic_db", "public", "order_seq"))));
+ try (
+ MockedConstruction<MCPJdbcMetadataLoader> mockedLoader = mockConstruction(MCPJdbcMetadataLoader.class,
+ (mock, context) -> when(mock.load("logic_db", configuration, profile)).thenReturn(expected))) {
+ RequestScopedMetadataContext context = new RequestScopedMetadataContext(Map.of("logic_db", configuration), capabilityProvider);
+ assertThat(context.loadSchemas("logic_db").orElseThrow().stream().map(ShardingSphereSchema::getName).toList(), is(List.of("public")));
+ assertThat(context.loadSequences("logic_db", "public").orElseThrow().stream().map(MCPSequenceMetadata::getSequence).toList(), is(List.of("order_seq")));
+ verify(mockedLoader.constructed().getFirst()).load("logic_db", configuration, profile);
+ }
+ }
+
@Test
void assertLoadColumnsOncePerRelation() {
RuntimeDatabaseConfiguration configuration = mock(RuntimeDatabaseConfiguration.class);
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/AbstractMCPJdbcMetadataLoaderTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/AbstractMCPJdbcMetadataLoaderTest.java
index 2436113987e..b9d48a6de0c 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/AbstractMCPJdbcMetadataLoaderTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/AbstractMCPJdbcMetadataLoaderTest.java
@@ -24,7 +24,6 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.system.DialectSystemDatabase;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.metadata.database.enums.TableType;
@@ -32,11 +31,13 @@ import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.fixture.SupportDatabaseTypeFactoryMocker;
import org.junit.jupiter.params.provider.Arguments;
import org.mockito.MockedStatic;
@@ -100,7 +101,7 @@ abstract class AbstractMCPJdbcMetadataLoaderTest {
MCPJdbcMetadataLoader metadataLoader = new MCPJdbcMetadataLoader();
Map<String, RuntimeDatabaseProfile> databaseProfiles = databaseProfileLoader.load(runtimeDatabases);
mockDatabaseTypedSPI(databaseProfiles.values(), sequenceSupportedDatabaseTypes, systemSchemas, schemaSemantics, typedSPILoader, databaseTypedSPILoader);
- Map<String, Collection<ShardingSphereSchema>> result = new LinkedHashMap<>(runtimeDatabases.size(), 1F);
+ Map<String, MCPMetadataSnapshot> result = new LinkedHashMap<>(runtimeDatabases.size(), 1F);
for (Entry<String, RuntimeDatabaseConfiguration> entry : runtimeDatabases.entrySet()) {
result.put(entry.getKey(), metadataLoader.load(entry.getKey(), entry.getValue(), databaseProfiles.get(entry.getKey())));
}
@@ -171,16 +172,18 @@ abstract class AbstractMCPJdbcMetadataLoaderTest {
when(databaseTypeFromSPI.getTrunkDatabaseType()).thenReturn(Optional.empty());
typedSPILoader.when(() -> TypedSPILoader.findService(DatabaseType.class, databaseType)).thenReturn(Optional.of(databaseTypeFromSPI));
typedSPILoader.when(() -> TypedSPILoader.getService(DatabaseType.class, databaseType)).thenReturn(databaseTypeFromSPI);
- mockDialectDatabaseMetaData(databaseTypeFromSPI, sequenceSupportedDatabaseTypes.contains(databaseType),
- schemaSemantics.getOrDefault(databaseType, DialectSchemaSemantics.NATIVE_SCHEMA), databaseTypedSPILoader);
+ MCPDatabaseCapabilityOption capabilityOption = mock(MCPDatabaseCapabilityOption.class);
+ when(capabilityOption.getSequenceQuery()).thenReturn(
+ sequenceSupportedDatabaseTypes.contains(databaseType) ? Optional.of(SEQUENCE_METADATA_QUERY) : Optional.empty());
+ typedSPILoader.when(() -> TypedSPILoader.findService(MCPDatabaseCapabilityOption.class, databaseType)).thenReturn(Optional.of(capabilityOption));
+ mockDialectDatabaseMetaData(databaseTypeFromSPI, schemaSemantics.getOrDefault(databaseType, DialectSchemaSemantics.NATIVE_SCHEMA), databaseTypedSPILoader);
mockDialectSystemDatabase(databaseTypeFromSPI, systemSchemas.getOrDefault(databaseType, List.of()), databaseTypedSPILoader);
}
- private void mockDialectDatabaseMetaData(final DatabaseType databaseType, final boolean sequenceSupported, final DialectSchemaSemantics schemaSemantics,
+ private void mockDialectDatabaseMetaData(final DatabaseType databaseType, final DialectSchemaSemantics schemaSemantics,
final MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader) {
DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
when(result.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null, schemaSemantics));
- when(result.getSequenceOption()).thenReturn(sequenceSupported ? Optional.of(new DialectSequenceOption(SEQUENCE_METADATA_QUERY)) : Optional.empty());
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, databaseType)).thenReturn(Optional.of(result));
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(result);
}
@@ -415,7 +418,6 @@ abstract class AbstractMCPJdbcMetadataLoaderTest {
private int countSchemaMetadata(final ShardingSphereSchema schemaMetadata, final SupportedMCPMetadataObjectType objectType, final String objectName) {
int result = SupportedMCPMetadataObjectType.SCHEMA == objectType && objectName.equals(schemaMetadata.getName()) ? 1 : 0;
result += countTableMetadata(schemaMetadata.getAllTables(), objectType, objectName);
- result += countSequenceMetadata(schemaMetadata.getAllSequences(), objectType, objectName);
return result;
}
@@ -432,16 +434,24 @@ abstract class AbstractMCPJdbcMetadataLoaderTest {
return result;
}
- private int countSequenceMetadata(final Collection<ShardingSphereSequence> sequences, final SupportedMCPMetadataObjectType objectType, final String objectName) {
+ private int countSequenceMetadata(final Collection<MCPSequenceMetadata> sequences, final SupportedMCPMetadataObjectType objectType, final String objectName) {
int result = 0;
- for (ShardingSphereSequence each : sequences) {
- if (SupportedMCPMetadataObjectType.SEQUENCE == objectType && objectName.equals(each.getName())) {
+ for (MCPSequenceMetadata each : sequences) {
+ if (SupportedMCPMetadataObjectType.SEQUENCE == objectType && objectName.equals(each.getSequence())) {
result++;
}
}
return result;
}
+ protected boolean containsMetadata(final MCPMetadataSnapshot snapshot, final SupportedMCPMetadataObjectType objectType, final String objectName) {
+ int sequenceCount = 0;
+ for (ShardingSphereSchema each : snapshot.getSchemas()) {
+ sequenceCount += countSequenceMetadata(snapshot.getSequences(each.getName()), objectType, objectName);
+ }
+ return 0 < countMetadata(snapshot.getSchemas(), objectType, objectName) + sequenceCount;
+ }
+
protected boolean containsMetadata(final Collection<ShardingSphereSchema> schemas, final SupportedMCPMetadataObjectType objectType, final String objectName) {
return 0 < countMetadata(schemas, objectType, objectName);
}
@@ -450,9 +460,13 @@ abstract class AbstractMCPJdbcMetadataLoaderTest {
@Getter(AccessLevel.PROTECTED)
protected static final class LoadedMetadataCatalog {
- private final Map<String, Collection<ShardingSphereSchema>> databaseMetadataMap;
+ private final Map<String, MCPMetadataSnapshot> databaseMetadataMap;
protected Optional<Collection<ShardingSphereSchema>> findMetadata(final String databaseName) {
+ return Optional.ofNullable(databaseMetadataMap.get(databaseName)).map(MCPMetadataSnapshot::getSchemas);
+ }
+
+ protected Optional<MCPMetadataSnapshot> findSnapshot(final String databaseName) {
return Optional.ofNullable(databaseMetadataMap.get(databaseName));
}
}
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderSequenceTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderSequenceTest.java
index 055790d92b1..d9c6b6b2ece 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderSequenceTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderSequenceTest.java
@@ -17,8 +17,9 @@
package org.apache.shardingsphere.mcp.support.database.metadata.jdbc;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -26,7 +27,6 @@ import org.junit.jupiter.params.provider.MethodSource;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
-import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -42,7 +42,7 @@ class MCPJdbcMetadataLoaderSequenceTest extends AbstractMCPJdbcMetadataLoaderTes
@MethodSource("loadWithoutSequenceQueryArguments")
void assertLoadWithoutSequenceQuery(final String name, final String databaseType) throws SQLException {
RuntimeDatabaseConfiguration runtimeDatabaseConfiguration = createMockRuntimeDatabaseConfiguration(createConnectionWithoutSchema(databaseType));
- Collection<ShardingSphereSchema> actual = load(Map.of("logic_db", runtimeDatabaseConfiguration)).findMetadata("logic_db").orElseThrow();
+ MCPMetadataSnapshot actual = load(Map.of("logic_db", runtimeDatabaseConfiguration)).findSnapshot("logic_db").orElseThrow();
assertTrue(containsMetadata(actual, SupportedMCPMetadataObjectType.TABLE, "orders"));
assertFalse(containsMetadata(actual, SupportedMCPMetadataObjectType.SEQUENCE, "order_seq"));
}
@@ -52,8 +52,8 @@ class MCPJdbcMetadataLoaderSequenceTest extends AbstractMCPJdbcMetadataLoaderTes
Connection connection = createConnectionWithMetadata("PostgreSQL", List.of(), List.of(), Map.of(), Map.of(),
List.of(Map.of("SEQUENCE_SCHEMA", "PG_CATALOG", "SEQUENCE_NAME", "order_seq")));
RuntimeDatabaseConfiguration runtimeDatabaseConfiguration = createMockRuntimeDatabaseConfiguration(connection);
- Collection<ShardingSphereSchema> actual = load(Map.of("logic_db", runtimeDatabaseConfiguration), List.of("PostgreSQL"),
- Map.of("PostgreSQL", List.of("pg_catalog"))).findMetadata("logic_db").orElseThrow();
+ MCPMetadataSnapshot actual = load(Map.of("logic_db", runtimeDatabaseConfiguration), List.of("PostgreSQL"),
+ Map.of("PostgreSQL", List.of("pg_catalog"))).findSnapshot("logic_db").orElseThrow();
assertFalse(containsMetadata(actual, SupportedMCPMetadataObjectType.SEQUENCE, "order_seq"));
}
@@ -62,10 +62,20 @@ class MCPJdbcMetadataLoaderSequenceTest extends AbstractMCPJdbcMetadataLoaderTes
Connection connection = createConnectionWithMetadata("PostgreSQL", List.of(), List.of(), Map.of(), Map.of(),
List.of(Map.of("SEQUENCE_SCHEMA", "public", "SEQUENCE_NAME", "")));
RuntimeDatabaseConfiguration runtimeDatabaseConfiguration = createMockRuntimeDatabaseConfiguration(connection);
- Collection<ShardingSphereSchema> actual = load(Map.of("logic_db", runtimeDatabaseConfiguration)).findMetadata("logic_db").orElseThrow();
+ MCPMetadataSnapshot actual = load(Map.of("logic_db", runtimeDatabaseConfiguration)).findSnapshot("logic_db").orElseThrow();
assertFalse(containsMetadata(actual, SupportedMCPMetadataObjectType.SEQUENCE, ""));
}
+ @Test
+ void assertLoadWithWhitespaceInSequenceName() throws SQLException {
+ Connection connection = createConnectionWithSequenceMetadata("PostgreSQL", "public", " order_seq ");
+ RuntimeDatabaseConfiguration runtimeDatabaseConfiguration = createMockRuntimeDatabaseConfiguration(connection);
+ MCPSequenceMetadata actual = load(Map.of("logic_db", runtimeDatabaseConfiguration)).findSnapshot("logic_db").orElseThrow()
+ .getSequences("public").iterator().next();
+ assertThat(actual.getSchema(), is("public"));
+ assertThat(actual.getSequence(), is(" order_seq "));
+ }
+
@Test
void assertLoadWithFailedSequenceMetadataQuery() throws SQLException {
Driver mockDriver = new MockDriver("jdbc:mock:failed-sequence-query", createConnectionWithFailedSequenceMetadataQuery());
@@ -85,7 +95,7 @@ class MCPJdbcMetadataLoaderSequenceTest extends AbstractMCPJdbcMetadataLoaderTes
Driver mockDriver = new MockDriver(jdbcUrl, createConnectionWithSequenceMetadata(databaseType, sequenceSchema, sequenceName));
try (MockDriverRegistration ignored = MockDriverRegistration.register(mockDriver)) {
LoadedMetadataCatalog actual = load(Map.of("logic_db", new RuntimeDatabaseConfiguration(jdbcUrl, "", "", MockDriver.class.getName())), List.of(databaseType));
- assertTrue(containsMetadata(actual.findMetadata("logic_db").orElseThrow(), SupportedMCPMetadataObjectType.SEQUENCE, sequenceName));
+ assertTrue(containsMetadata(actual.findSnapshot("logic_db").orElseThrow(), SupportedMCPMetadataObjectType.SEQUENCE, sequenceName));
}
}
}
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderTest.java
index 05f1fd40a82..22d8340f30c 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderTest.java
@@ -61,7 +61,7 @@ class MCPJdbcMetadataLoaderTest extends AbstractMCPJdbcMetadataLoaderTest {
@MethodSource("loadTypedMetadataArguments")
void assertLoadWithTypedMetadata(final String name, final SupportedMCPMetadataObjectType objectType, final String objectName) throws SQLException {
LoadedMetadataCatalog actual = load(Map.of("logic_db", createMockRuntimeDatabaseConfiguration(createStandardPostgreSQLMetadataConnection())));
- assertTrue(containsMetadata(actual.findMetadata("logic_db").orElseThrow(), objectType, objectName));
+ assertTrue(containsMetadata(actual.findSnapshot("logic_db").orElseThrow(), objectType, objectName));
}
@Test
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshotTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshotTest.java
new file mode 100644
index 00000000000..f330e2c92a5
--- /dev/null
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPMetadataSnapshotTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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.mcp.support.database.metadata.model;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.is;
+
+class MCPMetadataSnapshotTest {
+
+ @Test
+ void assertGetSequences() {
+ MCPSequenceMetadata expected = new MCPSequenceMetadata("logic_db", "public", "order_seq");
+ MCPMetadataSnapshot snapshot = new MCPMetadataSnapshot(Collections.emptyList(), Map.of("public", List.of(expected)));
+ assertThat(snapshot.getSequences("public"), is(List.of(expected)));
+ }
+
+ @Test
+ void assertGetSequencesWithoutSchema() {
+ MCPMetadataSnapshot snapshot = new MCPMetadataSnapshot(Collections.emptyList(), Collections.emptyMap());
+ assertThat(snapshot.getSequences("public"), is(empty()));
+ }
+}
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryServiceTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryServiceTest.java
index 438a4c8b71e..17681f5f2a7 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryServiceTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/MetadataQueryServiceTest.java
@@ -21,23 +21,23 @@ import org.apache.shardingsphere.database.connector.core.metadata.database.enums
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaSemantics;
-import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.sequence.DialectSequenceOption;
import org.apache.shardingsphere.database.connector.core.metadata.database.system.DialectSystemDatabase;
import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSequence;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mcp.api.exception.MCPUnsupportedException;
import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
import org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import org.apache.shardingsphere.mcp.support.database.metadata.context.RequestScopedMetadataContext;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPColumnMetadata;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPSequenceMetadata;
import org.apache.shardingsphere.mcp.support.fixture.SupportDatabaseTypeFactoryMocker;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -65,30 +65,25 @@ import static org.mockito.Mockito.when;
class MetadataQueryServiceTest {
- private Map<String, RuntimeDatabaseConfiguration> runtimeDatabases;
-
private MockedStatic<DatabaseTypeFactory> databaseTypeFactory;
private MockedStatic<TypedSPILoader> typedSPILoader;
private MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader;
- private RequestScopedMetadataContext metadataContext;
-
private MetadataQueryService metadataQueryService;
@BeforeEach
void setUp() {
- runtimeDatabases = DatabaseTestDataFactory.createRuntimeDatabases();
databaseTypeFactory = SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata();
typedSPILoader = mockStatic(TypedSPILoader.class, CALLS_REAL_METHODS);
databaseTypedSPILoader = mockStatic(DatabaseTypedSPILoader.class);
mockDatabaseType("MySQL", false);
mockDatabaseType("PostgreSQL", true);
mockDatabaseType("Hive", false);
+ Map<String, RuntimeDatabaseConfiguration> runtimeDatabases = DatabaseTestDataFactory.createRuntimeDatabases();
MCPDatabaseCapabilityProvider databaseCapabilityProvider = new MCPDatabaseCapabilityProvider(runtimeDatabases);
- metadataContext = new RequestScopedMetadataContext(runtimeDatabases, databaseCapabilityProvider);
- metadataQueryService = new MetadataQueryService(databaseCapabilityProvider, metadataContext);
+ metadataQueryService = new MetadataQueryService(databaseCapabilityProvider, new RequestScopedMetadataContext(runtimeDatabases, databaseCapabilityProvider));
}
@AfterEach
@@ -104,15 +99,18 @@ class MetadataQueryServiceTest {
when(databaseTypeFromSPI.getTrunkDatabaseType()).thenReturn(Optional.empty());
typedSPILoader.when(() -> TypedSPILoader.findService(DatabaseType.class, databaseType)).thenReturn(Optional.of(databaseTypeFromSPI));
typedSPILoader.when(() -> TypedSPILoader.getService(DatabaseType.class, databaseType)).thenReturn(databaseTypeFromSPI);
- mockDialectDatabaseMetaData(databaseTypeFromSPI, sequenceSupported);
+ MCPDatabaseCapabilityOption capabilityOption = mock(MCPDatabaseCapabilityOption.class);
+ when(capabilityOption.getType()).thenReturn(databaseType);
+ when(capabilityOption.getSequenceQuery()).thenReturn(
+ sequenceSupported ? Optional.of("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM TEST_SEQUENCES") : Optional.empty());
+ typedSPILoader.when(() -> TypedSPILoader.findService(MCPDatabaseCapabilityOption.class, databaseType)).thenReturn(Optional.of(capabilityOption));
+ mockDialectDatabaseMetaData(databaseTypeFromSPI);
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectSystemDatabase.class, databaseTypeFromSPI)).thenReturn(Optional.empty());
}
- private void mockDialectDatabaseMetaData(final DatabaseType databaseType, final boolean sequenceSupported) {
+ private void mockDialectDatabaseMetaData(final DatabaseType databaseType) {
DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
when(result.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null, DialectSchemaSemantics.NATIVE_SCHEMA));
- when(result.getSequenceOption()).thenReturn(
- sequenceSupported ? Optional.of(new DialectSequenceOption("SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM TEST_SEQUENCES")) : Optional.empty());
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, databaseType)).thenReturn(Optional.of(result));
databaseTypedSPILoader.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(result);
}
@@ -321,9 +319,11 @@ class MetadataQueryServiceTest {
@Test
void assertQuerySequences() {
- List<ShardingSphereSequence> actual = metadataQueryService.querySequences("runtime_db", "public");
+ List<MCPSequenceMetadata> actual = metadataQueryService.querySequences("runtime_db", "public");
assertThat(actual.size(), is(1));
- assertThat(actual.get(0).getName(), is("order_seq"));
+ assertThat(actual.get(0).getDatabase(), is("runtime_db"));
+ assertThat(actual.get(0).getSchema(), is("public"));
+ assertThat(actual.get(0).getSequence(), is("order_seq"));
}
@Test
@@ -334,9 +334,9 @@ class MetadataQueryServiceTest {
@Test
void assertQuerySequence() {
- Optional<ShardingSphereSequence> actual = metadataQueryService.querySequence("runtime_db", "public", "order_seq");
+ Optional<MCPSequenceMetadata> actual = metadataQueryService.querySequence("runtime_db", "public", "order_seq");
assertTrue(actual.isPresent());
- assertThat(actual.get().getName(), is("order_seq"));
+ assertThat(actual.get().getSequence(), is("order_seq"));
}
@Test
diff --git a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
index 2ddcdc31d64..ffde13d2f6b 100644
--- a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
+++ b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.database.connector.core.metadata.identifier.Ide
import org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.mcp.support.database.metadata.model.MCPMetadataSnapshot;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.MCPJdbcDatabaseProfileLoader;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.MCPJdbcMetadataLoader;
import org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
@@ -253,8 +254,8 @@ class RuntimeDatabaseValidationServiceTest {
return new RuntimeDatabaseConfiguration("jdbc:test:profile", "demo", "", "com.mysql.cj.jdbc.Driver");
}
- private static List<ShardingSphereSchema> createMetadata(final String schemaName) {
- return List.of(new ShardingSphereSchema(schemaName, mock(DatabaseType.class)));
+ private static MCPMetadataSnapshot createMetadata(final String schemaName) {
+ return new MCPMetadataSnapshot(List.of(new ShardingSphereSchema(schemaName, mock(DatabaseType.class))), Map.of());
}
private static final class InvisibleDatabaseDriver implements Driver {