You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2021/03/10 11:53:46 UTC
[ignite-3] branch ignite-13618 updated: IGNITE-13618 Introduce
absolute column index
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 <al...@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());