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

Reply via email to