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));
     }
 }

Reply via email to