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

korlov 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 f265de49261 IGNITE-25454 Sql. Improve printout of distribution in 
EXPLAIN output (#5918)
f265de49261 is described below

commit f265de49261260dc3608c228f66f4c996d6b7d8f
Author: korlov42 <[email protected]>
AuthorDate: Mon Jun 2 14:13:20 2025 +0300

    IGNITE-25454 Sql. Improve printout of distribution in EXPLAIN output (#5918)
---
 .../sql/group1/explain/exchange.test               | 106 ++++++++
 .../integrationTest/sql/group1/explain/modify.test |  29 +--
 .../internal/sql/engine/externalize/RelJson.java   |   4 +-
 .../engine/rel/explain/RelTreeToTextWriter.java    |  31 ++-
 .../sql/engine/schema/SqlSchemaManagerImpl.java    |  34 ++-
 .../sql/engine/trait/DistributionFunction.java     |  16 +-
 .../sql/engine/trait/IgniteDistributions.java      |  18 +-
 .../sql/engine/type/IgniteTypeFactory.java         |   3 +-
 .../ignite/internal/sql/engine/util/Commons.java   |  66 -----
 .../apache/ignite/internal/sql/engine/TestRow.java | 280 ---------------------
 .../sql/engine/exec/ExecutionServiceImplTest.java  |   3 +-
 .../sql/engine/exec/PartitionProvidersTest.java    |   7 +-
 .../sql/engine/exec/PartitionsResolutionTest.java  |   2 +-
 .../engine/exec/mapping/FragmentMappingTest.java   |   6 +-
 .../sql/engine/framework/TestBuilders.java         |  34 +++
 .../planner/AbstractAggregatePlannerTest.java      |   5 +-
 .../sql/engine/planner/AbstractPlannerTest.java    |   3 +-
 .../sql/engine/planner/DmlPlannerTest.java         |  12 +-
 .../planner/IdentityDistributionPlannerTest.java   |   4 +-
 .../engine/planner/JoinColocationPlannerTest.java  |   9 +-
 .../sql/engine/planner/LimitOffsetPlannerTest.java |   2 +-
 .../planner/PartitionPruningMetadataTest.java      |  19 +-
 .../sql/engine/planner/PartitionPruningTest.java   |  23 +-
 .../internal/sql/engine/planner/PlannerTest.java   |   8 +-
 .../sql/engine/planner/SetOpPlannerTest.java       |  12 +-
 .../pruning/PartitionPruningPredicateSelfTest.java |   5 +-
 .../engine/schema/SqlSchemaManagerImplTest.java    |   7 +-
 .../src/test/resources/tpcds/plan/q64.plan         |   4 +-
 28 files changed, 284 insertions(+), 468 deletions(-)

diff --git 
a/modules/sql-engine/src/integrationTest/sql/group1/explain/exchange.test 
b/modules/sql-engine/src/integrationTest/sql/group1/explain/exchange.test
new file mode 100644
index 00000000000..783375aa25e
--- /dev/null
+++ b/modules/sql-engine/src/integrationTest/sql/group1/explain/exchange.test
@@ -0,0 +1,106 @@
+statement ok
+CREATE TABLE test_table (c1 INT PRIMARY KEY, c2 INT, c3 INT);
+
+# exchange with `single` and `table` distribution
+plan
+INSERT INTO test_table SELECT x, x, x FROM system_range(1, 10);
+----
+Project
+    fieldNames: [ROWCOUNT]
+    projection: [CAST($f0):BIGINT NOT NULL]
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [$f0]
+      group: []
+      aggregation: [$SUM0(ROWCOUNT)]
+      est: (rows=1)
+    Exchange
+        distribution: single
+        est: (rows=100)
+      TableModify
+          table: PUBLIC.TEST_TABLE
+          fieldNames: [ROWCOUNT]
+          type: INSERT
+          est: (rows=100)
+        Exchange
+            distribution: table PUBLIC.TEST_TABLE in zone "Default" by [C1]
+            est: (rows=100)
+          Project
+              fieldNames: [C1, C2, C3]
+              projection: [CAST(X):INTEGER NOT NULL, CAST(X):INTEGER NOT NULL, 
CAST(X):INTEGER NOT NULL]
+              est: (rows=100)
+            TableFunctionScan
+                fieldNames: [X]
+                invocation: SYSTEM_RANGE(1, 10)
+                est: (rows=100)
+
+# exchange with `identity` distribution
+plan
+SELECT 1
+  FROM system.sql_queries sq 
+  JOIN (SELECT rand_uuid()::varchar || x::varchar as node_name FROM (VALUES 
(1), (2)) ids(x)) as nodes
+    ON nodes.node_name = sq.initiator_node
+   AND QUERY_ID BETWEEN 1 AND 4;
+----
+Exchange
+    distribution: single
+    est: (rows=8)
+  Project
+      fieldNames: [EXPR$0]
+      projection: [1]
+      est: (rows=8)
+    HashJoin
+        predicate: =(NODE_NAME, INITIATOR_NODE)
+        type: inner
+        est: (rows=8)
+      SystemViewScan
+          table: SYSTEM.SQL_QUERIES
+          predicate: SEARCH(CAST(QUERY_ID):INTEGER, Sarg[[1..4]])
+          fieldNames: [INITIATOR_NODE, QUERY_ID]
+          est: (rows=25)
+      Exchange
+          distribution: identity by [NODE_NAME]
+          est: (rows=2)
+        Project
+            fieldNames: [NODE_NAME]
+            projection: [||(CAST(RAND_UUID()):VARCHAR CHARACTER SET "UTF-8" 
NOT NULL, CAST(X):VARCHAR CHARACTER SET "UTF-8" NOT NULL)]
+            est: (rows=2)
+          Values
+              fieldNames: [X]
+              tuples: [[1], [2]]
+              est: (rows=2)
+
+# trim exchange with table distribution (the only option)
+
+# first, let's create new table with complex colocation key.
+# Not really needed for this case, but it would be nice to check multi-column 
colocation key too.
+statement ok
+CREATE TABLE another_table (c1 INT, c2 INT, c3 INT, c4 INT, primary key (c1, 
c2, c3)) COLOCATE BY (c3, c1);
+
+plan
+INSERT INTO another_table VALUES (0, 0, 0, 0), (1, 1, 1, 1), (2, 2, 2, 2);
+----
+Project
+    fieldNames: [ROWCOUNT]
+    projection: [CAST($f0):BIGINT NOT NULL]
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [$f0]
+      group: []
+      aggregation: [$SUM0(ROWCOUNT)]
+      est: (rows=1)
+    Exchange
+        distribution: single
+        est: (rows=3)
+      TableModify
+          table: PUBLIC.ANOTHER_TABLE
+          fieldNames: [ROWCOUNT]
+          type: INSERT
+          est: (rows=3)
+        TrimExchange
+            distribution: table PUBLIC.ANOTHER_TABLE in zone "Default" by [C3, 
C1]
+            est: (rows=3)
+          Values
+              fieldNames: [C1, C2, C3, C4]
+              tuples: [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2]]
+              est: (rows=3)
diff --git 
a/modules/sql-engine/src/integrationTest/sql/group1/explain/modify.test 
b/modules/sql-engine/src/integrationTest/sql/group1/explain/modify.test
index 20244004a21..0b489fbd353 100644
--- a/modules/sql-engine/src/integrationTest/sql/group1/explain/modify.test
+++ b/modules/sql-engine/src/integrationTest/sql/group1/explain/modify.test
@@ -34,12 +34,6 @@ KeyValueModify
     type: INSERT
     est: (rows=1)
 
-# https://issues.apache.org/jira/browse/IGNITE-25454
-# at the moment, distribution's printout depends on the state of the catalog 
because
-# it contains ids of table and zone. This makes the test unstable depending on 
whether
-# how many catalog objects were created prior to this script. We need to change
-# the way how distribution is rendered in the EXPLAIN output and unmute this 
test.
-skipif ignite3
 # insert multiple tuples with literals
 plan
 INSERT INTO test_table VALUES (1, 2, 3), (2, 2, 3)
@@ -62,19 +56,13 @@ Project
           type: INSERT
           est: (rows=2)
         TrimExchange
-            distribution: affinity[tableId=18, zoneId=18][0]
+            distribution: table PUBLIC.TEST_TABLE in zone "Default" by [C1]
             est: (rows=2)
           Values
               fieldNames: [C1, C2, C3]
               tuples: [[1, 2, 3], [2, 2, 3]]
               est: (rows=2)
 
-# https://issues.apache.org/jira/browse/IGNITE-25454
-# at the moment, distribution's printout depends on the state of the catalog 
because
-# it contains ids of table and zone. This makes the test unstable depending on 
whether
-# how many catalog objects were created prior to this script. We need to change
-# the way how distribution is rendered in the EXPLAIN output and unmute this 
test.
-skipif ignite3
 # insert multiple tuples mixed
 plan
 INSERT INTO test_table VALUES (1, LENGTH(rand_uuid()::VARCHAR), 3), (2, 
LENGTH(rand_uuid()::VARCHAR), 3)
@@ -99,7 +87,7 @@ Project
         UnionAll
             est: (rows=2)
           Exchange
-              distribution: affinity[tableId=18, zoneId=18][0]
+              distribution: table PUBLIC.TEST_TABLE in zone "Default" by 
[EXPR$0]
               est: (rows=1)
             Project
                 fieldNames: [EXPR$0, EXPR$1, EXPR$2]
@@ -110,7 +98,7 @@ Project
                   tuples: [[0]]
                   est: (rows=1)
           Exchange
-              distribution: affinity[tableId=18, zoneId=18][0]
+              distribution: table PUBLIC.TEST_TABLE in zone "Default" by 
[EXPR$0]
               est: (rows=1)
             Project
                 fieldNames: [EXPR$0, EXPR$1, EXPR$2]
@@ -287,12 +275,6 @@ Project
             projection: [C1, C2, C3, 2]
             est: (rows=1)
 
-# https://issues.apache.org/jira/browse/IGNITE-25454
-# at the moment, distribution's printout depends on the state of the catalog 
because
-# it contains ids of table and zone. This makes the test unstable depending on 
whether
-# how many catalog objects were created prior to this script. We need to change
-# the way how distribution is rendered in the EXPLAIN output and unmute this 
test.
-skipif ignite3
 # merge operator
 plan
 MERGE INTO test_table dst
@@ -319,7 +301,7 @@ Project
           type: MERGE
           est: (rows=1)
         Exchange
-            distribution: affinity[tableId=18, zoneId=18][0]
+            distribution: table PUBLIC.TEST_TABLE in zone "Default" by [$f0]
             est: (rows=1)
           Project
               fieldNames: [$f0, $f1, $f2, C10, C20, C30, $f6]
@@ -327,6 +309,7 @@ Project
               est: (rows=1)
             HashJoin
                 predicate: =(C1, $f3)
+                fieldNames: [C1, C2, C3, C20, $f3]
                 type: right
                 est: (rows=1)
               TableScan
@@ -334,7 +317,7 @@ Project
                   fieldNames: [C1, C2, C3]
                   est: (rows=1)
               Exchange
-                  distribution: affinity[tableId=18, zoneId=18][1]
+                  distribution: table PUBLIC.TEST_TABLE in zone "Default" by 
[$f3]
                   est: (rows=1)
                 TableScan
                     table: PUBLIC.TEST_TABLE
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
index 755a6014a97..e6af5c0bdd0 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
@@ -545,6 +545,7 @@ class RelJson {
                 if (function.affinity()) {
                     map.put("zoneId", ((AffinityDistribution) 
function).zoneId());
                     map.put("tableId", ((AffinityDistribution) 
function).tableId());
+                    map.put("label", ((AffinityDistribution) 
function).label());
                 }
 
                 return map;
@@ -698,8 +699,9 @@ class RelJson {
 
                 int tableId = (int) map.get("tableId");
                 int zoneId = (int) map.get("zoneId");
+                String label = (String) map.get("label");
 
-                return IgniteDistributions.affinity(keys, tableId, zoneId);
+                return IgniteDistributions.affinity(keys, tableId, zoneId, 
label);
             }
         }
     }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/explain/RelTreeToTextWriter.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/explain/RelTreeToTextWriter.java
index d8af939ab78..5ff24e62a5a 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/explain/RelTreeToTextWriter.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/explain/RelTreeToTextWriter.java
@@ -49,6 +49,7 @@ import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.ignite.internal.sql.engine.prepare.bounds.SearchBounds;
 import org.apache.ignite.internal.sql.engine.rel.IgniteRel;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
+import 
org.apache.ignite.internal.sql.engine.trait.DistributionFunction.AffinityDistribution;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.lang.util.IgniteNameUtils;
@@ -216,7 +217,7 @@ class RelTreeToTextWriter {
 
         @Override
         public IgniteRelWriter addDistribution(IgniteDistribution 
distribution, RelDataType rowType) {
-            attributes.put(AttributeName.DISTRIBUTION, 
distribution.toString());
+            attributes.put(AttributeName.DISTRIBUTION, 
beautifyDistribution(distribution, rowType));
 
             return this;
         }
@@ -433,6 +434,34 @@ class RelTreeToTextWriter {
         }).collect(Collectors.toList());
     }
 
+    private static String beautifyDistribution(IgniteDistribution 
distribution, RelDataType rowType) {
+        StringBuilder sb = new StringBuilder();
+        if (distribution.function().affinity()) {
+            sb.append(((AffinityDistribution) 
distribution.function()).label());
+        } else {
+            sb.append(distribution.function().name());
+        }
+
+        if (!distribution.getKeys().isEmpty()) {
+            sb.append(" by [");
+
+            boolean shouldAppendComma = false;
+            for (int idx : distribution.getKeys()) {
+                if (shouldAppendComma) {
+                    sb.append(", ");
+                }
+
+                sb.append(rowType.getFieldNames().get(idx));
+
+                shouldAppendComma = true;
+            }
+
+            sb.append(']');
+        }
+
+        return sb.toString();
+    }
+
     private RelTreeToTextWriter() {
         throw new AssertionError("Should not be called");
     }
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 95b2f5dc07f..da7de7c1b0c 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
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine.schema;
 
 import static 
org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus.AVAILABLE;
+import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static 
org.apache.ignite.internal.lang.IgniteSystemProperties.enabledColocation;
 import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
@@ -28,6 +29,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -68,6 +70,8 @@ import org.apache.ignite.internal.sql.engine.util.cache.Cache;
 import org.apache.ignite.internal.sql.engine.util.cache.CacheFactory;
 import org.apache.ignite.internal.type.NativeTypes;
 import org.apache.ignite.lang.ErrorGroups.Common;
+import org.apache.ignite.lang.util.IgniteNameUtils;
+import org.apache.ignite.table.QualifiedNameHelper;
 
 /**
  * Implementation of {@link SqlSchemaManager} backed by {@link CatalogService}.
@@ -185,7 +189,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
             long tableKey = cacheKey(tableDescriptor.id(), 
tableDescriptor.tableVersion());
 
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (x) -> {
-                TableDescriptor descriptor = 
createTableDescriptorForTable(tableDescriptor);
+                TableDescriptor descriptor = 
createTableDescriptorForTable(catalog, tableDescriptor);
                 return createTableDataOnlyTable(catalog, tableDescriptor, 
descriptor);
             });
 
@@ -228,7 +232,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
             // Load cached table by (id, version)
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (k) -> {
-                TableDescriptor descriptor = 
createTableDescriptorForTable(tableDescriptor);
+                TableDescriptor descriptor = 
createTableDescriptorForTable(catalog, tableDescriptor);
                 return createTableDataOnlyTable(catalog, tableDescriptor, 
descriptor);
             });
 
@@ -280,7 +284,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         );
     }
 
-    private static TableDescriptor 
createTableDescriptorForTable(CatalogTableDescriptor descriptor) {
+    private static TableDescriptor createTableDescriptorForTable(Catalog 
catalog, CatalogTableDescriptor descriptor) {
         List<CatalogTableColumnDescriptor> columns = descriptor.columns();
         List<ColumnDescriptor> colDescriptors = new ArrayList<>(columns.size() 
+ 2);
         Object2IntMap<String> columnToIndex = buildColumnToIndexMap(columns);
@@ -305,12 +309,16 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         colDescriptors.add(createPartitionVirtualColumn(columns.size(), 
Commons.PART_COL_NAME));
         colDescriptors.add(createPartitionVirtualColumn(columns.size() + 1, 
Commons.PART_COL_NAME_LEGACY));
 
-        IgniteDistribution distribution = createDistribution(descriptor, 
columnToIndex);
+        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());
 
         return new TableDescriptorImpl(colDescriptors, distribution);
     }
 
-    private static IgniteDistribution 
createDistribution(CatalogTableDescriptor descriptor, Object2IntMap<String> 
columnToIndex) {
+    private static IgniteDistribution createDistribution(
+            CatalogTableDescriptor descriptor, Object2IntMap<String> 
columnToIndex, String schemaName, String zoneName
+    ) {
         List<Integer> colocationColumns = 
descriptor.colocationColumns().stream()
                 .map(columnToIndex::getInt)
                 .collect(Collectors.toList());
@@ -321,9 +329,16 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         // TODO https://issues.apache.org/jira/browse/IGNITE-22522 Remove flag
         boolean zoneBasedColocation = enabledColocation();
 
+        String label = affinityDistributionLabel(schemaName, 
descriptor.name(), zoneName);
+
         return zoneBasedColocation
-                ? IgniteDistributions.affinity(colocationColumns, tableId, 
zoneId)
-                : IgniteDistributions.affinity(colocationColumns, tableId, 
tableId);
+                ? IgniteDistributions.affinity(colocationColumns, tableId, 
zoneId, label)
+                : IgniteDistributions.affinity(colocationColumns, tableId, 
tableId, label);
+    }
+
+    private static String affinityDistributionLabel(String schemaName, String 
tableName, String zoneName) {
+        return format("table {} in zone {}",
+                QualifiedNameHelper.fromNormalized(schemaName, 
tableName).toCanonicalForm(), IgniteNameUtils.quoteIfNeeded(zoneName)); 
     }
 
     private static Object2IntMap<String> 
buildColumnToIndexMap(List<CatalogTableColumnDescriptor> columns) {
@@ -480,7 +495,10 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
             IgniteIndex schemaIndex = indexCache.get(indexKey, (x) -> {
                 RelCollation outputCollation = 
IgniteIndex.createIndexCollation(indexDescriptor, table);
                 Object2IntMap<String> columnToIndex = 
buildColumnToIndexMap(table.columns());
-                IgniteDistribution distribution = createDistribution(table, 
columnToIndex);
+
+                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());
 
                 return createSchemaIndex(
                         indexDescriptor,
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/DistributionFunction.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/DistributionFunction.java
index f0931f87bb3..13292655ced 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/DistributionFunction.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/DistributionFunction.java
@@ -52,8 +52,8 @@ public abstract class DistributionFunction {
         return false;
     }
 
-    public static DistributionFunction affinity(int tableId, int zoneId) {
-        return new AffinityDistribution(tableId, zoneId);
+    public static DistributionFunction affinity(int tableId, int zoneId, 
String label) {
+        return new AffinityDistribution(tableId, zoneId, label);
     }
 
     /**
@@ -185,15 +185,19 @@ public abstract class DistributionFunction {
 
         private final int zoneId;
 
+        private final String label;
+
         /**
          * Constructor.
          *
          * @param tableId Table ID.
-         * @param zoneId  Distribution zone ID.
+         * @param zoneId Distribution zone ID.
+         * @param label Human-readable label to show in EXPLAIN printout.
          */
-        private AffinityDistribution(int tableId, int zoneId) {
+        private AffinityDistribution(int tableId, int zoneId, String label) {
             this.zoneId = zoneId;
             this.tableId = tableId;
+            this.label = label;
         }
 
         /** {@inheritDoc} */
@@ -210,6 +214,10 @@ public abstract class DistributionFunction {
             return zoneId;
         }
 
+        public String label() {
+            return label;
+        }
+
         /** {@inheritDoc} */
         @Override
         protected String name0() {
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
index 7090d7f5a9c..4fadbfbed90 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
@@ -64,19 +64,6 @@ public class IgniteDistributions {
         return BROADCAST;
     }
 
-    /**
-     * Creates an affinity distribution that takes into account the zone ID 
and calculates the destinations
-     * based on a hash function which takes into account the key field types 
of the row.
-     *
-     * @param key     Affinity key ordinal.
-     * @param tableId Table ID.
-     * @param zoneId  Distribution zone ID.
-     * @return Affinity distribution.
-     */
-    public static IgniteDistribution affinity(int key, int tableId, int 
zoneId) {
-        return hash(ImmutableIntList.of(key), 
DistributionFunction.affinity(tableId, zoneId));
-    }
-
     /**
      * Creates an affinity distribution that takes into account the zone ID 
and calculates the destinations
      * based on a hash function which takes into account the key field types 
of the row.
@@ -84,10 +71,11 @@ public class IgniteDistributions {
      * @param keys Affinity keys ordinals. Should not be null or empty.
      * @param tableId Table ID.
      * @param zoneId  Distribution zone ID.
+     * @param label Human-readable label to show in EXPLAIN printout.
      * @return Affinity distribution.
      */
-    public static IgniteDistribution affinity(List<Integer> keys, int tableId, 
int zoneId) {
-        return hash(keys, DistributionFunction.affinity(tableId, zoneId));
+    public static IgniteDistribution affinity(List<Integer> keys, int tableId, 
int zoneId, String label) {
+        return hash(keys, DistributionFunction.affinity(tableId, zoneId, 
label));
     }
 
     /**
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
index 27ebd30c7d7..75130e23d22 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
@@ -56,7 +56,6 @@ import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.IntervalSqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.type.SqlTypeUtil;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.IgniteCustomAssignmentsRules;
 import org.apache.ignite.internal.type.NativeType;
 import org.apache.ignite.internal.type.NativeTypes;
@@ -403,7 +402,7 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
                     if (type instanceof IgniteCustomType) {
                         var customType = (IgniteCustomType) type;
                         var nativeType = customType.spec().nativeType();
-                        return Commons.nativeTypeToClass(nativeType);
+                        return nativeType.spec().javaClass();
                     }
                     // fallthrough
                 case OTHER:
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index 87abc53e13f..59aac9910b2 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -32,11 +32,6 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import java.io.StringReader;
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -48,7 +43,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -568,66 +562,6 @@ public final class Commons {
         }
     }
 
-    /**
-     * Provide mapping Native types to java classes.
-     *
-     * @param type Native type
-     * @return Java corresponding class.
-     */
-    public static Class<?> nativeTypeToClass(NativeType type) {
-        assert type != null;
-
-        switch (type.spec()) {
-            case BOOLEAN:
-                return Boolean.class;
-
-            case INT8:
-                return Byte.class;
-
-            case INT16:
-                return Short.class;
-
-            case INT32:
-                return Integer.class;
-
-            case INT64:
-                return Long.class;
-
-            case FLOAT:
-                return Float.class;
-
-            case DOUBLE:
-                return Double.class;
-
-            case DECIMAL:
-                return BigDecimal.class;
-
-            case UUID:
-                return UUID.class;
-
-            case STRING:
-                return String.class;
-
-            case BYTE_ARRAY:
-                return byte[].class;
-
-            case DATE:
-                return LocalDate.class;
-
-            case TIME:
-                return LocalTime.class;
-
-            case DATETIME:
-                return LocalDateTime.class;
-
-            case TIMESTAMP:
-                return Instant.class;
-
-            default:
-                throw new IllegalArgumentException("Unsupported type " + 
type.spec());
-        }
-    }
-
     /**
      * Gets the precision of this type. Returns {@link 
ColumnMetadata#UNDEFINED_PRECISION} if
      * precision is not applicable for this type.
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/TestRow.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/TestRow.java
deleted file mode 100644
index 8b957e36930..00000000000
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/TestRow.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.sql.engine;
-
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.sql.ResultSetMetadata;
-import org.apache.ignite.sql.SqlRow;
-
-/**
- * Dummy table storage implementation.
- */
-class TestRow implements SqlRow {
-    /**
-     * Columns values.
-     */
-    private final Map<String, Object> map = new HashMap<>();
-
-    /** {@inheritDoc} */
-    @Override
-    public TestRow set(String columnName, Object value) {
-        map.put(columnName, value);
-
-        return this;
-    }
-
-    public SqlRow build() {
-        return this;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public <T> T valueOrDefault(String columnName, T def) {
-        return (T) map.getOrDefault(columnName, def);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public <T> T value(String columnName) {
-        return (T) map.get(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public <T> T value(int columnIndex) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int columnCount() {
-        return map.size();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String columnName(int columnIndex) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int columnIndex(String columnName) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean booleanValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean booleanValue(int columnIndex) {
-        return false;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public byte byteValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public byte byteValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public short shortValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public short shortValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int intValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int intValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public long longValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public long longValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public float floatValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public float floatValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public double doubleValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public double doubleValue(int columnIndex) {
-        return 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public BigDecimal decimalValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public BigDecimal decimalValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String stringValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String stringValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public byte[] bytesValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public byte[] bytesValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public UUID uuidValue(String columnName) {
-        return value(columnName);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public UUID uuidValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalDate dateValue(String columnName) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalDate dateValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalTime timeValue(String columnName) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalTime timeValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalDateTime datetimeValue(String columnName) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public LocalDateTime datetimeValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Instant timestampValue(String columnName) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Instant timestampValue(int columnIndex) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Iterator<Object> iterator() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public ResultSetMetadata metadata() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index 5e2901c1fff..11f209b50f1 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -135,7 +135,6 @@ import 
org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.sql.ParsedResult;
 import org.apache.ignite.internal.sql.engine.sql.ParserService;
 import org.apache.ignite.internal.sql.engine.sql.ParserServiceImpl;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.tx.QueryTransactionContext;
 import org.apache.ignite.internal.sql.engine.tx.QueryTransactionWrapper;
 import org.apache.ignite.internal.sql.engine.util.Commons;
@@ -204,7 +203,7 @@ public class ExecutionServiceImplTest extends 
BaseIgniteAbstractTest {
             .name("TEST_TBL")
             .addKeyColumn("ID", NativeTypes.INT32)
             .addColumn("VAL", NativeTypes.INT32)
-            .distribution(IgniteDistributions.affinity(0, 1, 2))
+            .distribution(TestBuilders.affinity(0, 1, 2))
             
.hashIndex().name("TEST_TBL_PK").addColumn("ID").primaryKey(true).end()
             .size(1_000_000)
             .build();
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
index 395c28be8e7..bc1741d09de 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
@@ -39,7 +39,6 @@ import 
org.apache.ignite.internal.sql.engine.framework.TestBuilders;
 import 
org.apache.ignite.internal.sql.engine.prepare.pruning.PartitionPruningColumns;
 import 
org.apache.ignite.internal.sql.engine.prepare.pruning.PartitionPruningMetadata;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.type.NativeTypes;
@@ -76,7 +75,7 @@ public class PartitionProvidersTest extends 
BaseIgniteAbstractTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .partitions(42)
-                .distribution(IgniteDistributions.affinity(List.of(0), 2, 3))
+                .distribution(TestBuilders.affinity(List.of(0), 2, 3))
                 .partitions(assignments.size())
                 .build();
 
@@ -121,7 +120,7 @@ public class PartitionProvidersTest extends 
BaseIgniteAbstractTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .partitions(assignments.size())
-                .distribution(IgniteDistributions.affinity(List.of(0), 2, 3))
+                .distribution(TestBuilders.affinity(List.of(0), 2, 3))
                 .partitions(assignments.size())
                 .build();
 
@@ -165,7 +164,7 @@ public class PartitionProvidersTest extends 
BaseIgniteAbstractTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .partitions(assignments.size())
-                .distribution(IgniteDistributions.affinity(List.of(0), 2, 3))
+                .distribution(TestBuilders.affinity(List.of(0), 2, 3))
                 .partitions(assignments.size())
                 .build();
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionsResolutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionsResolutionTest.java
index 32ce12ede8a..0240546e205 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionsResolutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionsResolutionTest.java
@@ -110,6 +110,6 @@ public class PartitionsResolutionTest {
 
         RelDataType rowType =  rowTypeBuilder.build();
 
-        return new TestTableDescriptor(() -> 
IgniteDistributions.affinity(distrKeys, 1, 1), rowType);
+        return new TestTableDescriptor(() -> 
IgniteDistributions.affinity(distrKeys, 1, 1, "test"), rowType);
     }
 }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMappingTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMappingTest.java
index f2fc7cceada..7eb5c0233ea 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMappingTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMappingTest.java
@@ -286,7 +286,7 @@ public class FragmentMappingTest extends 
AbstractPlannerTest {
         tables.put(
                 tableName,
                 new Pair<>(
-                        IgniteDistributions.affinity(-1, -1, -1),
+                        TestBuilders.affinity(-1, -1, -1),
                         nodeNames.stream()
                                 .map(List::of)
                                 .collect(Collectors.toList())
@@ -304,7 +304,7 @@ public class FragmentMappingTest extends 
AbstractPlannerTest {
         tables.put(
                 tableName,
                 new Pair<>(
-                        IgniteDistributions.affinity(-1, -1, -1),
+                        TestBuilders.affinity(-1, -1, -1),
                         assignments
                 )
         );
@@ -393,7 +393,7 @@ public class FragmentMappingTest extends 
AbstractPlannerTest {
 
             IgniteDistribution distributionToUse;
             if (distribution.function() instanceof AffinityDistribution) {
-                distributionToUse = IgniteDistributions.affinity(0, objectId, 
objectId);
+                distributionToUse = TestBuilders.affinity(0, objectId, 
objectId);
             } else {
                 distributionToUse = distribution;
             }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
index 0e7e5a97fe0..fff710fe71f 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
@@ -132,6 +132,7 @@ import 
org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptorImpl;
 import org.apache.ignite.internal.sql.engine.sql.ParserServiceImpl;
 import org.apache.ignite.internal.sql.engine.statistic.SqlStatisticManager;
+import org.apache.ignite.internal.sql.engine.trait.DistributionFunction;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.util.Commons;
@@ -343,6 +344,39 @@ public class TestBuilders {
         };
     }
 
+    /**
+     * Creates an affinity distribution that takes into account the zone ID 
and calculates the destinations
+     * based on a hash function which takes into account the key field types 
of the row.
+     *
+     * @param key Affinity key ordinal.
+     * @param tableId Table ID.
+     * @param zoneId Distribution zone ID.
+     * @return Affinity distribution.
+     */
+    public static IgniteDistribution affinity(int key, int tableId, int 
zoneId) {
+        return IgniteDistributions.hash(
+                ImmutableIntList.of(key),
+                DistributionFunction.affinity(tableId, zoneId, 
affinityDistributionLabel(tableId, zoneId))
+        );
+    }
+
+    /**
+     * Creates an affinity distribution that takes into account the zone ID 
and calculates the destinations
+     * based on a hash function which takes into account the key field types 
of the row.
+     *
+     * @param keys Affinity keys ordinals. Should not be null or empty.
+     * @param tableId Table ID.
+     * @param zoneId  Distribution zone ID.
+     * @return Affinity distribution.
+     */
+    public static IgniteDistribution affinity(List<Integer> keys, int tableId, 
int zoneId) {
+        return IgniteDistributions.affinity(keys, tableId, zoneId, 
affinityDistributionLabel(tableId, zoneId));
+    }
+
+    private static String affinityDistributionLabel(int tableId, int zoneId) {
+        return format("affinity [tableId={}, zoneId={}]", tableId, zoneId);
+    }
+
     /**
      * A builder to create a test cluster object.
      *
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractAggregatePlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractAggregatePlannerTest.java
index 2d459de929b..335e0008cf4 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractAggregatePlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractAggregatePlannerTest.java
@@ -32,6 +32,7 @@ import java.util.function.UnaryOperator;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.sql.fun.SqlSingleValueAggFunction;
+import org.apache.ignite.internal.sql.engine.framework.TestBuilders;
 import 
org.apache.ignite.internal.sql.engine.framework.TestBuilders.TableBuilder;
 import org.apache.ignite.internal.sql.engine.rel.IgniteAggregate;
 import org.apache.ignite.internal.sql.engine.rel.agg.IgniteReduceAggregateBase;
@@ -1029,11 +1030,11 @@ public abstract class AbstractAggregatePlannerTest 
extends AbstractPlannerTest {
     }
 
     private static IgniteDistribution hash() {
-        return IgniteDistributions.affinity(0, nextTableId(), DEFAULT_ZONE_ID);
+        return TestBuilders.affinity(0, nextTableId(), DEFAULT_ZONE_ID);
     }
 
     private static IgniteDistribution hash(int... keys) {
-        return IgniteDistributions.affinity(IntList.of(keys), nextTableId(), 
DEFAULT_ZONE_ID);
+        return TestBuilders.affinity(IntList.of(keys), nextTableId(), 
DEFAULT_ZONE_ID);
     }
 
     private static IgniteDistribution identity() {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractPlannerTest.java
index 9697c56c023..242a67a3dd7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/AbstractPlannerTest.java
@@ -113,7 +113,6 @@ import 
org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.trait.TraitUtils;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.sql.engine.util.Commons;
@@ -180,7 +179,7 @@ public abstract class AbstractPlannerTest extends 
IgniteAbstractTest {
     }
 
     protected static IgniteDistribution someAffinity() {
-        return IgniteDistributions.affinity(0, nextTableId(), DEFAULT_ZONE_ID);
+        return TestBuilders.affinity(0, nextTableId(), DEFAULT_ZONE_ID);
     }
 
     protected static int nextTableId() {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
index 7c3b0516132..b5438ad8b0b 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
@@ -106,7 +106,7 @@ public class DmlPlannerTest extends AbstractPlannerTest {
     @ParameterizedTest
     @MethodSource("distributions")
     public void testInsertSelectFrom(IgniteDistribution distribution) throws 
Exception {
-        IgniteDistribution anotherDistribution = 
IgniteDistributions.affinity(1, 1, 0);
+        IgniteDistribution anotherDistribution = TestBuilders.affinity(1, 1, 
0);
 
         IgniteTable test1 = newTestTable("TEST1", distribution);
         IgniteTable test2 = newTestTable("TEST2", anotherDistribution);
@@ -197,7 +197,7 @@ public class DmlPlannerTest extends AbstractPlannerTest {
         return Stream.of(
                 IgniteDistributions.single(),
                 IgniteDistributions.hash(List.of(0, 1)),
-                IgniteDistributions.affinity(0, 2, 0),
+                TestBuilders.affinity(0, 2, 0),
                 IgniteDistributions.identity(0)
         );
     }
@@ -210,10 +210,10 @@ public class DmlPlannerTest extends AbstractPlannerTest {
     private static Stream<IgniteDistribution> distributionsForDelete() {
         return Stream.of(
                 IgniteDistributions.hash(List.of(1, 3)),
-                IgniteDistributions.affinity(1, 2, 0),
-                IgniteDistributions.affinity(3, 2, 0),
-                IgniteDistributions.affinity(List.of(1, 3), 2, 0),
-                IgniteDistributions.affinity(List.of(3, 1), 2, 0),
+                TestBuilders.affinity(1, 2, 0),
+                TestBuilders.affinity(3, 2, 0),
+                TestBuilders.affinity(List.of(1, 3), 2, 0),
+                TestBuilders.affinity(List.of(3, 1), 2, 0),
                 IgniteDistributions.identity(1)
         );
     }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IdentityDistributionPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IdentityDistributionPlannerTest.java
index 7b922761598..1534e8d4987 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IdentityDistributionPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IdentityDistributionPlannerTest.java
@@ -66,7 +66,7 @@ public class IdentityDistributionPlannerTest extends 
AbstractPlannerTest {
      */
     @Test
     public void joinAffinityTableWithIdentityTable() throws Exception {
-        IgniteDistribution affinityDistribution = 
IgniteDistributions.affinity(0, nextTableId(), 0);
+        IgniteDistribution affinityDistribution = TestBuilders.affinity(0, 
nextTableId(), 0);
 
         IgniteTable tbl1 = simpleTable("TEST_TBL1", 2 * DEFAULT_TBL_SIZE, 
IgniteDistributions.identity(0));
         IgniteTable tbl2 = simpleTable("TEST_TBL2", DEFAULT_TBL_SIZE, 
affinityDistribution);
@@ -93,7 +93,7 @@ public class IdentityDistributionPlannerTest extends 
AbstractPlannerTest {
      */
     @Test
     public void joinIndentityTableWithAffinityTable() throws Exception {
-        IgniteDistribution affinityDistribution = 
IgniteDistributions.affinity(0, nextTableId(), 0);
+        IgniteDistribution affinityDistribution = TestBuilders.affinity(0, 
nextTableId(), 0);
 
         IgniteTable tbl1 = simpleTable("TEST_TBL1", DEFAULT_TBL_SIZE, 
IgniteDistributions.identity(0));
         IgniteTable tbl2 = simpleTable("TEST_TBL2", 2 * DEFAULT_TBL_SIZE, 
affinityDistribution);
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/JoinColocationPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/JoinColocationPlannerTest.java
index 06061a38281..60f3077b6d7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/JoinColocationPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/JoinColocationPlannerTest.java
@@ -39,7 +39,6 @@ import 
org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Collation;
 import org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.type.NativeTypes;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -192,7 +191,7 @@ public class JoinColocationPlannerTest extends 
AbstractPlannerTest {
     @Test
     public void joinComplexToSimpleAff() throws Exception {
         IgniteTable complexTbl = complexTbl("COMPLEX_TBL", 2 * 
DEFAULT_TBL_SIZE,
-                IgniteDistributions.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
+                TestBuilders.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
 
         IgniteTable simpleTbl = simpleTable("SIMPLE_TBL", DEFAULT_TBL_SIZE);
 
@@ -227,12 +226,12 @@ public class JoinColocationPlannerTest extends 
AbstractPlannerTest {
         IgniteTable complexTblDirect = complexTbl(
                 "COMPLEX_TBL_DIRECT",
                 2 * DEFAULT_TBL_SIZE,
-                IgniteDistributions.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
+                TestBuilders.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
 
         IgniteTable complexTblIndirect = complexTbl(
                 "COMPLEX_TBL_INDIRECT",
                 DEFAULT_TBL_SIZE,
-                IgniteDistributions.affinity(ImmutableIntList.of(1, 0), 
nextTableId(), DEFAULT_ZONE_ID));
+                TestBuilders.affinity(ImmutableIntList.of(1, 0), 
nextTableId(), DEFAULT_ZONE_ID));
 
         IgniteSchema schema = createSchema(complexTblDirect, 
complexTblIndirect);
 
@@ -287,7 +286,7 @@ public class JoinColocationPlannerTest extends 
AbstractPlannerTest {
 
     static IgniteTable complexTbl(String tableName) {
         return complexTbl(tableName, DEFAULT_TBL_SIZE,
-                IgniteDistributions.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
+                TestBuilders.affinity(ImmutableIntList.of(0, 1), 
nextTableId(), DEFAULT_ZONE_ID));
     }
 
     private static IgniteTable complexTbl(String tableName, int size, 
IgniteDistribution distribution) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java
index 776124ecb1d..e844676cbf9 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java
@@ -249,7 +249,7 @@ public class LimitOffsetPlannerTest extends 
AbstractPlannerTest {
                 .addKeyColumn("ID", NativeTypes.INT32)
                 .addColumn("A", NativeTypes.INT32)
                 .size(ROW_CNT)
-                .distribution(IgniteDistributions.affinity(0, 1, 1));
+                .distribution(TestBuilders.affinity(0, 1, 1));
 
         IgniteSchema publicSchema = createSchema(builder.build());
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningMetadataTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningMetadataTest.java
index 8a038dd0d21..9921e0adc9f 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningMetadataTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningMetadataTest.java
@@ -39,7 +39,6 @@ import 
org.apache.ignite.internal.sql.engine.schema.ColumnDescriptor;
 import org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
 import org.apache.ignite.internal.type.NativeTypes;
@@ -57,27 +56,27 @@ public class PartitionPruningMetadataTest extends 
AbstractPlannerTest {
     private static final IgniteSchema TABLE_C1 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.INT32)
             .addColumn("C2", NativeTypes.INT32, false)
-            .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_C1_NULLABLE_C2 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.INT32)
             .addColumn("C2", NativeTypes.INT32, true)
-            .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_C1_C2 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.INT32)
             .addKeyColumn("C2", NativeTypes.INT32)
             .addColumn("C3", NativeTypes.INT32, false)
-            .distribution(IgniteDistributions.affinity(List.of(0, 1), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0, 1), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_C1_C2_NULLABLE_C3 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.INT32)
             .addKeyColumn("C2", NativeTypes.INT32)
             .addColumn("C3", NativeTypes.INT32, true)
-            .distribution(IgniteDistributions.affinity(List.of(0, 1), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0, 1), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_C1_C2_C3 = 
createSchema(TestBuilders.table().name("T")
@@ -85,32 +84,32 @@ public class PartitionPruningMetadataTest extends 
AbstractPlannerTest {
             .addKeyColumn("C2", NativeTypes.INT32)
             .addKeyColumn("C3", NativeTypes.INT32)
             .addColumn("C4", NativeTypes.INT32, false)
-            .distribution(IgniteDistributions.affinity(List.of(0, 1, 2), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0, 1, 2), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_BOOL_C1 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.BOOLEAN)
             .addColumn("C2", NativeTypes.INT32, false)
-            .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_BOOL_C1_C3 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.BOOLEAN)
             .addKeyColumn("C2", NativeTypes.BOOLEAN)
             .addColumn("C3", NativeTypes.INT32, false)
-            .distribution(IgniteDistributions.affinity(List.of(0, 1), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0, 1), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_C1_BOOLS = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.INT32)
             .addColumn("C2", NativeTypes.BOOLEAN, false)
-            .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0), 1, 2))
             .build());
 
     private static final IgniteSchema TABLE_ALL_BOOLS_C1 = 
createSchema(TestBuilders.table().name("T")
             .addKeyColumn("C1", NativeTypes.BOOLEAN)
             .addColumn("C2", NativeTypes.BOOLEAN, false)
-            .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+            .distribution(TestBuilders.affinity(List.of(0), 1, 2))
             .build());
 
     @BeforeAll
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningTest.java
index 4f757e3815f..4a55c24c274 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PartitionPruningTest.java
@@ -34,7 +34,6 @@ import 
org.apache.ignite.internal.sql.engine.rel.SourceAwareIgniteRel;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Collation;
 import org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.type.NativeTypes;
 import org.junit.jupiter.api.Test;
 
@@ -49,7 +48,7 @@ public class PartitionPruningTest extends AbstractPlannerTest 
{
                 .name("T")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         PartitionPruningMetadata actual = extractMetadata(
@@ -68,7 +67,7 @@ public class PartitionPruningTest extends AbstractPlannerTest 
{
                 .name("T")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         PartitionPruningMetadata actual = extractMetadata(
@@ -87,7 +86,7 @@ public class PartitionPruningTest extends AbstractPlannerTest 
{
                 .name("T")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .sortedIndex().name("C1_SORTED")
                 .addColumn("C1", Collation.ASC_NULLS_FIRST)
                 .end()
@@ -109,7 +108,7 @@ public class PartitionPruningTest extends 
AbstractPlannerTest {
                 .name("T")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .sortedIndex().name("C1_SORTED")
                 .addColumn("C1", Collation.ASC_NULLS_FIRST)
                 .end()
@@ -131,14 +130,14 @@ public class PartitionPruningTest extends 
AbstractPlannerTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         IgniteTable table2 = TestBuilders.table()
                 .name("T2")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         PartitionPruningMetadata actual = extractMetadata(
@@ -161,14 +160,14 @@ public class PartitionPruningTest extends 
AbstractPlannerTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         IgniteTable table2 = TestBuilders.table()
                 .name("T2")
                 .addKeyColumn("C1", NativeTypes.STRING)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         PartitionPruningMetadataExtractor extractor = new 
PartitionPruningMetadataExtractor();
@@ -197,7 +196,7 @@ public class PartitionPruningTest extends 
AbstractPlannerTest {
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addKeyColumn("C2", NativeTypes.INT32)
                 .addColumn("C3", NativeTypes.INT32, true)
-                .distribution(IgniteDistributions.affinity(List.of(1, 0), 1, 
2))
+                .distribution(TestBuilders.affinity(List.of(1, 0), 1, 2))
                 .build();
 
         PartitionPruningMetadata actual = extractMetadata(
@@ -216,14 +215,14 @@ public class PartitionPruningTest extends 
AbstractPlannerTest {
                 .name("T1")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32, false)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         IgniteTable table2 = TestBuilders.table()
                 .name("T2")
                 .addKeyColumn("C1", NativeTypes.INT32)
                 .addColumn("C2", NativeTypes.INT32)
-                .distribution(IgniteDistributions.affinity(List.of(0), 1, 2))
+                .distribution(TestBuilders.affinity(List.of(0), 1, 2))
                 .build();
 
         PartitionPruningMetadataExtractor extractor = new 
PartitionPruningMetadataExtractor();
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
index c1d86a7b782..ebf5f69a1b7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTest.java
@@ -226,7 +226,7 @@ public class PlannerTest extends AbstractPlannerTest {
                 .name("TEST")
                 .addColumn("ID", NativeTypes.INT32)
                 .addColumn("VAL", NativeTypes.STRING)
-                .distribution(IgniteDistributions.affinity(0, nextTableId(), 
DEFAULT_ZONE_ID))
+                .distribution(TestBuilders.affinity(0, nextTableId(), 
DEFAULT_ZONE_ID))
                 .build());
 
         String[] queries = {
@@ -254,7 +254,7 @@ public class PlannerTest extends AbstractPlannerTest {
                 .addColumn("COL2", NativeTypes.STRING)
                 .addColumn("COL3", NativeTypes.INT32)
                 .addColumn("COL4", NativeTypes.FLOAT)
-                .distribution(IgniteDistributions.affinity(0, nextTableId(), 
DEFAULT_ZONE_ID))
+                .distribution(TestBuilders.affinity(0, nextTableId(), 
DEFAULT_ZONE_ID))
                 .build());
 
         String sql = "SELECT pk FROM tab0 WHERE (((((col4 < 341.32))) AND col3 
IN (SELECT col0 FROM tab0 WHERE ((col0 > 564) "
@@ -270,13 +270,13 @@ public class PlannerTest extends AbstractPlannerTest {
         IgniteSchema publicSchema = createSchema(
                 TestBuilders.table()
                         .name("PERSON")
-                        .distribution(IgniteDistributions.affinity(0, 
nextTableId(), Integer.MIN_VALUE))
+                        .distribution(TestBuilders.affinity(0, nextTableId(), 
Integer.MIN_VALUE))
                         .addColumn("PK", NativeTypes.INT32)
                         .addColumn("ORG_ID", NativeTypes.INT32)
                         .build(),
                 TestBuilders.table()
                         .name("COMPANY")
-                        .distribution(IgniteDistributions.affinity(0, 
nextTableId(), Integer.MIN_VALUE))
+                        .distribution(TestBuilders.affinity(0, nextTableId(), 
Integer.MIN_VALUE))
                         .addColumn("PK", NativeTypes.INT32)
                         .addColumn("ID", NativeTypes.INT32)
                         .build()
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/SetOpPlannerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/SetOpPlannerTest.java
index b7c1eb7befd..d9bd0604755 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/SetOpPlannerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/SetOpPlannerTest.java
@@ -65,11 +65,11 @@ public class SetOpPlannerTest extends AbstractPlannerTest {
                 createTable("BROADCAST_TBL2", IgniteDistributions.broadcast()),
                 createTable("SINGLE_TBL1", IgniteDistributions.single()),
                 createTable("SINGLE_TBL2", IgniteDistributions.single()),
-                createTable("AFFINITY_TBL1", IgniteDistributions.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)),
+                createTable("AFFINITY_TBL1", TestBuilders.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)),
                 createTable("HASH_TBL1", IgniteDistributions.hash(List.of(0))),
-                createTable("AFFINITY_TBL2", IgniteDistributions.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)),
-                createTable("AFFINITY_TBL3", IgniteDistributions.affinity(1, 
nextTableId(), DEFAULT_ZONE_ID)),
-                createTable("AFFINITY_TBL4", IgniteDistributions.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID + 1)),
+                createTable("AFFINITY_TBL2", TestBuilders.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)),
+                createTable("AFFINITY_TBL3", TestBuilders.affinity(1, 
nextTableId(), DEFAULT_ZONE_ID)),
+                createTable("AFFINITY_TBL4", TestBuilders.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID + 1)),
                 createTable("IDENTITY_TBL1", IgniteDistributions.identity(0)),
                 createTable("IDENTITY_TBL2", IgniteDistributions.identity(0)),
                 createTable("IDENTITY_TBL3", IgniteDistributions.identity(1))
@@ -270,7 +270,7 @@ public class SetOpPlannerTest extends AbstractPlannerTest {
 
         assertPlan(sql, publicSchema, isInstanceOf(IgniteExchange.class)
                 .and(input(isInstanceOf(setOp.colocated)
-                        .and(hasDistribution(IgniteDistributions.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)))
+                        .and(hasDistribution(TestBuilders.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)))
                         .and(input(0, isTableScan("affinity_tbl1")))
                         .and(input(1, isTableScan("affinity_tbl2")))
                 ))
@@ -294,7 +294,7 @@ public class SetOpPlannerTest extends AbstractPlannerTest {
 
         assertPlan(sql, publicSchema, isInstanceOf(IgniteExchange.class)
                 .and(input(isInstanceOf(setOp.colocated)
-                        .and(hasDistribution(IgniteDistributions.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)))
+                        .and(hasDistribution(TestBuilders.affinity(0, 
nextTableId(), DEFAULT_ZONE_ID)))
                         .and(input(0, isTableScan("affinity_tbl1")))
                         .and(input(1, isInstanceOf(IgniteTrimExchange.class)
                                 .and(input(isTableScan("broadcast_tbl1")))
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
index e95a96bdccf..5aec33956ca 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
@@ -44,7 +44,6 @@ import 
org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.schema.PartitionCalculator;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
-import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeSystem;
 import org.apache.ignite.internal.sql.engine.util.Commons;
@@ -84,7 +83,7 @@ public class PartitionPruningPredicateSelfTest extends 
BaseIgniteAbstractTest {
         //  because it allows to support CAST('uuid-str' AS UUID) expressions.
         Assumptions.assumeFalse(columnType == ColumnType.UUID);
 
-        IgniteDistribution distribution = 
IgniteDistributions.affinity(List.of(0), 1, 1);
+        IgniteDistribution distribution = TestBuilders.affinity(List.of(0), 1, 
1);
 
         NativeType nativeType = getNativeType(columnType);
 
@@ -131,7 +130,7 @@ public class PartitionPruningPredicateSelfTest extends 
BaseIgniteAbstractTest {
     @ParameterizedTest
     @MethodSource("columnTypes")
     public void testDynamicParam(ColumnType columnType) {
-        IgniteDistribution distribution = 
IgniteDistributions.affinity(List.of(0), 1, 1);
+        IgniteDistribution distribution = TestBuilders.affinity(List.of(0), 1, 
1);
 
         NativeType nativeType = getNativeType(columnType);
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
index f3fa8f4f677..4b73b5f81ac 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
@@ -82,6 +82,7 @@ import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.manager.ComponentContext;
 import org.apache.ignite.internal.schema.DefaultValueGenerator;
+import org.apache.ignite.internal.sql.engine.framework.TestBuilders;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type;
 import org.apache.ignite.internal.sql.engine.statistic.SqlStatisticManager;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
@@ -473,7 +474,7 @@ public class SqlSchemaManagerImplTest extends 
BaseIgniteAbstractTest {
             IgniteTable table = getTable(unwrapSchema(schemaPlus), "T1");
             IgniteDistribution distribution = 
table.descriptor().distribution();
 
-            assertThat(distribution, equalTo(IgniteDistributions.affinity(
+            assertThat(distribution, equalTo(TestBuilders.affinity(
                     List.of(1),
                     table.id(),
                     enabledColocation() ? table.zoneId() : table.id())));
@@ -483,7 +484,7 @@ public class SqlSchemaManagerImplTest extends 
BaseIgniteAbstractTest {
             IgniteTable table = getTable(unwrapSchema(schemaPlus), "T2");
             IgniteDistribution distribution = 
table.descriptor().distribution();
 
-            assertThat(distribution, equalTo(IgniteDistributions.affinity(
+            assertThat(distribution, equalTo(TestBuilders.affinity(
                     List.of(3, 1),
                     table.id(),
                     enabledColocation() ? table.zoneId() : table.id())));
@@ -493,7 +494,7 @@ public class SqlSchemaManagerImplTest extends 
BaseIgniteAbstractTest {
             IgniteTable table = getTable(unwrapSchema(schemaPlus), "T3");
             IgniteDistribution distribution = 
table.descriptor().distribution();
 
-            assertThat(distribution, equalTo(IgniteDistributions.affinity(
+            assertThat(distribution, equalTo(TestBuilders.affinity(
                     List.of(2, 1, 0),
                     table.id(),
                     enabledColocation() ? table.zoneId() : table.id())));
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan 
b/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
index 04cdf2ea539..0e17eaecf11 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
@@ -207,7 +207,7 @@ Sort
                                                           fieldNames: 
[CS_ITEM_SK, CS_ORDER_NUMBER, CS_EXT_LIST_PRICE]
                                                           est: (rows=1441548)
                                                       Exchange
-                                                          distribution: 
affinity[tableId=51, zoneId=51][0, 1]
+                                                          distribution: table 
PUBLIC.CATALOG_SALES in zone "Default" by [CR_ITEM_SK, CR_ORDER_NUMBER]
                                                           est: (rows=144067)
                                                         TableScan
                                                             table: 
PUBLIC.CATALOG_RETURNS
@@ -446,7 +446,7 @@ Sort
                                                           fieldNames: 
[CS_ITEM_SK, CS_ORDER_NUMBER, CS_EXT_LIST_PRICE]
                                                           est: (rows=1441548)
                                                       Exchange
-                                                          distribution: 
affinity[tableId=51, zoneId=51][0, 1]
+                                                          distribution: table 
PUBLIC.CATALOG_SALES in zone "Default" by [CR_ITEM_SK, CR_ORDER_NUMBER]
                                                           est: (rows=144067)
                                                         TableScan
                                                             table: 
PUBLIC.CATALOG_RETURNS

Reply via email to