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 <[email protected]>
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();
}