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. */
