You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2022/03/10 09:44:49 UTC

[ignite-3] branch main updated: IGNITE-16593 Schema should keep colocation information (#708)

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

tledkov 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 66f5136  IGNITE-16593 Schema should keep colocation information (#708)
66f5136 is described below

commit 66f5136cb16ff988bd0da9b4884762d2b51ced61
Author: Taras Ledkov <tl...@gridgain.com>
AuthorDate: Thu Mar 10 12:44:43 2022 +0300

    IGNITE-16593 Schema should keep colocation information (#708)
---
 .../table/PrimaryKeyConfigurationSchema.java       |  4 +--
 .../schema/definition/PrimaryKeyDefinition.java    |  7 +++--
 .../ignite/schema/definition/TableDefinition.java  |  2 +-
 .../builder/PrimaryKeyDefinitionBuilder.java       | 12 ++++----
 .../runner/app/ItDynamicTableCreationTest.java     |  6 ++--
 .../ignite/internal/schema/SchemaDescriptor.java   | 20 ++++++-------
 .../SchemaConfigurationConverter.java              |  4 +--
 .../configuration/SchemaDescriptorConverter.java   |  2 +-
 .../schema/configuration/TableValidatorImpl.java   |  4 +--
 .../schema/definition/TableDefinitionImpl.java     | 10 +++----
 .../builder/PrimaryKeyDefinitionBuilderImpl.java   | 30 ++++++++-----------
 .../builder/TableDefinitionBuilderImpl.java        | 17 ++++++-----
 .../definition/index/PrimaryKeyDefinitionImpl.java | 28 +++++++++++------
 .../marshaller/schema/SchemaSerializerImpl.java    | 20 ++++++-------
 .../internal/schema/SchemaConfigurationTest.java   | 35 ++++++++++++++++++++--
 .../PrimaryKeyDefinitionDefinitionBuilderTest.java | 20 ++++++-------
 .../SchemaConfigurationConverterTest.java          |  2 +-
 .../SchemaDescriptorConverterTest.java             |  8 ++---
 .../configuration/TableValidatorImplTest.java      |  2 +-
 .../schema/serializer/AbstractSerializerTest.java  |  2 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |  2 +-
 21 files changed, 139 insertions(+), 98 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/PrimaryKeyConfigurationSchema.java b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/PrimaryKeyConfigurationSchema.java
index 792a40a..414874c 100644
--- a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/PrimaryKeyConfigurationSchema.java
+++ b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/PrimaryKeyConfigurationSchema.java
@@ -31,8 +31,8 @@ public class PrimaryKeyConfigurationSchema {
     @Immutable
     public String[] columns;
 
-    /** Primary key affinity columns names. */
+    /** Primary key colocation columns names. */
     @Value(hasDefault = true)
     @Immutable
-    public String[] affinityColumns = new String[0];
+    public String[] colocationColumns = new String[0];
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java b/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java
index e3249f0..9554f5f 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java
+++ b/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.schema.definition;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -34,9 +35,9 @@ public interface PrimaryKeyDefinition extends SchemaObject {
     Set<String> columns();
 
     /**
-     * Returns affinity columns.
+     * Returns colocation columns.
      *
-     * @return Affinity columns.
+     * @return Colocation columns.
      */
-    Set<String> affinityColumns();
+    List<String> colocationColumns();
 }
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java b/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java
index 7cf0e95..f82bd45 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java
+++ b/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java
@@ -48,7 +48,7 @@ public interface TableDefinition extends SchemaObject {
      *
      * @return List of columns.
      */
-    Set<String> affinityColumns();
+    List<String> colocationColumns();
 
     /**
      * Returns table columns in user-defined order.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/builder/PrimaryKeyDefinitionBuilder.java b/modules/api/src/main/java/org/apache/ignite/schema/definition/builder/PrimaryKeyDefinitionBuilder.java
index d78873c..ff4ab00 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/builder/PrimaryKeyDefinitionBuilder.java
+++ b/modules/api/src/main/java/org/apache/ignite/schema/definition/builder/PrimaryKeyDefinitionBuilder.java
@@ -25,20 +25,20 @@ import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
  */
 public interface PrimaryKeyDefinitionBuilder extends SchemaObjectBuilder {
     /**
-     * Sets affinity columns.
+     * Sets colocation columns.
      *
-     * @param cols Affinity columns. Must be a valid subset of key columns.
+     * @param cols Colocation columns. Must be a valid subset of key columns.
      * @return Primary index builder.
      */
-    PrimaryKeyDefinitionBuilder withAffinityColumns(String... cols);
+    PrimaryKeyDefinitionBuilder withColocationColumns(String... cols);
 
     /**
-     * Sets affinity columns.
+     * Sets colocation columns.
      *
-     * @param cols Affinity columns. Must be a valid subset of key columns.
+     * @param cols Colocation columns. Must be a valid subset of key columns.
      * @return Primary index builder.
      */
-    PrimaryKeyDefinitionBuilder withAffinityColumns(List<String> cols);
+    PrimaryKeyDefinitionBuilder withColocationColumns(List<String> cols);
 
     /**
      * Sets primary key columns.
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
index e8d814e..fec8f27 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
@@ -209,7 +209,7 @@ class ItDynamicTableCreationTest {
         ).withPrimaryKey(
                 SchemaBuilders.primaryKey()
                         .withColumns("key", "affKey")
-                        .withAffinityColumns("affKey")
+                        .withColocationColumns("affKey")
                         .build()
         ).build();
 
@@ -353,7 +353,7 @@ class ItDynamicTableCreationTest {
                                     cols.create("1",
                                             col -> col.changeName("val").changeNullable(true).changeType(t -> t.changeType("INT32")));
                                 })
-                                .changePrimaryKey(pk -> pk.changeAffinityColumns("key"))
+                                .changePrimaryKey(pk -> pk.changeColocationColumns("key"))
                                 .changeReplicas(1)
                                 .changePartitions(10)
                 );
@@ -381,7 +381,7 @@ class ItDynamicTableCreationTest {
 
                                     cols.create("1", col -> colChanger.accept(col.changeName("val").changeNullable(true)));
                                 })
-                                .changePrimaryKey(pk -> pk.changeColumns("key").changeAffinityColumns("key"))
+                                .changePrimaryKey(pk -> pk.changeColumns("key").changeColocationColumns("key"))
                                 .changeReplicas(1)
                                 .changePartitions(10)
                 );
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 fc5ffb1..0f316d8 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
@@ -44,8 +44,8 @@ public class SchemaDescriptor {
     /** Value columns in serialization order. */
     private final Columns valCols;
 
-    /** Affinity columns. */
-    private final Column[] affCols;
+    /** Colocation columns. */
+    private final Column[] colocationCols;
 
     /** Mapping 'Column name' -&gt; Column. */
     private final Map<String, Column> colMap;
@@ -69,10 +69,10 @@ public class SchemaDescriptor {
      *
      * @param ver     Schema version.
      * @param keyCols Key columns.
-     * @param affCols Affinity column names.
+     * @param colocationCols Colocation column names.
      * @param valCols Value columns.
      */
-    public SchemaDescriptor(int ver, Column[] keyCols, @Nullable String[] affCols, Column[] valCols) {
+    public SchemaDescriptor(int ver, Column[] keyCols, @Nullable String[] colocationCols, Column[] valCols) {
         assert keyCols.length > 0 : "No key columns are configured.";
 
         this.ver = ver;
@@ -89,8 +89,8 @@ public class SchemaDescriptor {
 
         // Preserving key chunk column order is not actually required.
         // It is sufficient to has same column order for all nodes.
-        this.affCols = (ArrayUtils.nullOrEmpty(affCols)) ? keyCols :
-                Arrays.stream(affCols).map(colMap::get).toArray(Column[]::new);
+        this.colocationCols = (ArrayUtils.nullOrEmpty(colocationCols)) ? keyCols :
+                Arrays.stream(colocationCols).map(colMap::get).toArray(Column[]::new);
     }
 
     /**
@@ -164,12 +164,12 @@ public class SchemaDescriptor {
     }
 
     /**
-     * Get affinity columns.
+     * Get colocation columns.
      *
-     * @return Key affinity columns chunk.
+     * @return Key colocation columns chunk.
      */
-    public Column[] affinityColumns() {
-        return affCols;
+    public Column[] colocationColumns() {
+        return colocationCols;
     }
 
     /**
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java
index 59bd705..0d5ec8c 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java
@@ -230,7 +230,7 @@ public class SchemaConfigurationConverter {
      * @return TableIn.
      */
     public static PrimaryKeyDefinition convert(PrimaryKeyView primaryKey) {
-        return new PrimaryKeyDefinitionImpl(Set.of(primaryKey.columns()), Set.of(primaryKey.affinityColumns()));
+        return new PrimaryKeyDefinitionImpl(Set.of(primaryKey.columns()), List.of(primaryKey.colocationColumns()));
     }
 
     /**
@@ -401,7 +401,7 @@ public class SchemaConfigurationConverter {
 
         tblChg.changePrimaryKey(pkCng -> {
             pkCng.changeColumns(tbl.keyColumns().toArray(String[]::new))
-                    .changeAffinityColumns(tbl.affinityColumns().toArray(String[]::new));
+                    .changeColocationColumns(tbl.colocationColumns().toArray(String[]::new));
         });
 
         return tblChg;
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java
index 48d2c7b..3892301 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java
@@ -186,7 +186,7 @@ public class SchemaDescriptorConverter {
         return new SchemaDescriptor(
                 schemaVer,
                 keyCols.toArray(Column[]::new),
-                tblCfg.affinityColumns().toArray(String[]::new),
+                tblCfg.colocationColumns().toArray(String[]::new),
                 valCols.toArray(Column[]::new));
     }
 
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
index 535ff87..83f4b42 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
@@ -55,9 +55,9 @@ public class TableValidatorImpl implements Validator<TableValidator, NamedListVi
                 TableDefinitionImpl tbl = SchemaConfigurationConverter.convert(newTable);
 
                 assert !tbl.keyColumns().isEmpty();
-                assert !tbl.affinityColumns().isEmpty();
+                assert !tbl.colocationColumns().isEmpty();
 
-                TableDefinitionBuilderImpl.validateIndices(tbl.indices(), tbl.columns(), tbl.affinityColumns());
+                TableDefinitionBuilderImpl.validateIndices(tbl.indices(), tbl.columns(), tbl.colocationColumns());
             } catch (IllegalArgumentException e) {
                 ctx.addIssue(new ValidationIssue("Validator works success by key " + ctx.currentKey() + ". Found "
                         + newTable.columns().size() + " columns"));
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java
index 2e09090..3e8ac14 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java
@@ -50,8 +50,8 @@ public class TableDefinitionImpl extends AbstractSchemaObject implements TableDe
     /** Cached key columns. */
     private final Set<String> keyCols;
 
-    /** Cached key affinity columns. */
-    private final Set<String> affCols;
+    /** Colocation columns. */
+    private final List<String> colocationCols;
 
     /**
      * Constructor.
@@ -76,7 +76,7 @@ public class TableDefinitionImpl extends AbstractSchemaObject implements TableDe
         this.indices = indices;
 
         keyCols = primaryKeyDefinition.columns();
-        affCols = primaryKeyDefinition.affinityColumns();
+        colocationCols = primaryKeyDefinition.colocationColumns();
     }
 
     /** {@inheritDoc} */
@@ -93,8 +93,8 @@ public class TableDefinitionImpl extends AbstractSchemaObject implements TableDe
 
     /** {@inheritDoc} */
     @Override
-    public Set<String> affinityColumns() {
-        return affCols;
+    public List<String> colocationColumns() {
+        return colocationCols;
     }
 
     /** {@inheritDoc} */
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/PrimaryKeyDefinitionBuilderImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/PrimaryKeyDefinitionBuilderImpl.java
index 2c1c58b..760cefe 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/PrimaryKeyDefinitionBuilderImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/PrimaryKeyDefinitionBuilderImpl.java
@@ -38,9 +38,9 @@ public class PrimaryKeyDefinitionBuilderImpl implements SchemaObjectBuilder, Pri
     @IgniteToStringInclude
     private List<String> columns;
 
-    /** Affinity columns. */
+    /** Colocation columns. */
     @IgniteToStringInclude
-    private List<String> affinityColumns;
+    private List<String> colocationColumns;
 
     /** Builder hints. */
     protected Map<String, String> hints;
@@ -63,20 +63,20 @@ public class PrimaryKeyDefinitionBuilderImpl implements SchemaObjectBuilder, Pri
 
     /** {@inheritDoc} */
     @Override
-    public PrimaryKeyDefinitionBuilderImpl withAffinityColumns(String... affinityColumns) {
-        this.affinityColumns = affinityColumns == null
+    public PrimaryKeyDefinitionBuilderImpl withColocationColumns(String... colocationCols) {
+        this.colocationColumns = colocationCols == null
                 ? null
-                : Arrays.stream(affinityColumns).map(IgniteObjectName::parse).collect(Collectors.toList());
+                : Arrays.stream(colocationCols).map(IgniteObjectName::parse).collect(Collectors.toList());
 
         return this;
     }
 
     /** {@inheritDoc} */
     @Override
-    public PrimaryKeyDefinitionBuilderImpl withAffinityColumns(List<String> affinityColumns) {
-        this.affinityColumns = affinityColumns == null
+    public PrimaryKeyDefinitionBuilderImpl withColocationColumns(List<String> colocationCols) {
+        this.colocationColumns = colocationCols == null
                 ? null
-                : affinityColumns.stream().map(IgniteObjectName::parse).collect(Collectors.toList());
+                : colocationCols.stream().map(IgniteObjectName::parse).collect(Collectors.toList());
 
         return this;
     }
@@ -98,18 +98,14 @@ public class PrimaryKeyDefinitionBuilderImpl implements SchemaObjectBuilder, Pri
 
         Set<String> cols = Set.copyOf(columns);
 
-        Set<String> affCols;
+        List<String> colocationCols;
 
-        if (CollectionUtils.nullOrEmpty(affinityColumns)) {
-            affCols = cols;
+        if (CollectionUtils.nullOrEmpty(colocationColumns)) {
+            colocationCols = List.copyOf(columns);
         } else {
-            affCols = Set.copyOf(affinityColumns);
-
-            if (!cols.containsAll(affCols)) {
-                throw new IllegalStateException("Schema definition error: All affinity columns must be part of key.");
-            }
+            colocationCols = List.copyOf(colocationColumns);
         }
 
-        return new PrimaryKeyDefinitionImpl(cols, affCols);
+        return new PrimaryKeyDefinitionImpl(cols, colocationCols);
     }
 }
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/TableDefinitionBuilderImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/TableDefinitionBuilderImpl.java
index fe74195..44575c6 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/TableDefinitionBuilderImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/builder/TableDefinitionBuilderImpl.java
@@ -127,7 +127,7 @@ public class TableDefinitionBuilderImpl implements TableDefinitionBuilder {
         assert columns.size() > primaryKeyDefinition.columns().size() : "Key or/and value columns must be defined.";
 
         validatePrimaryKey(primaryKeyDefinition.columns(), columns);
-        validateIndices(indices.values(), columns.values(), primaryKeyDefinition.affinityColumns());
+        validateIndices(indices.values(), columns.values(), primaryKeyDefinition.colocationColumns());
 
         return new TableDefinitionImpl(
                 schemaName,
@@ -156,11 +156,14 @@ public class TableDefinitionBuilderImpl implements TableDefinitionBuilder {
     /**
      * Validate indices.
      *
-     * @param indices     Table indices.
-     * @param cols        Table columns.
-     * @param affColNames Affinity columns names.
+     * @param indices Table indices.
+     * @param cols Table columns.
+     * @param colocationColNames Colocation columns names.
      */
-    public static void validateIndices(Collection<IndexDefinition> indices, Collection<ColumnDefinition> cols, Set<String> affColNames) {
+    public static void validateIndices(
+            Collection<IndexDefinition> indices,
+            Collection<ColumnDefinition> cols,
+            List<String> colocationColNames) {
         Set<String> colNames = cols.stream().map(ColumnDefinition::name).collect(Collectors.toSet());
 
         for (IndexDefinition idx : indices) {
@@ -173,8 +176,8 @@ public class TableDefinitionBuilderImpl implements TableDefinitionBuilder {
                 throw new IllegalStateException("Index column must exist in the schema.");
             }
 
-            if (idx0.unique() && !(idx0.columns().stream().map(IndexColumnDefinition::name).allMatch(affColNames::contains))) {
-                throw new IllegalStateException("Unique index must contains all affinity columns.");
+            if (idx0.unique() && !(idx0.columns().stream().map(IndexColumnDefinition::name).allMatch(colocationColNames::contains))) {
+                throw new IllegalStateException("Unique index must contains all colocation columns.");
             }
         }
     }
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java
index 411c7c4..79b106d 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java
@@ -17,10 +17,12 @@
 
 package org.apache.ignite.internal.schema.definition.index;
 
+import java.util.List;
 import java.util.Set;
 import org.apache.ignite.internal.schema.definition.AbstractSchemaObject;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
+import org.apache.ignite.internal.util.CollectionUtils;
 import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
 
 /**
@@ -31,21 +33,29 @@ public class PrimaryKeyDefinitionImpl extends AbstractSchemaObject implements Pr
     @IgniteToStringInclude
     private final Set<String> columns;
 
-    /** Affinity columns. */
+    /** Colocation columns. */
     @IgniteToStringInclude
-    private final Set<String> affCols;
+    private final List<String> colocationColumns;
 
     /**
      * Constructor.
      *
-     * @param columns         Index columns.
-     * @param affinityColumns Affinity columns.
+     * @param columns Index columns.
+     * @param colocationColumns Colocation columns.
      */
-    public PrimaryKeyDefinitionImpl(Set<String> columns, Set<String> affinityColumns) {
+    public PrimaryKeyDefinitionImpl(Set<String> columns, List<String> colocationColumns) {
         super(PrimaryKeyDefinition.PRIMARY_KEY_NAME);
 
+        if (CollectionUtils.nullOrEmpty(columns)) {
+            throw new IllegalStateException("Primary key column(s) must be configured.");
+        } else if (!columns.containsAll(colocationColumns)) {
+            throw new IllegalStateException("Schema definition error: All colocation columns must be part of key.");
+        } else if (colocationColumns.size() != Set.copyOf(colocationColumns).size()) {
+            throw new IllegalStateException("Schema definition error: Colocation columns must not be duplicated.");
+        }
+
         this.columns = columns;
-        this.affCols = affinityColumns;
+        this.colocationColumns = colocationColumns;
     }
 
     /** {@inheritDoc} */
@@ -56,8 +66,8 @@ public class PrimaryKeyDefinitionImpl extends AbstractSchemaObject implements Pr
 
     /** {@inheritDoc} */
     @Override
-    public Set<String> affinityColumns() {
-        return affCols;
+    public List<String> colocationColumns() {
+        return colocationColumns;
     }
 
     /** {@inheritDoc} */
@@ -66,6 +76,6 @@ public class PrimaryKeyDefinitionImpl extends AbstractSchemaObject implements Pr
         return S.toString(PrimaryKeyDefinitionImpl.class, this,
                 "name", name(),
                 "cols", columns(),
-                "affCols", affinityColumns());
+                "colocationCols", colocationColumns());
     }
 }
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/schema/SchemaSerializerImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/schema/SchemaSerializerImpl.java
index d3c2feb..d30c7ef 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/schema/SchemaSerializerImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/schema/SchemaSerializerImpl.java
@@ -89,11 +89,11 @@ public class SchemaSerializerImpl extends AbstractSchemaSerializer {
         appendColumns(desc.keyColumns(), byteBuf);
         appendColumns(desc.valueColumns(), byteBuf);
 
-        Column[] affinityCols = desc.affinityColumns();
+        Column[] colocationCols = desc.colocationColumns();
 
-        byteBuf.putInt(affinityCols.length);
+        byteBuf.putInt(colocationCols.length);
 
-        for (Column column : affinityCols) {
+        for (Column column : colocationCols) {
             appendString(column.name(), byteBuf);
         }
 
@@ -108,15 +108,15 @@ public class SchemaSerializerImpl extends AbstractSchemaSerializer {
         Column[] keyCols = readColumns(byteBuf);
         Column[] valCols = readColumns(byteBuf);
 
-        int affinityColsSize = byteBuf.getInt();
+        int colocationColsSize = byteBuf.getInt();
 
-        String[] affinityCols = new String[affinityColsSize];
+        String[] colocationCols = new String[colocationColsSize];
 
-        for (int i = 0; i < affinityColsSize; i++) {
-            affinityCols[i] = readString(byteBuf);
+        for (int i = 0; i < colocationColsSize; i++) {
+            colocationCols[i] = readString(byteBuf);
         }
 
-        SchemaDescriptor descriptor = new SchemaDescriptor(ver, keyCols, affinityCols, valCols);
+        SchemaDescriptor descriptor = new SchemaDescriptor(ver, keyCols, colocationCols, valCols);
 
         ColumnMapper mapper = readColumnMapping(descriptor, byteBuf);
 
@@ -132,8 +132,8 @@ public class SchemaSerializerImpl extends AbstractSchemaSerializer {
                 + INT                          //Descriptor version
                 + getColumnsSize(desc.keyColumns())
                 + getColumnsSize(desc.valueColumns())
-                + ARRAY_HEADER_LENGTH          //Affinity columns length
-                + getStringArraySize(desc.affinityColumns())
+                + ARRAY_HEADER_LENGTH          //Colocation columns length
+                + getStringArraySize(desc.colocationColumns())
                 + getColumnMappingSize(desc.columnMapping(), desc.length());
     }
 
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
index d76e0d2..3143916 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.schema;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 import java.util.Map;
 import org.apache.ignite.schema.SchemaBuilders;
 import org.apache.ignite.schema.definition.ColumnType;
@@ -51,8 +53,8 @@ public class SchemaConfigurationTest {
                 .withPrimaryKey(
                         SchemaBuilders.primaryKey()  // Declare index column in order.
                                 .withColumns("id", "affId", "name")
-                                .withAffinityColumns(
-                                        "affId") // Optional affinity declaration. If not set, all columns will be affinity cols.
+                                .withColocationColumns(
+                                        "affId") // Optional colocation declaration. If not set, all PK columns will be colocation cols.
                                 .build()
                 )
 
@@ -129,4 +131,33 @@ public class SchemaConfigurationTest {
                 .dropIndex("hash_idx")
                 .apply();
     }
+
+    /**
+     * TestInitialSchema.
+     * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
+     */
+    @Test
+    public void invalidColocationColumns() {
+        final TableDefinitionBuilder builder = SchemaBuilders.tableBuilder(SchemaObject.DEFAULT_DATABASE_SCHEMA_NAME, "table1");
+
+        assertThrows(
+                IllegalStateException.class,
+                () ->
+                        SchemaBuilders.primaryKey()  // Declare index column in order.
+                                .withColumns("id0", "id1", "id2")
+                                .withColocationColumns(
+                                        "val")
+                                .build(),
+                "Schema definition error: All colocation columns must be part of key.");
+
+        assertThrows(
+                IllegalStateException.class,
+                () ->
+                        SchemaBuilders.primaryKey()  // Declare index column in order.
+                                .withColumns("id0", "id1", "id2")
+                                .withColocationColumns(
+                                        "id0, id1, id0")
+                                .build(),
+                "Schema definition error: Colocation columns must not be duplicated.");
+    }
 }
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
index 09151c4..d47eb66 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
@@ -34,21 +34,21 @@ import org.junit.jupiter.api.Test;
 public class PrimaryKeyDefinitionDefinitionBuilderTest {
     /** Test primary key parameters. */
     @Test
-    public void testPrimaryKeyWithAffinityColumns() {
+    public void testPrimaryKeyWithColocationColumns() {
         PrimaryKeyDefinitionBuilder builder = SchemaBuilders.primaryKey();
 
-        builder.withColumns("A", "B", "C").withAffinityColumns("B").build();
+        builder.withColumns("A", "B", "C").withColocationColumns("B").build();
 
         PrimaryKeyDefinition idx = builder.build();
 
         assertEquals(3, idx.columns().size());
-        assertEquals(1, idx.affinityColumns().size());
+        assertEquals(1, idx.colocationColumns().size());
 
         assertTrue(idx.columns().containsAll(List.of("A", "B", "C")));
-        assertTrue(idx.affinityColumns().contains("B"));
+        assertTrue(idx.colocationColumns().contains("B"));
 
-        assertFalse(idx.affinityColumns().contains("A"));
-        assertFalse(idx.affinityColumns().contains("C"));
+        assertFalse(idx.colocationColumns().contains("A"));
+        assertFalse(idx.colocationColumns().contains("C"));
     }
 
     /** Test primary key parameters. */
@@ -61,18 +61,18 @@ public class PrimaryKeyDefinitionDefinitionBuilderTest {
         PrimaryKeyDefinition idx = builder.build();
 
         assertEquals(3, idx.columns().size());
-        assertEquals(3, idx.affinityColumns().size());
+        assertEquals(3, idx.colocationColumns().size());
 
         assertTrue(idx.columns().containsAll(List.of("A", "B", "C")));
-        assertTrue(idx.affinityColumns().containsAll(List.of("A", "B", "C")));
+        assertTrue(idx.colocationColumns().containsAll(List.of("A", "B", "C")));
     }
 
     /** Test primary key parameters. */
     @Test
-    public void testPrimaryKeyWrongAffinityColumn() {
+    public void testPrimaryKeyWrongColocationColumn() {
         PrimaryKeyDefinitionBuilder builder = SchemaBuilders.primaryKey()
                 .withColumns("A", "B")
-                .withAffinityColumns("C");
+                .withColocationColumns("C");
 
         assertThrows(IllegalStateException.class, builder::build);
     }
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java
index 0d46a52..0c6353f 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java
@@ -252,7 +252,7 @@ public class SchemaConfigurationConverterTest {
         assertEquals(tbl.canonicalName(), tbl2.canonicalName());
         assertEquals(tbl.indices().size(), tbl2.indices().size());
         assertEquals(tbl.keyColumns().size(), tbl2.keyColumns().size());
-        assertEquals(tbl.affinityColumns().size(), tbl2.affinityColumns().size());
+        assertEquals(tbl.colocationColumns().size(), tbl2.colocationColumns().size());
         assertEquals(tbl.columns().size(), tbl2.columns().size());
     }
 
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java
index 5f95454..7aad67b 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java
@@ -57,7 +57,7 @@ public class SchemaDescriptorConverterTest {
         SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
 
         assertEquals(2, tblDscr.keyColumns().length());
-        assertEquals(2, tblDscr.affinityColumns().length);
+        assertEquals(2, tblDscr.colocationColumns().length);
         assertEquals(columns - 2, tblDscr.valueColumns().length());
     }
 
@@ -70,14 +70,14 @@ public class SchemaDescriptorConverterTest {
         TableDefinition tblSchm = bldr.withPrimaryKey(
                 SchemaBuilders.primaryKey()
                         .withColumns("INT8", "ID")
-                        .withAffinityColumns("INT8")
+                        .withColocationColumns("INT8")
                         .build()
         ).build();
 
         SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
 
         assertEquals(2, tblDscr.keyColumns().length());
-        assertEquals(1, tblDscr.affinityColumns().length);
+        assertEquals(1, tblDscr.colocationColumns().length);
         assertEquals(columns - 2, tblDscr.valueColumns().length());
     }
 
@@ -118,7 +118,7 @@ public class SchemaDescriptorConverterTest {
                 .withPrimaryKey(
                         SchemaBuilders.primaryKey()
                                 .withColumns("INT32", "ID")
-                                .withAffinityColumns("INT32")
+                                .withColocationColumns("INT32")
                                 .build()
                 ).build();
 
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/TableValidatorImplTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/TableValidatorImplTest.java
index 07522d5..0b7923f 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/TableValidatorImplTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/TableValidatorImplTest.java
@@ -64,7 +64,7 @@ public class TableValidatorImplTest {
             value = "mock.tables.table {\n"
             + "    name = schema.table,\n"
             + "    columns.id {name = id, type.type = STRING, nullable = true},\n"
-            + "    primaryKey {columns = [id], affinityColumns = [id]},\n"
+            + "    primaryKey {columns = [id], colocationColumns = [id]},\n"
             + "    indices.foo {type = HASH, name = foo, colNames = [id]}"
             + "}",
             polymorphicExtensions = {
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
index 0e0c51f..d740736 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
@@ -77,7 +77,7 @@ public class AbstractSerializerTest {
 
         assertArrayEquals(desc.keyColumns().columns(), deserialize.keyColumns().columns());
         assertArrayEquals(desc.valueColumns().columns(), deserialize.valueColumns().columns());
-        assertArrayEquals(desc.affinityColumns(), deserialize.affinityColumns());
+        assertArrayEquals(desc.colocationColumns(), deserialize.colocationColumns());
     }
 
     /**
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index 5549df2..68bd9c1 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -109,7 +109,7 @@ public class DdlCommandHandler {
         final PrimaryKeyDefinitionBuilder pkeyDef = SchemaBuilders.primaryKey();
 
         pkeyDef.withColumns(IgniteObjectName.quoteNames(cmd.primaryKeyColumns()));
-        pkeyDef.withAffinityColumns(IgniteObjectName.quoteNames(cmd.affColumns()));
+        pkeyDef.withColocationColumns(IgniteObjectName.quoteNames(cmd.affColumns()));
 
         final IgniteTypeFactory typeFactory = Commons.typeFactory();