This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-26840 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 66b855da92b68a7785eac2b1cdfad26d24f078ae Author: AMashenkov <[email protected]> AuthorDate: Thu Jan 22 18:24:39 2026 +0300 Fix catalog serializers --- .../descriptors/CatalogTableDescriptor.java | 16 +++ .../CatalogTableDescriptorSerializers.java | 139 ++++++++------------- .../ignite/internal/catalog/CatalogTableTest.java | 8 +- .../descriptors/CatalogTableDescriptorTest.java | 4 +- 4 files changed, 75 insertions(+), 92 deletions(-) diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java index b1b90e93804..3736a6ce5be 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java @@ -190,6 +190,7 @@ public class CatalogTableDescriptor extends CatalogObjectDescriptor implements M /** * Returns a list primary key column names. */ + @Deprecated public List<String> primaryKeyColumnNames() { // TODO: https://issues.apache.org/jira/browse/IGNITE-26840 return resolveColumnNames(this, primaryKeyColumns); @@ -198,11 +199,26 @@ public class CatalogTableDescriptor extends CatalogObjectDescriptor implements M /** * Returns a list colocation key column names. */ + @Deprecated public List<String> colocationColumnNames() { // TODO: https://issues.apache.org/jira/browse/IGNITE-26840 return resolveColumnNames(this, colocationColumns); } + /** + * Returns a list of primary key column IDs. + */ + public IntList primaryKeyColumns() { + return primaryKeyColumns; + } + + /** + * Returns a list of colocation key column IDs. + */ + public IntList colocationColumns() { + return colocationColumns; + } + /** {@inheritDoc} */ @Override public List<CatalogTableColumnDescriptor> columns() { diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java index e2a8fd4b703..8acbc08997e 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java @@ -88,13 +88,8 @@ public class CatalogTableDescriptorSerializers { if (colocationColumnsLen == -1) { colocationColumns = primaryKeyColumns; } else { - colocationColumns = new IntArrayList(colocationColumnsLen); - int[] colocationColumnIdxs = input.readIntArray(colocationColumnsLen); - - for (int idx : colocationColumnIdxs) { - colocationColumns.add(columns.get(idx).id()); - } + colocationColumns = resolveColumnIdsByIndexes(columns, colocationColumnIdxs); } return CatalogTableDescriptor.builder() @@ -135,7 +130,7 @@ public class CatalogTableDescriptorSerializers { output.writeVarInt(pkIndexes.length); output.writeIntArray(pkIndexes); - if (descriptor.colocationColumnNames() == descriptor.primaryKeyColumnNames()) { + if (descriptor.colocationColumns() == descriptor.primaryKeyColumns()) { output.writeVarInt(-1); } else { int[] colocationIndexes = resolveColocationColumnIndexes(pkIndexes, descriptor); @@ -144,51 +139,6 @@ public class CatalogTableDescriptorSerializers { output.writeIntArray(colocationIndexes); } } - - private static int[] resolveColocationColumnIndexes(int[] pkColumnIndexes, CatalogTableDescriptor descriptor) { - int[] colocationColumnIndexes = new int[descriptor.colocationColumnNames().size()]; - - for (int idx : pkColumnIndexes) { - String columnName = descriptor.columns().get(idx).name(); - - for (int j = 0; j < descriptor.colocationColumnNames().size(); j++) { - if (descriptor.colocationColumnNames().get(j).equals(columnName)) { - colocationColumnIndexes[j] = idx; - - break; - } - } - } - - return colocationColumnIndexes; - } - - private static int[] resolvePkColumnIndexes(CatalogTableDescriptor descriptor) { - List<CatalogTableColumnDescriptor> columns = descriptor.columns(); - List<String> pkColumns = descriptor.primaryKeyColumnNames(); - - assert columns.size() >= pkColumns.size(); - - int[] pkColumnIndexes = new int[pkColumns.size()]; - int foundCount = 0; - - for (int i = 0; i < columns.size() && foundCount < pkColumnIndexes.length; i++) { - for (int j = 0; j < pkColumns.size(); j++) { - String pkColumn = pkColumns.get(j); - - if (pkColumn.equals(columns.get(i).name())) { - pkColumnIndexes[j] = i; - foundCount++; - - break; - } - } - } - - assert foundCount == pkColumnIndexes.length; - - return pkColumnIndexes; - } } /** @@ -230,13 +180,8 @@ public class CatalogTableDescriptorSerializers { if (colocationColumnsLen == -1) { colocationColumns = primaryKeyColumns; } else { - colocationColumns = new IntArrayList(colocationColumnsLen); - int[] colocationColumnIdxs = input.readIntArray(colocationColumnsLen); - - for (int idx : colocationColumnIdxs) { - colocationColumns.add(columns.get(idx).id()); - } + colocationColumns = resolveColumnIdsByIndexes(columns, colocationColumnIdxs); } return CatalogTableDescriptor.builder() @@ -272,7 +217,7 @@ public class CatalogTableDescriptorSerializers { output.writeVarInt(pkIndexes.length); output.writeIntArray(pkIndexes); - if (descriptor.colocationColumnNames() == descriptor.primaryKeyColumnNames()) { + if (descriptor.colocationColumns() == descriptor.primaryKeyColumns()) { output.writeVarInt(-1); } else { int[] colocationIndexes = resolveColocationColumnIndexes(pkIndexes, descriptor); @@ -318,13 +263,8 @@ public class CatalogTableDescriptorSerializers { if (colocationColumnsLen == -1) { colocationColumns = primaryKeyColumns; } else { - colocationColumns = new IntArrayList(colocationColumnsLen); - int[] colocationColumnIdxs = input.readIntArray(colocationColumnsLen); - - for (int idx : colocationColumnIdxs) { - colocationColumns.add(columns.get(idx).id()); - } + colocationColumns = resolveColumnIdsByIndexes(columns, colocationColumnIdxs); } double staleRowsFraction = input.readDouble(); @@ -364,7 +304,7 @@ public class CatalogTableDescriptorSerializers { output.writeVarInt(pkIndexes.length); output.writeIntArray(pkIndexes); - if (descriptor.colocationColumnNames() == descriptor.primaryKeyColumnNames()) { + if (descriptor.colocationColumns() == descriptor.primaryKeyColumns()) { output.writeVarInt(-1); } else { int[] colocationIndexes = resolveColocationColumnIndexes(pkIndexes, descriptor); @@ -378,43 +318,70 @@ public class CatalogTableDescriptorSerializers { } } + /** + * Return column ids for given column indexes. + */ + private static IntList resolveColumnIdsByIndexes(List<CatalogTableColumnDescriptor> columns, int[] indexes) { + IntList columnIds = new IntArrayList(indexes.length); + + for (int idx : indexes) { + columnIds.add(columns.get(idx).id()); + } + + return columnIds; + } + + /** + * Return colocation key column positions in the column's list from given table descriptor. + * + * <p>Note: The methods accepts (precalculated) primary key column indexes as an optimization relying on the fact that + * the colocation columns are a subset of primary key columns. + */ private static int[] resolveColocationColumnIndexes(int[] pkColumnIndexes, CatalogTableDescriptor descriptor) { - int[] colocationColumnIndexes = new int[descriptor.colocationColumnNames().size()]; + List<CatalogTableColumnDescriptor> columns = descriptor.columns(); + IntList colocationIds = descriptor.colocationColumns(); + + assert pkColumnIndexes.length >= colocationIds.size(); - for (int idx : pkColumnIndexes) { - String columnName = descriptor.columns().get(idx).name(); + int[] colocationColumnIndexes = new int[colocationIds.size()]; + int foundCount = 0; - for (int j = 0; j < descriptor.colocationColumnNames().size(); j++) { - if (descriptor.colocationColumnNames().get(j).equals(columnName)) { - colocationColumnIndexes[j] = idx; + // Walk through PK columns as colocation columns are a subset of PK columns. + for (int i = 0; i < pkColumnIndexes.length && foundCount < colocationColumnIndexes.length; i++) { + int colIdx = pkColumnIndexes[i]; + int colId = columns.get(colIdx).id(); - break; - } + int pos = colocationIds.indexOf(colId); + if (pos != -1) { + colocationColumnIndexes[pos] = colIdx; + foundCount++; } } + assert foundCount == colocationColumnIndexes.length; + return colocationColumnIndexes; } + /** + * Return primary key column positions in the column list from given table descriptor. + */ private static int[] resolvePkColumnIndexes(CatalogTableDescriptor descriptor) { List<CatalogTableColumnDescriptor> columns = descriptor.columns(); - List<String> pkColumns = descriptor.primaryKeyColumnNames(); + IntList pkColumnIds = descriptor.primaryKeyColumns(); - assert columns.size() >= pkColumns.size(); + assert columns.size() >= pkColumnIds.size(); - int[] pkColumnIndexes = new int[pkColumns.size()]; + int[] pkColumnIndexes = new int[pkColumnIds.size()]; int foundCount = 0; - for (int i = 0; i < columns.size() && foundCount < pkColumnIndexes.length; i++) { - for (int j = 0; j < pkColumns.size(); j++) { - String pkColumn = pkColumns.get(j); - - if (pkColumn.equals(columns.get(i).name())) { - pkColumnIndexes[j] = i; - foundCount++; + for (int colIdx = 0; colIdx < columns.size() && foundCount < pkColumnIndexes.length; colIdx++) { + int colId = columns.get(colIdx).id(); - break; - } + int pos = pkColumnIds.indexOf(colId); + if (pos != -1) { + pkColumnIndexes[pos] = colIdx; + foundCount++; } } diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java index 1ba22e87093..6a0b7428595 100644 --- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java +++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java @@ -175,8 +175,8 @@ public class CatalogTableTest extends BaseCatalogManagerTest { // Validate newly created table assertEquals(TABLE_NAME, table.name()); assertEquals(catalog.defaultZone().id(), table.zoneId()); - assertEquals(List.of("key1", "key2"), table.primaryKeyColumnNames()); - assertEquals(List.of("key2"), table.colocationColumnNames()); + assertEquals(IntList.of(0, 1), table.primaryKeyColumns()); + assertEquals(IntList.of(1), table.colocationColumns()); // Validate newly created pk index assertEquals(pkIndexName(TABLE_NAME), pkIndex.name()); @@ -662,8 +662,8 @@ public class CatalogTableTest extends BaseCatalogManagerTest { // Assert that all other properties have been left intact. assertThat(curDescriptor.id(), is(prevDescriptor.id())); assertThat(curDescriptor.columns(), is(prevDescriptor.columns())); - assertThat(curDescriptor.colocationColumnNames(), is(prevDescriptor.colocationColumnNames())); - assertThat(curDescriptor.primaryKeyColumnNames(), is(prevDescriptor.primaryKeyColumnNames())); + assertThat(curDescriptor.colocationColumns(), is(prevDescriptor.colocationColumns())); + assertThat(curDescriptor.primaryKeyColumns(), is(prevDescriptor.primaryKeyColumns())); assertThat(curDescriptor.primaryKeyIndexId(), is(prevDescriptor.primaryKeyIndexId())); assertThat(curDescriptor.schemaId(), is(prevDescriptor.schemaId())); assertThat(curDescriptor.latestSchemaVersion(), is(prevDescriptor.latestSchemaVersion())); diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java index 557a96a667d..f38df8e22a8 100644 --- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java +++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java @@ -78,7 +78,7 @@ class CatalogTableDescriptorTest { .build(); assertSoftly(assertions -> { - assertions.assertThat(descriptor.colocationColumnNames()).containsExactly("pkCol"); + assertions.assertThat(descriptor.colocationColumns().intStream()).containsExactly(0); assertions.assertThat(descriptor.updateTimestamp()).isEqualTo(INITIAL_TIMESTAMP); assertions.assertThat(descriptor.isPrimaryKeyColumn("pkCol")).isTrue(); assertions.assertThat(descriptor.latestSchemaVersion()).isEqualTo(CatalogTableDescriptor.INITIAL_TABLE_VERSION); @@ -92,7 +92,7 @@ class CatalogTableDescriptorTest { .build(); assertSoftly(assertions -> { - assertions.assertThat(descriptor.colocationColumnNames()).containsExactly("pkCol"); + assertions.assertThat(descriptor.colocationColumns().intStream()).containsExactly(0); assertions.assertThat(descriptorV2.updateTimestamp()).isEqualTo(HybridTimestamp.MAX_VALUE); assertions.assertThat(descriptorV2.isPrimaryKeyColumn("pkCol")).isTrue(); assertions.assertThat(descriptorV2.latestSchemaVersion()).isEqualTo(2);
