This is an automated email from the ASF dual-hosted git repository. tuichenchuxin 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 0d1d4f283c1 support save unique key in metadata for sqlserver (#28075) 0d1d4f283c1 is described below commit 0d1d4f283c1b1442f7e5bfccbd363856d0c5adfa Author: Guocheng Tang <tot...@apache.org> AuthorDate: Wed Aug 16 10:23:13 2023 +0800 support save unique key in metadata for sqlserver (#28075) * load unique key for sqlserver * support save unique key in metadata for sqlserver * for checkstyle --- .../data/loader/SQLServerMetaDataLoader.java | 27 +++++++++++++++++----- .../data/loader/SQLServerMetaDataLoaderTest.java | 14 ++++++++--- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java index aa4fbdf5811..46df79e10ae 100644 --- a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java +++ b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java @@ -55,8 +55,11 @@ public final class SQLServerMetaDataLoader implements DialectMetaDataLoader { private static final String TABLE_META_DATA_SQL_IN_TABLES = TABLE_META_DATA_SQL_NO_ORDER + " WHERE obj.name IN (%s)" + ORDER_BY_COLUMN_ID; - private static final String INDEX_META_DATA_SQL = "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM sys.indexes a" - + " JOIN sys.objects c ON a.object_id = c.object_id WHERE a.index_id NOT IN (0, 255) AND c.name IN (%s)"; + private static final String INDEX_META_DATA_SQL = "SELECT idx.name AS INDEX_NAME, obj.name AS TABLE_NAME, col.name AS COLUMN_NAME," + + " idx.is_unique AS IS_UNIQUE FROM sys.indexes idx" + + " LEFT JOIN sys.objects obj ON idx.object_id = obj.object_id" + + " LEFT JOIN sys.columns col ON obj.object_id = col.object_id" + + " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN (%s) ORDER BY idx.index_id"; private static final int HIDDEN_COLUMN_START_MAJOR_VERSION = 15; @@ -121,7 +124,7 @@ public final class SQLServerMetaDataLoader implements DialectMetaDataLoader { } private Map<String, Collection<IndexMetaData>> loadIndexMetaData(final DataSource dataSource, final Collection<String> tableNames) throws SQLException { - Map<String, Collection<IndexMetaData>> result = new HashMap<>(); + Map<String, Map<String, IndexMetaData>> tableToIndex = new HashMap<>(); try ( Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(getIndexMetaDataSQL(tableNames))) { @@ -129,13 +132,25 @@ public final class SQLServerMetaDataLoader implements DialectMetaDataLoader { while (resultSet.next()) { String indexName = resultSet.getString("INDEX_NAME"); String tableName = resultSet.getString("TABLE_NAME"); - if (!result.containsKey(tableName)) { - result.put(tableName, new LinkedList<>()); + if (!tableToIndex.containsKey(tableName)) { + tableToIndex.put(tableName, new HashMap<>()); + } + Map<String, IndexMetaData> indexMap = tableToIndex.get(tableName); + if (indexMap.containsKey(indexName)) { + indexMap.get(indexName).getColumns().add(resultSet.getString("COLUMN_NAME")); + } else { + IndexMetaData indexMetaData = new IndexMetaData(indexName); + indexMetaData.getColumns().add(resultSet.getString("COLUMN_NAME")); + indexMetaData.setUnique("1".equals(resultSet.getString("IS_UNIQUE"))); + indexMap.put(indexName, indexMetaData); } - result.get(tableName).add(new IndexMetaData(indexName)); } } } + Map<String, Collection<IndexMetaData>> result = new HashMap<>(tableToIndex.size(), 1); + for (Entry<String, Map<String, IndexMetaData>> each : tableToIndex.entrySet()) { + result.put(each.getKey(), each.getValue().values()); + } return result; } diff --git a/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java b/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java index ec7587baa58..752d9eb05bd 100644 --- a/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java +++ b/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java @@ -71,8 +71,11 @@ class SQLServerMetaDataLoaderTest { + " FROM sys.objects obj INNER JOIN sys.columns col ON obj.object_id = col.object_id LEFT JOIN sys.types t ON t.user_type_id = col.user_type_id" + " WHERE obj.name IN ('tbl') ORDER BY col.column_id"; - private static final String LOAD_INDEX_META_DATA = "SELECT a.name AS INDEX_NAME, c.name AS TABLE_NAME FROM sys.indexes a" - + " JOIN sys.objects c ON a.object_id = c.object_id WHERE a.index_id NOT IN (0, 255) AND c.name IN ('tbl')"; + private static final String LOAD_INDEX_META_DATA = "SELECT idx.name AS INDEX_NAME, obj.name AS TABLE_NAME, col.name AS COLUMN_NAME," + + " idx.is_unique AS IS_UNIQUE FROM sys.indexes idx" + + " LEFT JOIN sys.objects obj ON idx.object_id = obj.object_id" + + " LEFT JOIN sys.columns col ON obj.object_id = col.object_id" + + " WHERE idx.index_id NOT IN (0, 255) AND obj.name IN ('tbl') ORDER BY idx.index_id"; @Test void assertLoadWithoutTablesWithHighVersion() throws SQLException { @@ -178,6 +181,8 @@ class SQLServerMetaDataLoaderTest { when(result.next()).thenReturn(true, false); when(result.getString("INDEX_NAME")).thenReturn("id"); when(result.getString("TABLE_NAME")).thenReturn("tbl"); + when(result.getString("COLUMN_NAME")).thenReturn("id"); + when(result.getString("IS_UNIQUE")).thenReturn("1"); return result; } @@ -193,6 +198,9 @@ class SQLServerMetaDataLoaderTest { assertThat(actualTableMetaData.getColumns().size(), is(2)); assertThat(actualTableMetaData.getIndexes().size(), is(1)); Iterator<IndexMetaData> indexesIterator = actualTableMetaData.getIndexes().iterator(); - assertThat(indexesIterator.next(), is(new IndexMetaData("id"))); + IndexMetaData expected = new IndexMetaData("id"); + expected.getColumns().add("id"); + expected.setUnique(true); + assertThat(indexesIterator.next(), is(expected)); } }