This is an automated email from the ASF dual-hosted git repository.
amashenkov 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 2fcc41ef00f IGNITE-26840 Catalog. Migrate rest of the code from name
to column id (#7465)
2fcc41ef00f is described below
commit 2fcc41ef00fadf4e4cc4a3d06ab4f11e9b66f87a
Author: Andrew V. Mashenkov <[email protected]>
AuthorDate: Tue Jan 27 16:01:07 2026 +0300
IGNITE-26840 Catalog. Migrate rest of the code from name to column id
(#7465)
---
.../commands/AbstractCreateIndexCommand.java | 2 +-
.../internal/catalog/commands/CatalogUtils.java | 22 +++-
.../descriptors/CatalogTableDescriptor.java | 16 +++
.../CatalogTableDescriptorSerializers.java | 133 ++++-----------------
.../systemviews/TablesSystemViewProvider.java | 13 +-
.../ignite/internal/catalog/CatalogTableTest.java | 8 +-
.../descriptors/CatalogTableDescriptorTest.java | 4 +-
.../handler/requests/jdbc/JdbcMetadataCatalog.java | 3 +-
.../ignite/internal/schema/SchemaDescriptor.java | 129 +++++++++-----------
.../CatalogToSchemaDescriptorConverter.java | 10 +-
.../sql/engine/schema/SqlSchemaManagerImpl.java | 33 ++---
.../prepare/ddl/DdlSqlToCommandConverterTest.java | 17 +--
12 files changed, 154 insertions(+), 236 deletions(-)
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
index db797e1dc65..1208e63e46e 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
@@ -98,7 +98,7 @@ public abstract class AbstractCreateIndexCommand extends
AbstractIndexCommand {
}
}
- if (unique && !new
HashSet<>(columns).containsAll(table.colocationColumnNames())) {
+ if (unique && !new
HashSet<>(columns).containsAll(CatalogUtils.resolveColumnNames(table,
table.colocationColumns()))) {
throw new CatalogValidationException("Unique index must include
all colocation columns.");
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index b45fbfde2fb..e02ed7994c5 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -61,7 +61,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Catalog utils.
*/
-public class CatalogUtils {
+public final class CatalogUtils {
/** Default zone name. */
public static final String DEFAULT_ZONE_NAME = "Default";
@@ -967,4 +967,24 @@ public class CatalogUtils {
return names;
}
+
+ /**
+ * Return column positions in the table descriptor for the given column
IDs.
+ */
+ public static int[] resolveColumnIndexesByIds(CatalogTableDescriptor
descriptor, IntList columnIds) {
+ int[] columnIdxs = new int[columnIds.size()];
+
+ for (int i = 0; i < columnIds.size(); i++) {
+ int colId = columnIds.getInt(i);
+ int colIdx = descriptor.columnIndexById(colId);
+ columnIdxs[i] = colIdx;
+ }
+
+ return columnIdxs;
+ }
+
+ // Private constructor to prevent instantiation
+ private CatalogUtils() {
+
+ }
}
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..d881d78f433 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
@@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import java.io.IOException;
import java.util.List;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
import
org.apache.ignite.internal.catalog.storage.serialization.CatalogEntrySerializerProvider;
import
org.apache.ignite.internal.catalog.storage.serialization.CatalogObjectDataInput;
import
org.apache.ignite.internal.catalog.storage.serialization.CatalogObjectDataOutput;
@@ -88,13 +89,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()
@@ -130,65 +126,20 @@ public class CatalogTableDescriptorSerializers {
output.writeVarInt(descriptor.primaryKeyIndexId());
output.writeVarInt(descriptor.zoneId());
- int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+ int[] pkIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.primaryKeyColumns());
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);
+ int[] colocationIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.colocationColumns());
output.writeVarInt(colocationIndexes.length);
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 +181,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()
@@ -267,15 +213,15 @@ public class CatalogTableDescriptorSerializers {
output.writeVarInt(descriptor.primaryKeyIndexId());
output.writeVarInt(descriptor.zoneId());
- int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+ int[] pkIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.primaryKeyColumns());
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);
+ int[] colocationIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.colocationColumns());
output.writeVarInt(colocationIndexes.length);
output.writeIntArray(colocationIndexes);
@@ -318,13 +264,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();
@@ -359,15 +300,15 @@ public class CatalogTableDescriptorSerializers {
output.writeVarInt(descriptor.primaryKeyIndexId());
output.writeVarInt(descriptor.zoneId());
- int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+ int[] pkIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.primaryKeyColumns());
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);
+ int[] colocationIndexes =
CatalogUtils.resolveColumnIndexesByIds(descriptor,
descriptor.colocationColumns());
output.writeVarInt(colocationIndexes.length);
output.writeIntArray(colocationIndexes);
@@ -378,48 +319,16 @@ public class CatalogTableDescriptorSerializers {
}
}
- 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++;
+ /**
+ * Return column IDs for the given column positions in columns list.
+ */
+ private static IntList
resolveColumnIdsByIndexes(List<CatalogTableColumnDescriptor> columns, int[]
indexes) {
+ IntList columnIds = new IntArrayList(indexes.length);
- break;
- }
- }
+ for (int idx : indexes) {
+ columnIds.add(columns.get(idx).id());
}
- assert foundCount == pkColumnIndexes.length;
-
- return pkColumnIndexes;
+ return columnIds;
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
index 25088dc1f98..e8a03f814e6 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
@@ -27,6 +27,7 @@ import java.util.concurrent.Flow.Publisher;
import java.util.function.Supplier;
import org.apache.ignite.internal.catalog.Catalog;
import org.apache.ignite.internal.catalog.CatalogSystemViewProvider;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
import
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.systemview.api.SystemView;
@@ -75,7 +76,8 @@ public class TablesSystemViewProvider implements
CatalogSystemViewProvider {
.addColumn("TABLE_PK_INDEX_ID", INT32, entry ->
entry.table.primaryKeyIndexId())
.addColumn("ZONE_NAME", STRING, entry -> entry.zoneName)
.addColumn("STORAGE_PROFILE", STRING, entry ->
entry.table.storageProfile())
- .addColumn("TABLE_COLOCATION_COLUMNS", STRING, entry ->
concatColumns(entry.table.colocationColumnNames()))
+ .addColumn("TABLE_COLOCATION_COLUMNS", STRING, entry ->
+
concatColumns(CatalogUtils.resolveColumnNames(entry.table,
entry.table.colocationColumns())))
.addColumn("SCHEMA_ID", INT32, entry -> entry.table.schemaId())
.addColumn("ZONE_ID", INT32, entry -> entry.table.zoneId())
// TODO https://issues.apache.org/jira/browse/IGNITE-24589:
Next columns are deprecated and should be removed.
@@ -84,7 +86,8 @@ public class TablesSystemViewProvider implements
CatalogSystemViewProvider {
.addColumn("NAME", STRING, entry -> entry.table.name())
.addColumn("ID", INT32, entry -> entry.table.id())
.addColumn("PK_INDEX_ID", INT32, entry ->
entry.table.primaryKeyIndexId())
- .addColumn("COLOCATION_KEY_INDEX", STRING, entry ->
concatColumns(entry.table.colocationColumnNames()))
+ .addColumn("COLOCATION_KEY_INDEX", STRING, entry ->
+
concatColumns(CatalogUtils.resolveColumnNames(entry.table,
entry.table.colocationColumns())))
.addColumn("ZONE", STRING, entry -> entry.zoneName)
.dataProvider(viewDataPublisher)
.build();
@@ -162,16 +165,16 @@ public class TablesSystemViewProvider implements
CatalogSystemViewProvider {
}
int columnOrdinal() {
- return tableDescriptor.columnIndex(columnDescriptor.name());
+ return tableDescriptor.columnIndexById(columnDescriptor.id());
}
@Nullable Integer pkColumnOrdinal() {
- int idx =
tableDescriptor.primaryKeyColumnNames().indexOf(columnDescriptor.name());
+ int idx =
tableDescriptor.primaryKeyColumns().indexOf(columnDescriptor.id());
return idx >= 0 ? idx : null;
}
@Nullable Integer colocationColumnOrdinal() {
- int idx =
tableDescriptor.colocationColumnNames().indexOf(columnDescriptor.name());
+ int idx =
tableDescriptor.colocationColumns().indexOf(columnDescriptor.id());
return idx >= 0 ? idx : null;
}
}
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);
diff --git
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
index 325ab117a10..045e7180b60 100644
---
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
+++
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
@@ -34,6 +34,7 @@ import java.util.TreeSet;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import org.apache.ignite.internal.catalog.CatalogService;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
import org.apache.ignite.internal.catalog.descriptors.CatalogColumnContainer;
import org.apache.ignite.internal.catalog.descriptors.CatalogObjectDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
@@ -244,7 +245,7 @@ public class JdbcMetadataCatalog {
private static JdbcPrimaryKeyMeta createPrimaryKeyMeta(String schemaName,
CatalogTableDescriptor tbl) {
String keyName = PK + tbl.name();
- List<String> keyColNames = List.copyOf(tbl.primaryKeyColumnNames());
+ List<String> keyColNames = CatalogUtils.resolveColumnNames(tbl,
tbl.primaryKeyColumns());
return new JdbcPrimaryKeyMeta(schemaName, tbl.name(), keyName,
keyColNames);
}
diff --git
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
index 59275d64ec2..d8a693ea18c 100644
---
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
+++
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
@@ -19,11 +19,10 @@ package org.apache.ignite.internal.schema;
import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.BitSet;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -93,89 +92,90 @@ public class SchemaDescriptor {
}
/** Constructor. */
+ @TestOnly
public SchemaDescriptor(
int ver,
List<Column> columns,
List<String> keyColumns,
@Nullable List<String> colocationColumns
) {
+ this(
+ ver,
+ columns,
+ IntArrayList.toList(keyColumns.stream()
+ .map(colName -> columns.stream().filter(c ->
colName.equals(c.name())).findAny().get())
+ .mapToInt(columns::indexOf)),
+ colocationColumns == null ? null
+ : IntArrayList.toList(colocationColumns.stream()
+ .map(colName -> columns.stream().filter(c ->
colName.equals(c.name())).findAny().get())
+ .mapToInt(columns::indexOf))
+ );
+ }
+
+ /** Constructor. */
+ public SchemaDescriptor(int ver, List<Column> columns, IntList
keyColumnIndexes, @Nullable IntList colocationColumnIndexes) {
assert !nullOrEmpty(columns) : "Schema should have at least one
column";
+ assert colocationColumnIndexes == null ||
keyColumnIndexes.containsAll(colocationColumnIndexes);
+
+ boolean hasColocationKey = colocationColumnIndexes != null;
Map<String, Column> columnsByName = new HashMap<>();
- List<Column> orderedColumns = new ArrayList<>(columns.size());
+ Column[] orderedColumns = new Column[columns.size()];
+ Column[] keyColumns = new Column[keyColumnIndexes.size()];
+ Column[] colocationColumns = hasColocationKey ? new
Column[colocationColumnIndexes.size()] : null;
+ Column[] valueColumns = new Column[columns.size() -
keyColumnIndexes.size()];
- Object2IntMap<String> columnNameToPositionInKey =
toElementToPositionMap(keyColumns);
+ boolean hasTemporalColumns = false;
- Object2IntMap<String> columnNameToPositionInColocation;
- if (colocationColumns == null) {
- columnNameToPositionInColocation = columnNameToPositionInKey;
- } else {
- columnNameToPositionInColocation =
toElementToPositionMap(colocationColumns);
+ IntList effectiveColocationColumns = hasColocationKey ?
colocationColumnIndexes : keyColumnIndexes;
- assert
columnNameToPositionInKey.keySet().containsAll(colocationColumns)
- : "Colocation column must be part of the key: keyCols="
- + keyColumns + ", colocationCols=" + colocationColumns;
- }
+ for (int valueIndex = 0, rowPosition = 0; rowPosition <
columns.size(); rowPosition++) {
+ Column column = columns.get(rowPosition);
+
+ int keyPosition = keyColumnIndexes.indexOf(rowPosition);
+ int colocationPosition =
effectiveColocationColumns.indexOf(rowPosition);
+ int valuePosition = keyPosition == -1 ? valueIndex++ : -1;
- boolean hasTemporalColumns = false;
- int rowPosition = 0;
- int valuePosition = 0;
- for (Column column : columns) {
Column orderedColumn = column.copy(
- rowPosition++,
- columnNameToPositionInKey.getOrDefault(column.name(), -1),
- columnNameToPositionInKey.containsKey(column.name()) ? -1
: valuePosition++,
-
columnNameToPositionInColocation.getOrDefault(column.name(), -1)
+ rowPosition,
+ keyPosition,
+ valuePosition,
+ colocationPosition
);
Column old = columnsByName.put(orderedColumn.name(),
orderedColumn);
assert old == null : "Columns with similar names are not allowed:
" + old.name();
- orderedColumns.add(orderedColumn);
+ orderedColumns[rowPosition] = orderedColumn;
- if (column.type() instanceof TemporalNativeType) {
- hasTemporalColumns = true;
- }
- }
+ if (keyPosition == -1) {
+ assert colocationPosition == -1 : "Non key column cannot be
colocation column: " + orderedColumn.name();
- this.ver = ver;
- this.columns = List.copyOf(orderedColumns);
- this.columnsByName = Map.copyOf(columnsByName);
- this.hasTemporalColumns = hasTemporalColumns;
+ valueColumns[valuePosition] = orderedColumn;
+ } else {
+ assert !orderedColumn.nullable() : "Primary key cannot contain
nullable column: " + orderedColumn.name();
- List<Column> tmpKeyColumns = new ArrayList<>(keyColumns.size());
+ keyColumns[keyPosition] = orderedColumn;
- BitSet keyColumnsBitSet = new BitSet(columns.size());
- for (String name : keyColumns) {
- Column column = columnsByName.get(name);
-
- assert column != null : name;
- assert !column.nullable() : "Primary key cannot contain nullable
column: " + name;
-
- tmpKeyColumns.add(column);
-
- assert !keyColumnsBitSet.get(column.positionInRow()) :
column.name();
+ if (hasColocationKey && colocationPosition != -1) {
+ colocationColumns[colocationPosition] = orderedColumn;
+ }
+ }
- keyColumnsBitSet.set(column.positionInRow());
+ hasTemporalColumns = hasTemporalColumns || (column.type()
instanceof TemporalNativeType);
}
- this.keyCols = List.copyOf(tmpKeyColumns);
-
- this.colocationCols = colocationColumns == null
- ? this.keyCols
- : colocationColumns.stream()
- .map(columnsByName::get)
- .collect(Collectors.toList());
-
- List<Column> tmpValueColumns = new ArrayList<>(columns.size() -
keyColumnsBitSet.cardinality());
- for (Column column : orderedColumns) {
- if (!keyColumnsBitSet.get(column.positionInRow())) {
- tmpValueColumns.add(column);
- }
- }
+ this.ver = ver;
+ this.columns = List.of(orderedColumns);
+ this.columnsByName = Map.copyOf(columnsByName);
+ this.hasTemporalColumns = hasTemporalColumns;
- this.valCols = List.copyOf(tmpValueColumns);
+ this.keyCols = List.of(keyColumns);
+ this.valCols = List.of(valueColumns);
+ this.colocationCols = hasColocationKey
+ ? List.of(colocationColumns)
+ : this.keyCols;
}
private static List<Column> mergeColumns(Column[] keyColumns, Column[]
valueColumns) {
@@ -352,17 +352,4 @@ public class SchemaDescriptor {
return row;
}
}
-
- private static Object2IntMap<String> toElementToPositionMap(List<String>
elements) {
- Object2IntMap<String> result = new Object2IntOpenHashMap<>();
- int idx = 0;
- for (String element : elements) {
- assert !result.containsKey(element)
- : "Elements should not have duplicates: " + element;
-
- result.put(element, idx++);
- }
-
- return result;
- }
}
diff --git
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
index 32caadb3900..409afa99b62 100644
---
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
+++
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
@@ -19,10 +19,12 @@ package org.apache.ignite.internal.schema.catalog;
import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+import it.unimi.dsi.fastutil.ints.IntList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
import org.apache.ignite.internal.catalog.commands.DefaultValue;
import org.apache.ignite.internal.catalog.commands.DefaultValue.ConstantValue;
import org.apache.ignite.internal.catalog.commands.DefaultValue.FunctionCall;
@@ -171,11 +173,15 @@ public final class CatalogToSchemaDescriptorConverter {
columns.add(convert(column));
}
+ IntList pkColumns =
IntList.of(CatalogUtils.resolveColumnIndexesByIds(tableDescriptor,
tableDescriptor.primaryKeyColumns()));
+ IntList colocationColumns = tableDescriptor.primaryKeyColumns() ==
tableDescriptor.colocationColumns()
+ ? null :
IntList.of(CatalogUtils.resolveColumnIndexesByIds(tableDescriptor,
tableDescriptor.colocationColumns()));
+
return new SchemaDescriptor(
tableVersion,
columns,
- tableDescriptor.primaryKeyColumnNames(),
- tableDescriptor.colocationColumnNames()
+ pkColumns,
+ colocationColumns
);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
index a8ce4668786..07bfa7624c4 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
@@ -20,8 +20,8 @@ package org.apache.ignite.internal.sql.engine.schema;
import static
org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus.AVAILABLE;
import static
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -30,7 +30,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
-import java.util.stream.Collectors;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.plan.RelTraitSet;
@@ -292,7 +291,6 @@ public class SqlSchemaManagerImpl implements
SqlSchemaManager {
private TableDescriptor createTableDescriptorForTable(Catalog catalog,
CatalogTableDescriptor descriptor) {
List<CatalogTableColumnDescriptor> columns = descriptor.columns();
List<ColumnDescriptor> colDescriptors = new ArrayList<>(columns.size()
+ 2);
- Object2IntMap<String> columnToIndex = buildColumnToIndexMap(columns);
for (int i = 0; i < columns.size(); i++) {
CatalogTableColumnDescriptor col = columns.get(i);
@@ -303,7 +301,7 @@ public class SqlSchemaManagerImpl implements
SqlSchemaManager {
}
if (Commons.implicitPkEnabled()) {
- int implicitPkColIdx =
columnToIndex.getOrDefault(Commons.IMPLICIT_PK_COL_NAME, -1);
+ int implicitPkColIdx =
descriptor.columnIndex(Commons.IMPLICIT_PK_COL_NAME);
if (implicitPkColIdx != -1) {
colDescriptors.set(implicitPkColIdx,
injectDefault(colDescriptors.get(implicitPkColIdx)));
@@ -317,17 +315,14 @@ public class SqlSchemaManagerImpl implements
SqlSchemaManager {
CatalogZoneDescriptor zoneDescriptor =
Objects.requireNonNull(catalog.zone(descriptor.zoneId()));
CatalogSchemaDescriptor schemaDescriptor =
Objects.requireNonNull(catalog.schema(descriptor.schemaId()));
- IgniteDistribution distribution = createDistribution(descriptor,
columnToIndex, schemaDescriptor.name(), zoneDescriptor.name());
+ IgniteDistribution distribution = createDistribution(descriptor,
schemaDescriptor.name(), zoneDescriptor.name());
return new TableDescriptorImpl(colDescriptors, distribution);
}
- private IgniteDistribution createDistribution(
- CatalogTableDescriptor descriptor, Object2IntMap<String>
columnToIndex, String schemaName, String zoneName
- ) {
- List<Integer> colocationColumns =
descriptor.colocationColumnNames().stream()
- .map(columnToIndex::getInt)
- .collect(Collectors.toList());
+ private IgniteDistribution createDistribution(CatalogTableDescriptor
descriptor, String schemaName, String zoneName) {
+ IntList colocationColumns =
IntArrayList.toList(descriptor.colocationColumns().intStream()
+ .map(descriptor::columnIndexById));
int tableId = descriptor.id();
int zoneId = descriptor.zoneId();
@@ -337,17 +332,6 @@ public class SqlSchemaManagerImpl implements
SqlSchemaManager {
return IgniteDistributions.affinity(colocationColumns, tableId,
zoneId, label);
}
- private static Object2IntMap<String>
buildColumnToIndexMap(List<CatalogTableColumnDescriptor> columns) {
- Object2IntMap<String> columnToIndex = new
Object2IntOpenHashMap<>(columns.size() + 2);
-
- for (int i = 0; i < columns.size(); i++) {
- CatalogTableColumnDescriptor col = columns.get(i);
- columnToIndex.put(col.name(), i);
- }
-
- return columnToIndex;
- }
-
private static ColumnDescriptorImpl createPartitionVirtualColumn(int
logicalIndex, String partColName, NativeType type) {
return new ColumnDescriptorImpl(
partColName,
@@ -489,11 +473,10 @@ public class SqlSchemaManagerImpl implements
SqlSchemaManager {
IgniteIndex schemaIndex = indexCache.get(indexKey, (x) -> {
RelCollation outputCollation =
IgniteIndex.createIndexCollation(indexDescriptor, table);
- Object2IntMap<String> columnToIndex =
buildColumnToIndexMap(table.columns());
CatalogZoneDescriptor zoneDescriptor =
Objects.requireNonNull(catalog.zone(table.zoneId()));
CatalogSchemaDescriptor schemaDescriptor =
Objects.requireNonNull(catalog.schema(table.schemaId()));
- IgniteDistribution distribution = createDistribution(table,
columnToIndex, schemaDescriptor.name(), zoneDescriptor.name());
+ IgniteDistribution distribution = createDistribution(table,
schemaDescriptor.name(), zoneDescriptor.name());
return createSchemaIndex(
indexDescriptor,
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
index 5afb6934c60..ba01be975ed 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
@@ -39,10 +39,10 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.hasItem;
-import static org.hamcrest.Matchers.hasSize;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -50,6 +50,7 @@ import static
org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import it.unimi.dsi.fastutil.ints.IntList;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDate;
@@ -204,15 +205,7 @@ public class DdlSqlToCommandConverterTest extends
AbstractDdlSqlToCommandConvert
)
);
- assertThat(
- tblDesc.primaryKeyColumnNames(),
- hasSize(1)
- );
-
- assertThat(
- tblDesc.primaryKeyColumnNames(),
- hasItem(Commons.IMPLICIT_PK_COL_NAME)
- );
+ assertThat(tblDesc.primaryKeyColumns(), contains(0));
assertThat(idxEntry.descriptor().indexType(),
is(CatalogIndexDescriptorType.HASH));
}
@@ -242,7 +235,7 @@ public class DdlSqlToCommandConverterTest extends
AbstractDdlSqlToCommandConvert
NewIndexEntry idxEntry = (NewIndexEntry) entries.get(1);
assertThat(idxEntry.descriptor().indexType(),
is(CatalogIndexDescriptorType.SORTED));
- assertThat(tblEntry.descriptor().primaryKeyColumnNames(),
equalTo(List.of("ID")));
+ assertThat(tblEntry.descriptor().primaryKeyColumns(),
equalTo(IntList.of(0)));
assertThat(((CatalogSortedIndexDescriptor)
idxEntry.descriptor()).columns().get(0).collation(), is(collation));
}
@@ -283,7 +276,7 @@ public class DdlSqlToCommandConverterTest extends
AbstractDdlSqlToCommandConvert
assertThat(idxEntry.descriptor().indexType(),
is(CatalogIndexDescriptorType.HASH));
assertThat(idxEntry.descriptor(),
Matchers.instanceOf(CatalogHashIndexDescriptor.class));
- assertThat(tblEntry.descriptor().primaryKeyColumnNames(),
equalTo(List.of("ID")));
+ assertThat(tblEntry.descriptor().primaryKeyColumns(),
equalTo(IntList.of(0)));
}
@Test