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());
 

Reply via email to