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

amashenkov pushed a commit to branch ignite-14388
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 7413dd64d7521f46326508d9853e4fa944bdcefe
Author: Andrew Mashenkov <[email protected]>
AuthorDate: Wed May 12 22:51:31 2021 +0300

    Add affinity columns support.
---
 .../ignite/internal/schema/RowAssembler.java       |   9 +-
 .../ignite/internal/schema/SchemaDescriptor.java   |  29 +++-
 .../ignite/internal/schema/RowAssemblerTest.java   | 162 +++++++++++++++++++++
 3 files changed, 196 insertions(+), 4 deletions(-)

diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/RowAssembler.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/RowAssembler.java
index fb7ab43..2a594bf 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/RowAssembler.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/RowAssembler.java
@@ -25,6 +25,8 @@ import java.util.BitSet;
 import java.util.UUID;
 import org.apache.ignite.internal.schema.BinaryRow.RowFlags;
 
+import static 
org.apache.ignite.internal.schema.BinaryRow.RowFlags.OMIT_KEY_VARTBL_FLAG;
+import static 
org.apache.ignite.internal.schema.BinaryRow.RowFlags.OMIT_VAL_VARTBL_FLAG;
 import static 
org.apache.ignite.internal.schema.BinaryRow.VARLEN_COLUMN_OFFSET_FIELD_SIZE;
 import static 
org.apache.ignite.internal.schema.BinaryRow.VARLEN_TABLE_SIZE_FIELD_SIZE;
 
@@ -187,7 +189,7 @@ public class RowAssembler {
         buf.putShort(0, (short)schema.version());
 
         if (nonNullVarlenKeyCols == 0)
-            flags |= RowFlags.OMIT_KEY_VARTBL_FLAG;
+            flags |= OMIT_KEY_VARTBL_FLAG;
         else
             buf.putShort(varlenTblChunkOff, (short)nonNullVarlenKeyCols);
     }
@@ -429,7 +431,8 @@ public class RowAssembler {
      * @param off Offset to write.
      */
     private void writeOffset(int tblEntryIdx, int off) {
-        assert (flags & (baseOff == BinaryRow.KEY_CHUNK_OFFSET ? 
RowFlags.OMIT_KEY_VARTBL_FLAG : RowFlags.OMIT_VAL_VARTBL_FLAG)) == 0;
+        assert (flags & (baseOff == BinaryRow.KEY_CHUNK_OFFSET ? 
OMIT_KEY_VARTBL_FLAG : OMIT_VAL_VARTBL_FLAG)) == 0 :
+            "Illegal writing of varlen when 'omit vartable' flag is set for a 
chunk.";
 
         buf.putShort(varlenTblChunkOff + Row.varlenItemOffset(tblEntryIdx), 
(short)off);
     }
@@ -510,7 +513,7 @@ public class RowAssembler {
             initOffsets(baseOff + chunkLen, nonNullVarlenValCols);
 
             if (nonNullVarlenValCols == 0)
-                flags |= RowFlags.OMIT_VAL_VARTBL_FLAG;
+                flags |= OMIT_VAL_VARTBL_FLAG;
             else
                 buf.putShort(varlenTblChunkOff, (short)nonNullVarlenValCols);
         }
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 2064068..d597215 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
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.schema;
 
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.ignite.internal.tostring.S;
@@ -40,12 +41,29 @@ public class SchemaDescriptor {
     /** Mapping 'Column name' -> Column. */
     private final Map<String, Column> colMap;
 
+    /** Affinity column bit mask. */
+    private final BitSet affColsMask;
+
     /**
      * @param ver Schema version.
      * @param keyCols Key columns.
      * @param valCols Value columns.
      */
     public SchemaDescriptor(int ver, Column[] keyCols, Column[] valCols) {
+        this(ver, keyCols, null, valCols);
+    }
+
+    /**
+     * @param ver Schema version.
+     * @param keyCols Key columns.
+     * @param affCols Affinity column names.
+     * @param valCols Value columns.
+     */
+    public SchemaDescriptor(int ver, Column[] keyCols, @Nullable String[] 
affCols, Column[] valCols) {
+        assert affCols == null || affCols.length > 0;
+        assert keyCols.length > 0 : "No key columns are conigured.";
+        assert valCols.length > 0 : "No value columns are conigured.";
+
         this.ver = ver;
         this.keyCols = new Columns(0, keyCols);
         this.valCols = new Columns(keyCols.length, valCols);
@@ -54,6 +72,15 @@ public class SchemaDescriptor {
 
         Arrays.stream(this.keyCols.columns()).forEach(c -> 
colMap.put(c.name(), c));
         Arrays.stream(this.valCols.columns()).forEach(c -> 
colMap.put(c.name(), c));
+
+        if (affCols == null)
+            affColsMask = null;
+        else {
+            affColsMask = new BitSet(keyCols.length);
+
+            for (int i = 0; i < affCols.length; i++)
+                affColsMask.set(column(affCols[i]).schemaIndex());
+        }
     }
 
     /**
@@ -76,7 +103,7 @@ public class SchemaDescriptor {
      * @return {@code true} if the columns if key affinity column, {@code 
false} otherwise.
      */
     public boolean isAffinityColumn(int idx) {
-        return isKeyColumn(idx);
+        return affColsMask == null ? isKeyColumn(idx) : affColsMask.get(idx);
     }
 
     /**
diff --git 
a/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowAssemblerTest.java
 
b/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowAssemblerTest.java
index cdf7df4..090f43f 100644
--- 
a/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowAssemblerTest.java
+++ 
b/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowAssemblerTest.java
@@ -36,6 +36,9 @@ public class RowAssemblerTest {
     /** Uuid test value. */
     public final java.util.UUID uuidVal = new UUID(-5204230847775358097L, 
4916207022290092939L);
 
+    /**
+     * Validate row layout for schema of fix-len non-null key and fix-len 
nullable value.
+     */
     @Test
     public void testFixedKeyFixedNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyIntCol", INTEGER, 
false)};
@@ -70,6 +73,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len non-null key and fix-len 
non-null value.
+     */
     @Test
     public void testFixedKeyFixedValue() {
         Column[] keyCols = new Column[] {new Column("keyShortCol", SHORT, 
false)};
@@ -95,6 +101,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len non-null key and var-len 
nullable value.
+     */
     @Test
     public void testFixedKeyVarlenNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyShortCol", SHORT, 
false)};
@@ -129,6 +138,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len non-null key and var-len 
non-null value.
+     */
     @Test
     public void testFixedKeyVarlenValue() {
         Column[] keyCols = new Column[] {new Column("keyShortCol", SHORT, 
false)};
@@ -154,6 +166,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len nullable key and fix-len 
non-null value.
+     */
     @Test
     public void testFixedNullableKeyFixedValue() {
         Column[] keyCols = new Column[] {new Column("keyShortCol", SHORT, 
true)};
@@ -188,6 +203,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len nullable key and fix-len 
nullable value.
+     */
     @Test
     public void testFixedNullableKeyFixedNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyShortCol", SHORT, 
true)};
@@ -240,6 +258,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len nullable key and var-len 
nullable value.
+     */
     @Test
     public void testFixedNullableKeyVarlenNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyIntCol", INTEGER, 
true)};
@@ -292,6 +313,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of fix-len nullable key and var-len 
non-null value.
+     */
     @Test
     public void testFixedNullableKeyVarlenValue() {
         Column[] keyCols = new Column[] {new Column("keyByteCol", BYTE, true)};
@@ -326,6 +350,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len non-null key and fix-len 
nullable value.
+     */
     @Test
     public void testVarlenKeyFixedNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
false)};
@@ -362,6 +389,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len non-null key and fix-len 
non-null value.
+     */
     @Test
     public void testVarlenKeyFixedValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
false)};
@@ -389,6 +419,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len non-null key and var-len 
nullable value.
+     */
     @Test
     public void testVarlenKeyVarlenNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
false)};
@@ -423,6 +456,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len non-null key and var-len 
non-null value.
+     */
     @Test
     public void testVarlenKeyVarlenValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
false)};
@@ -448,6 +484,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len nullable key and fix-len 
nullable value.
+     */
     @Test
     public void testVarlenNullableKeyFixedNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
true)};
@@ -500,6 +539,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len nullable key and fix-len 
non-null value.
+     */
     @Test
     public void testVarlenNullableKeyFixedValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
true)};
@@ -534,6 +576,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len nullable key and var-len 
nullable value.
+     */
     @Test
     public void testVarlenNullableKeyVarlenNullableValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
true)};
@@ -586,6 +631,9 @@ public class RowAssemblerTest {
         }
     }
 
+    /**
+     * Validate row layout for schema of var-len nullable key and var-len 
non-null value.
+     */
     @Test
     public void testVarlenNullableKeyVarlenValue() {
         Column[] keyCols = new Column[] {new Column("keyStrCol", STRING, 
true)};
@@ -621,6 +669,120 @@ public class RowAssemblerTest {
     }
 
     /**
+     * Validate row layout for key\value columns of different types.
+     */
+    @Test
+    public void testhMixedTypes() {
+        Column[] keyCols = new Column[] {
+            new Column("keyShortCol", SHORT, false),
+            new Column("keyStrCol", STRING, false)
+        };
+        Column[] valCols = new Column[] {
+            new Column("valIntCol", INTEGER, true),
+            new Column("valStrCol", STRING, true)
+        };
+
+        SchemaDescriptor schema = new SchemaDescriptor(42, keyCols, valCols);
+
+        {
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 1);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr");
+            asm.appendInt(73);
+            asm.appendString("valstr");
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 2, 0, -110, -109, 94, -68,
+                16, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 114,
+                19, 0, 0, 0, 0, 1, 0, 13, 0, 73, 0, 0, 0, 118, 97, 108, 115, 
116, 114}, asm.build());
+        }
+
+        { // Null value.
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 0);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr2");
+            asm.appendNull();
+            asm.appendNull();
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 18, 0, 32, 99, 115, -49,
+                17, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 114, 
50,
+                5, 0, 0, 0, 3}, asm.build());
+        }
+
+        { // No value.
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 0);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr");
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 19, 0, -110, -109, 94, -68,
+                16, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 
114}, asm.build());
+
+        }
+    }
+
+    /**
+     * Validate row layout for key\value columns of different types.
+     */
+    @Test
+    public void testhMixedTypesWithAffinity() {
+        Column[] keyCols = new Column[] {
+            new Column("keyShortCol", SHORT, false),
+            new Column("keyStrCol", STRING, false)
+        };
+        Column[] valCols = new Column[] {
+            new Column("valIntCol", INTEGER, true),
+            new Column("valStrCol", STRING, true)
+        };
+
+        SchemaDescriptor schema = new SchemaDescriptor(42, keyCols, new 
String[] {"keyShortCol"}, valCols);
+
+        {
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 1);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr");
+            asm.appendInt(73);
+            asm.appendString("valstr");
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 2, 0, 33, 0, 0, 0,
+                16, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 114,
+                19, 0, 0, 0, 0, 1, 0, 13, 0, 73, 0, 0, 0, 118, 97, 108, 115, 
116, 114}, asm.build());
+        }
+
+        { // Null value.
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 0);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr2");
+            asm.appendNull();
+            asm.appendNull();
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 18, 0, 33, 0, 0, 0,
+                17, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 114, 
50,
+                5, 0, 0, 0, 3}, asm.build());
+        }
+
+        { // No value.
+            RowAssembler asm = new RowAssembler(schema, 0, 1, 0);
+
+            asm.appendShort((short)33);
+            asm.appendString("keystr");
+
+            assertRowBytesEquals(new byte[] {
+                42, 0, 19, 0, 33, 0, 0, 0,
+                16, 0, 0, 0, 1, 0, 10, 0, 33, 0, 107, 101, 121, 115, 116, 
114}, asm.build());
+
+        }
+    }
+
+    /**
      * @param expected Expected row bytes.
      * @param actual Actual row bytes.
      */

Reply via email to