This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 01820435ca IGNITE-20857 Returns a sorted list by index ID from a 
catalog (#2837)
01820435ca is described below

commit 01820435ca35c29a228ea6fdc5f511861b7be023
Author: Kirill Tkalenko <tkalkir...@yandex.ru>
AuthorDate: Thu Nov 16 16:41:13 2023 +0300

    IGNITE-20857 Returns a sorted list by index ID from a catalog (#2837)
---
 .../apache/ignite/internal/catalog/Catalog.java    | 39 ++++++++++
 .../internal/catalog/CatalogManagerImpl.java       |  5 ++
 .../ignite/internal/catalog/CatalogService.java    |  3 +
 .../internal/catalog/CatalogManagerSelfTest.java   | 89 ++++++++++++++++++----
 .../internal/index/IndexBuildController.java       |  4 +-
 .../internal/table/distributed/TableManager.java   |  3 +-
 6 files changed, 125 insertions(+), 18 deletions(-)

diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java
index f214260376..c7668e7eaa 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java
@@ -17,10 +17,18 @@
 
 package org.apache.ignite.internal.catalog;
 
+import static it.unimi.dsi.fastutil.ints.Int2ObjectMaps.unmodifiable;
+import static java.util.Collections.unmodifiableList;
+import static java.util.Comparator.comparingInt;
+
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.function.Function;
@@ -59,10 +67,16 @@ public class Catalog {
 
     @IgniteToStringExclude
     private final Int2ObjectMap<CatalogSchemaDescriptor> schemasById;
+
     @IgniteToStringExclude
     private final Int2ObjectMap<CatalogTableDescriptor> tablesById;
+
     @IgniteToStringExclude
     private final Int2ObjectMap<CatalogIndexDescriptor> indexesById;
+
+    @IgniteToStringExclude
+    private final Int2ObjectMap<List<CatalogIndexDescriptor>> indexesByTableId;
+
     @IgniteToStringExclude
     private final Int2ObjectMap<CatalogZoneDescriptor> zonesById;
 
@@ -96,6 +110,7 @@ public class Catalog {
         schemasById = schemas.stream().collect(toMapById());
         tablesById = schemas.stream().flatMap(s -> 
Arrays.stream(s.tables())).collect(toMapById());
         indexesById = schemas.stream().flatMap(s -> 
Arrays.stream(s.indexes())).collect(toMapById());
+        indexesByTableId = unmodifiable(toIndexesByTableId(schemas));
         zonesById = zones.stream().collect(toMapById());
     }
 
@@ -139,6 +154,10 @@ public class Catalog {
         return indexesById.values();
     }
 
+    public List<CatalogIndexDescriptor> indexes(int tableId) {
+        return indexesByTableId.getOrDefault(tableId, List.of());
+    }
+
     public @Nullable CatalogZoneDescriptor zone(String name) {
         return zonesByName.get(name);
     }
@@ -155,4 +174,24 @@ public class Catalog {
     public String toString() {
         return S.toString(this);
     }
+
+    private static Int2ObjectMap<List<CatalogIndexDescriptor>> 
toIndexesByTableId(Collection<CatalogSchemaDescriptor> schemas) {
+        Int2ObjectMap<List<CatalogIndexDescriptor>> indexesByTableId = new 
Int2ObjectOpenHashMap<>();
+
+        for (CatalogSchemaDescriptor schema : schemas) {
+            for (CatalogIndexDescriptor index : schema.indexes()) {
+                indexesByTableId.computeIfAbsent(index.tableId(), indexes -> 
new ArrayList<>()).add(index);
+            }
+        }
+
+        for (List<CatalogIndexDescriptor> indexes : indexesByTableId.values()) 
{
+            indexes.sort(comparingInt(CatalogIndexDescriptor::id));
+        }
+
+        for (Entry<List<CatalogIndexDescriptor>> entry : 
indexesByTableId.int2ObjectEntrySet()) {
+            entry.setValue(unmodifiableList(entry.getValue()));
+        }
+
+        return indexesByTableId;
+    }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index 3078ecae33..2903aa8a8a 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -230,6 +230,11 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
         return catalog(catalogVersion).indexes();
     }
 
+    @Override
+    public List<CatalogIndexDescriptor> indexes(int catalogVersion, int 
tableId) {
+        return catalog(catalogVersion).indexes(tableId);
+    }
+
     @Override
     public @Nullable CatalogSchemaDescriptor schema(int version) {
         Catalog catalog = catalog(version);
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java
index b5b11d804c..11e6528a01 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.catalog;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
@@ -67,6 +68,8 @@ public interface CatalogService extends 
EventProducer<CatalogEvent, CatalogEvent
 
     Collection<CatalogIndexDescriptor> indexes(int catalogVersion);
 
+    List<CatalogIndexDescriptor> indexes(int catalogVersion, int tableId);
+
     @Nullable CatalogSchemaDescriptor schema(int version);
 
     @Nullable CatalogSchemaDescriptor schema(@Nullable String schemaName, int 
version);
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 4d1a3a3117..a8b3185757 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -57,6 +57,7 @@ import static org.apache.ignite.sql.ColumnType.NULL;
 import static org.apache.ignite.sql.ColumnType.STRING;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.hasItems;
 import static org.hamcrest.Matchers.is;
@@ -105,6 +106,7 @@ import 
org.apache.ignite.internal.catalog.commands.MakeIndexAvailableCommand;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogObjectDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
@@ -1778,20 +1780,6 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
                 willThrowFast(CatalogValidationException.class));
     }
 
-
-
-    private void createSomeTable(String tableName) {
-        assertThat(
-                manager.execute(createTableCommand(
-                        tableName,
-                        List.of(columnParams("key1", INT32), 
columnParams("val1", INT32)),
-                        List.of("key1"),
-                        List.of("key1")
-                )),
-                willCompleteSuccessfully()
-        );
-    }
-
     @Test
     void bulkCommandEitherAppliedAtomicallyOrDoesntAppliedAtAll() {
         String tableName1 = "TEST1";
@@ -1992,6 +1980,48 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
         assertThat(fireEventFuture, willCompleteSuccessfully());
     }
 
+    @Test
+    void testGetIndexesForTables() {
+        String tableName0 = TABLE_NAME + 0;
+        String tableName1 = TABLE_NAME + 1;
+
+        createSomeTable(tableName0);
+        createSomeTable(tableName1);
+
+        createSomeIndex(tableName1, INDEX_NAME);
+
+        int catalogVersion = manager.latestCatalogVersion();
+
+        // Let's check for a non-existent table.
+        assertThat(tableIndexIds(catalogVersion, Integer.MAX_VALUE), empty());
+
+        // Let's check for an existing tables.
+        int tableId0 = tableId(tableName0);
+        int tableId1 = tableId(tableName1);
+
+        assertThat(tableIndexIds(catalogVersion, tableId0), 
hasItems(indexId(pkIndexName(tableName0))));
+        assertThat(tableIndexIds(catalogVersion, tableId1), 
hasItems(indexId(pkIndexName(tableName1)), indexId(INDEX_NAME)));
+    }
+
+    @Test
+    void testGetIndexesForTableInSortedOrderById() {
+        createSomeTable(TABLE_NAME);
+
+        String indexName0 = INDEX_NAME + 0;
+        String indexName1 = INDEX_NAME + 1;
+
+        createSomeIndex(TABLE_NAME, indexName0);
+        createSomeIndex(TABLE_NAME, indexName1);
+
+        int indexId0 = indexId(pkIndexName(TABLE_NAME));
+        int indexId1 = indexId(indexName0);
+        int indexId2 = indexId(indexName1);
+
+        int catalogVersion = manager.latestCatalogVersion();
+
+        assertThat(tableIndexIds(catalogVersion, tableId(TABLE_NAME)), 
equalTo(List.of(indexId0, indexId1, indexId2)));
+    }
+
     private CompletableFuture<Void> changeColumn(
             String tab,
             String col,
@@ -2061,6 +2091,14 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
         return manager.schema(catalogVersion).index(indexName);
     }
 
+    private int tableId(String tableName) {
+        CatalogTableDescriptor table = manager.table(tableName, 
clock.nowLong());
+
+        assertNotNull(table, tableName);
+
+        return table.id();
+    }
+
     private int indexId(String indexName) {
         CatalogIndexDescriptor index = manager.index(indexName, 
clock.nowLong());
 
@@ -2068,4 +2106,27 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
 
         return index.id();
     }
+
+    private void createSomeTable(String tableName) {
+        assertThat(
+                manager.execute(createTableCommand(
+                        tableName,
+                        List.of(columnParams("key1", INT32), 
columnParams("val1", INT32)),
+                        List.of("key1"),
+                        List.of("key1")
+                )),
+                willCompleteSuccessfully()
+        );
+    }
+
+    private void createSomeIndex(String tableName, String indexName) {
+        assertThat(
+                manager.execute(createHashIndexCommand(tableName, indexName, 
false, List.of("key1"))),
+                willCompleteSuccessfully()
+        );
+    }
+
+    private List<Integer> tableIndexIds(int catalogVersion, int tableId) {
+        return manager.indexes(catalogVersion, 
tableId).stream().map(CatalogObjectDescriptor::id).collect(toList());
+    }
 }
diff --git 
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
 
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
index 4e1b2ae3ac..aefc4cd5c5 100644
--- 
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
+++ 
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
@@ -222,8 +222,8 @@ class IndexBuildController implements ManuallyCloseable {
                 return;
             }
 
-            for (CatalogIndexDescriptor indexDescriptor : 
catalogService.indexes(catalogVersion)) {
-                if (!indexDescriptor.available() && primaryReplicaId.tableId() 
== indexDescriptor.tableId()) {
+            for (CatalogIndexDescriptor indexDescriptor : 
catalogService.indexes(catalogVersion, primaryReplicaId.tableId())) {
+                if (!indexDescriptor.available()) {
                     scheduleBuildIndex(primaryReplicaId, indexDescriptor, 
mvTableStorage, enlistmentConsistencyToken(replicaMeta));
                 }
             }
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 19d2e1c3f9..ad38c485e2 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -2131,8 +2131,7 @@ public class TableManager implements 
IgniteTablesInternal, IgniteComponent {
     }
 
     private int[] collectTableIndexIds(int tableId, int catalogVersion) {
-        return catalogService.indexes(catalogVersion).stream()
-                .filter(indexDescriptor -> indexDescriptor.tableId() == 
tableId)
+        return catalogService.indexes(catalogVersion, tableId).stream()
                 .mapToInt(CatalogIndexDescriptor::id)
                 .toArray();
     }

Reply via email to