This is an automated email from the ASF dual-hosted git repository. agoncharuk pushed a commit to branch ignite-13618 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/ignite-13618 by this push: new e931382 IGNITE-13618 Introduce absolute column index e931382 is described below commit e93138240525030c1da6cfdd4cd4991ad3e536fe Author: Alexey Goncharuk <alexey.goncha...@gmail.com> AuthorDate: Wed Mar 10 14:53:36 2021 +0300 IGNITE-13618 Introduce absolute column index --- .../org/apache/ignite/internal/schema/Column.java | 28 ++++++++- .../org/apache/ignite/internal/schema/Columns.java | 13 +++- .../ignite/internal/schema/SchemaDescriptor.java | 6 +- .../ignite/internal/schema/TupleAssembler.java | 8 ++- .../benchmarks/SerializerBenchmarkTest.java | 21 ++++--- .../apache/ignite/internal/schema/ColumnsTest.java | 69 +++++++++++++++++----- .../apache/ignite/internal/schema/TupleTest.java | 2 +- .../schema/marshaller/JavaSerializerTest.java | 16 ++--- 8 files changed, 121 insertions(+), 42 deletions(-) diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/Column.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/Column.java index b93c4d3..1758f77 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/Column.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/Column.java @@ -24,6 +24,9 @@ package org.apache.ignite.internal.schema; * flag is not taken into account when columns are compared. */ public class Column implements Comparable<Column> { + /** Absolute index in schema descriptor. */ + private final int schemaIndex; + /** * Column name. */ @@ -49,12 +52,35 @@ public class Column implements Comparable<Column> { NativeType type, boolean nullable ) { + this(-1, name, type, nullable); + } + + /** + * @param schemaIndex Absolute index of this column in its schema descriptor. + * @param name Column name. + * @param type An instance of column data type. + * @param nullable If {@code false}, null values will not be allowed for this column. + */ + Column( + int schemaIndex, + String name, + NativeType type, + boolean nullable + ) { + this.schemaIndex = schemaIndex; this.name = name; this.type = type; this.nullable = nullable; } /** + * @return Absolute index of this column in its schema descriptor. + */ + public int schemaIndex() { + return schemaIndex; + } + + /** * @return Column name. */ public String name() { @@ -106,6 +132,6 @@ public class Column implements Comparable<Column> { /** {@inheritDoc} */ @Override public String toString() { - return "Column [name=" + name + ", type=" + type + ", nullable=" + nullable + ']'; + return "Column [idx=" + schemaIndex + ", name=" + name + ", type=" + type + ", nullable=" + nullable + ']'; } } diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/Columns.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/Columns.java index 5f0e795..0773b58 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/Columns.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/Columns.java @@ -92,8 +92,8 @@ public class Columns { * * @param cols Array of columns. */ - public Columns(Column... cols) { - this.cols = sortedCopy(cols); + Columns(int baseSchemaIdx, Column... cols) { + this.cols = sortedCopy(baseSchemaIdx, cols); firstVarlenColIdx = findFirstVarlenColumn(); @@ -167,14 +167,21 @@ public class Columns { } /** + * @param schemaBaseIdx Base index of this columns object in its schema. * @param cols User columns. * @return A copy of user columns array sorted in column order. */ - private Column[] sortedCopy(Column[] cols) { + private Column[] sortedCopy(int schemaBaseIdx, Column[] cols) { Column[] cp = Arrays.copyOf(cols, cols.length); Arrays.sort(cp); + for (int i = 0; i < cp.length; i++) { + Column c = cp[i]; + + cp[i] = new Column(schemaBaseIdx + i, c.name(), c.type(), c.nullable()); + } + return cp; } diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java index 1f43e67..f2855b1 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java @@ -35,10 +35,10 @@ public class SchemaDescriptor { * @param keyCols Key columns. * @param valCols Value columns. */ - public SchemaDescriptor(int ver, Columns keyCols, Columns valCols) { + public SchemaDescriptor(int ver, Column[] keyCols, Column[] valCols) { this.ver = ver; - this.keyCols = keyCols; - this.valCols = valCols; + this.keyCols = new Columns(0, keyCols); + this.valCols = new Columns(keyCols.length, valCols); } /** diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/TupleAssembler.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/TupleAssembler.java index 4a7d9bb..098907d 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/TupleAssembler.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/TupleAssembler.java @@ -26,7 +26,13 @@ import java.util.UUID; /** * Utility class to build tuples using column appending pattern. The external user of this class must consult * with the schema and provide the columns in strict internal column sort order during the tuple construction. - * Additionally, the user of this class must pre-calculate the + * Additionally, the user of this class should pre-calculate the resulting tuple size when possible to avoid + * unnecessary data copies. The assembler provides some utility methods to calculate the resulting tuple size + * based on the number of null columns and size calculation for strings. + * + * @see #tupleSize(Columns, int, int, Columns, int, int) + * @see #tupleChunkSize(Columns, int, int) + * @see #utf8EncodedLength(CharSequence) */ public class TupleAssembler { /** diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java index 8591242..50fb3e4 100644 --- a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java +++ b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java @@ -17,6 +17,11 @@ package org.apache.ignite.internal.benchmarks; +import java.lang.reflect.Field; +import java.util.EnumSet; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import javax.annotation.processing.Generated; import com.facebook.presto.bytecode.Access; import com.facebook.presto.bytecode.BytecodeBlock; import com.facebook.presto.bytecode.ClassDefinition; @@ -25,13 +30,7 @@ import com.facebook.presto.bytecode.MethodDefinition; import com.facebook.presto.bytecode.ParameterizedType; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.bytecode.expression.BytecodeExpressions; -import java.lang.reflect.Field; -import java.util.EnumSet; -import java.util.Random; -import java.util.concurrent.TimeUnit; -import javax.annotation.processing.Generated; import org.apache.ignite.internal.schema.Column; -import org.apache.ignite.internal.schema.Columns; import org.apache.ignite.internal.schema.SchemaDescriptor; import org.apache.ignite.internal.schema.marshaller.Serializer; import org.apache.ignite.internal.schema.marshaller.SerializerFactory; @@ -114,8 +113,8 @@ public class SerializerBenchmarkTest { objectFactory = new ObjectFactory<>(valClass); } - Columns keyCols = new Columns(new Column("key", LONG, true)); - Columns valCols = mapFieldsToColumns(valClass); + Column[] keyCols = new Column[] {new Column("key", LONG, true)}; + Column[] valCols = mapFieldsToColumns(valClass); final SchemaDescriptor schema = new SchemaDescriptor(1, keyCols, valCols); if ("Java".equals(serializerName)) @@ -150,9 +149,9 @@ public class SerializerBenchmarkTest { * @param aClass Object class. * @return Columns for schema */ - private Columns mapFieldsToColumns(Class<?> aClass) { + private Column[] mapFieldsToColumns(Class<?> aClass) { if (aClass == Long.class) - return new Columns(new Column("col0", LONG, true)); + return new Column[] {new Column("col0", LONG, true)}; final Field[] fields = aClass.getDeclaredFields(); final Column[] cols = new Column[fields.length]; @@ -163,7 +162,7 @@ public class SerializerBenchmarkTest { cols[i] = new Column("col" + i, LONG, false); } - return new Columns(cols); + return cols; } /** diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/schema/ColumnsTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/schema/ColumnsTest.java index 93e5e45..f7f7d5a 100644 --- a/modules/commons/src/test/java/org/apache/ignite/internal/schema/ColumnsTest.java +++ b/modules/commons/src/test/java/org/apache/ignite/internal/schema/ColumnsTest.java @@ -33,6 +33,7 @@ public class ColumnsTest { @Test public void testFixsizeIndex() { Columns cols = new Columns( + 0, new Column("intCol2", NativeType.INTEGER, false), new Column("intCol1", NativeType.INTEGER, false), new Column("uuidCol", NativeType.UUID, false) @@ -54,6 +55,7 @@ public class ColumnsTest { @Test public void testVarsizeIndex() { Columns cols = new Columns( + 0, new Column("stringCol3", NativeType.STRING, false), new Column("stringCol2", NativeType.STRING, false), new Column("stringCol1", NativeType.STRING, false) @@ -75,6 +77,7 @@ public class ColumnsTest { @Test public void testMixedIndex() { Columns cols = new Columns( + 0, new Column("stringCol", NativeType.STRING, false), new Column("intCol2", NativeType.INTEGER, false), new Column("intCol1", NativeType.INTEGER, false), @@ -100,19 +103,57 @@ public class ColumnsTest { */ @Test public void testNullMapSize() { - assertEquals(1, new Columns(columns(1)).nullMapSize()); - assertEquals(1, new Columns(columns(7)).nullMapSize()); - assertEquals(1, new Columns(columns(8)).nullMapSize()); - - assertEquals(2, new Columns(columns(9)).nullMapSize()); - assertEquals(2, new Columns(columns(10)).nullMapSize()); - assertEquals(2, new Columns(columns(15)).nullMapSize()); - assertEquals(2, new Columns(columns(16)).nullMapSize()); - - assertEquals(3, new Columns(columns(17)).nullMapSize()); - assertEquals(3, new Columns(columns(18)).nullMapSize()); - assertEquals(3, new Columns(columns(23)).nullMapSize()); - assertEquals(3, new Columns(columns(24)).nullMapSize()); + assertEquals(1, new Columns(0, columns(1)).nullMapSize()); + assertEquals(1, new Columns(0, columns(7)).nullMapSize()); + assertEquals(1, new Columns(0, columns(8)).nullMapSize()); + + assertEquals(2, new Columns(0, columns(9)).nullMapSize()); + assertEquals(2, new Columns(0, columns(10)).nullMapSize()); + assertEquals(2, new Columns(0, columns(15)).nullMapSize()); + assertEquals(2, new Columns(0, columns(16)).nullMapSize()); + + assertEquals(3, new Columns(0, columns(17)).nullMapSize()); + assertEquals(3, new Columns(0, columns(18)).nullMapSize()); + assertEquals(3, new Columns(0, columns(23)).nullMapSize()); + assertEquals(3, new Columns(0, columns(24)).nullMapSize()); + } + + @Test + public void testColumnSchemaIndex() { + { + Columns cols = new Columns( + 0, + new Column("uuidCol", NativeType.UUID, false), + new Column("intCol2", NativeType.INTEGER, false), + new Column("intCol1", NativeType.INTEGER, false) + ); + + assertEquals("intCol1", cols.column(0).name()); + assertEquals(0, cols.column(0).schemaIndex()); + + assertEquals("intCol2", cols.column(1).name()); + assertEquals(1, cols.column(1).schemaIndex()); + + assertEquals("uuidCol", cols.column(2).name()); + assertEquals(2, cols.column(2).schemaIndex()); + } + { + Columns cols = new Columns( + 3, + new Column("uuidCol", NativeType.UUID, false), + new Column("intCol2", NativeType.INTEGER, false), + new Column("intCol1", NativeType.INTEGER, false) + ); + + assertEquals("intCol1", cols.column(0).name()); + assertEquals(3, cols.column(0).schemaIndex()); + + assertEquals("intCol2", cols.column(1).name()); + assertEquals(4, cols.column(1).schemaIndex()); + + assertEquals("uuidCol", cols.column(2).name()); + assertEquals(5, cols.column(2).schemaIndex()); + } } /** @@ -332,7 +373,7 @@ public class ColumnsTest { * */ private void checkColumnFolding(Column[] colDef) { - Columns cols = new Columns(colDef); + Columns cols = new Columns(0, colDef); boolean[] nullMasks = new boolean[cols.numberOfFixsizeColumns()]; diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/schema/TupleTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/schema/TupleTest.java index 2b8efee..9e17aa7 100644 --- a/modules/commons/src/test/java/org/apache/ignite/internal/schema/TupleTest.java +++ b/modules/commons/src/test/java/org/apache/ignite/internal/schema/TupleTest.java @@ -147,7 +147,7 @@ public class TupleTest { * */ private void checkSchemaShuffled(Column[] keyCols, Column[] valCols) { - SchemaDescriptor sch = new SchemaDescriptor(1, new Columns(keyCols), new Columns(valCols)); + SchemaDescriptor sch = new SchemaDescriptor(1, keyCols, valCols); Object[] checkArr = sequence(sch); diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java index ddba268..294b71b 100644 --- a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java +++ b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java @@ -153,7 +153,7 @@ public class JavaSerializerTest { new Column("bytesCol", BYTES, true), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = TestObject.randomObject(rnd); final Object val = TestObject.randomObject(rnd); @@ -184,7 +184,7 @@ public class JavaSerializerTest { new Column("bitmaskCol", Bitmask.of(9), true), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = TestObject.randomObject(rnd); final Object val = TestObject.randomObject(rnd); @@ -209,7 +209,7 @@ public class JavaSerializerTest { new Column("shortCol", UUID, true) }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = TestObject.randomObject(rnd); final Object val = TestObject.randomObject(rnd); @@ -233,7 +233,7 @@ public class JavaSerializerTest { new Column("pLongCol", LONG, false), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = PrivateContructorTestObject.randomObject(rnd); final Object val = PrivateContructorTestObject.randomObject(rnd); @@ -262,7 +262,7 @@ public class JavaSerializerTest { new Column("pLongCol", LONG, false), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = WrongTestObject.randomObject(rnd); final Object val = WrongTestObject.randomObject(rnd); @@ -280,7 +280,7 @@ public class JavaSerializerTest { new Column("pLongCol", LONG, false), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(cols), new Columns(cols.clone())); + SchemaDescriptor schema = new SchemaDescriptor(1, cols, cols); final Object key = PrivateTestObject.randomObject(rnd); final Object val = PrivateTestObject.randomObject(rnd); @@ -316,7 +316,7 @@ public class JavaSerializerTest { new Column("col2", LONG, false), }; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(keyCols), new Columns(valCols)); + SchemaDescriptor schema = new SchemaDescriptor(1, keyCols, valCols); final Class<?> valClass = createGeneratedObjectClass(long.class); final ObjectFactory<?> objFactory = new ObjectFactory<>(valClass); @@ -355,7 +355,7 @@ public class JavaSerializerTest { Column[] keyCols = new Column[] {new Column("key", keyType, false)}; Column[] valCols = new Column[] {new Column("val", valType, false)}; - SchemaDescriptor schema = new SchemaDescriptor(1, new Columns(keyCols), new Columns(valCols)); + SchemaDescriptor schema = new SchemaDescriptor(1, keyCols, valCols); Serializer serializer = factory.create(schema, key.getClass(), val.getClass());