This is an automated email from the ASF dual-hosted git repository.
wyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 7e113cff40 [ASTERIXDB-3324][STO][RT] Clossed types stabilization in
columnar
7e113cff40 is described below
commit 7e113cff40bab73aa6e542512838b1e789522b2b
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Tue Dec 5 10:08:03 2023 -0800
[ASTERIXDB-3324][STO][RT] Clossed types stabilization in columnar
Details:
This patch includes multiple fixes described in ASTERIXDB-3324
Change-Id: Idf5be82359f6fd2f9d80cf33b07b9248218c70cd
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17995
Integration-Tests: Jenkins <[email protected]>
Tested-by: Wail Alkowaileet <[email protected]>
Reviewed-by: Wail Alkowaileet <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../src/test/resources/runtimets/sqlpp_queries.xml | 8 ++--
.../assembler/AbstractNestedValueAssembler.java | 2 +-
.../column/assembler/AssemblerBuilderVisitor.java | 37 ++++++++++-----
.../asterix/column/assembler/AssemblerInfo.java | 4 +-
.../column/assembler/PrimitiveValueAssembler.java | 2 +
...{LongValueGetter.java => FloatValueGetter.java} | 10 ++--
...{LongValueGetter.java => Int16ValueGetter.java} | 10 ++--
...{LongValueGetter.java => Int32ValueGetter.java} | 10 ++--
...{LongValueGetter.java => Int64ValueGetter.java} | 4 +-
.../{LongValueGetter.java => Int8ValueGetter.java} | 11 +++--
.../column/assembler/value/ValueGetterFactory.java | 10 +++-
.../bytes/decoder/AbstractParquetValuesReader.java | 4 ++
.../ParquetPlainFixedLengthValuesReader.java | 9 ++++
.../bytes/encoder/AbstractParquetValuesWriter.java | 7 +++
.../ParquetPlainFixedLengthValuesWriter.java | 9 ++++
.../column/bytes/stream/in/ValueInputStream.java | 6 +++
.../column/bytes/stream/out/ValueOutputStream.java | 7 ++-
.../column/metadata/FieldNamesDictionary.java | 19 ++++++++
.../column/metadata/schema/AbstractSchemaNode.java | 4 ++
.../column/metadata/schema/ObjectSchemaNode.java | 43 ++++++++++++-----
.../column/metadata/schema/UnionSchemaNode.java | 13 +++--
.../visitor/ColumnSupportedTypesValidator.java | 2 +-
.../visitor/SchemaBuilderFromIATypeVisitor.java | 39 ++++++++++++---
.../schema/visitor/SchemaClipperVisitor.java | 21 +++++----
.../operation/lsm/flush/ColumnTransformer.java | 5 ++
.../operation/lsm/flush/FlushColumnMetadata.java | 55 ++++++++++++----------
.../asterix/column/util/ColumnValuesUtil.java | 2 -
.../column/util/SchemaStringBuilderVisitor.java | 2 +-
.../asterix/column/values/IColumnValuesReader.java | 2 +
.../values/reader/AbstractColumnValuesReader.java | 5 ++
.../values/reader/ColumnValueReaderFactory.java | 9 +++-
.../values/reader/value/AbstractValueReader.java | 4 ++
...tractValueReader.java => FloatValueReader.java} | 38 +++++++++------
...eyValueReader.java => FloatKeyValueReader.java} | 14 +++---
.../reader/value/key/LongKeyValueReader.java | 8 +++-
.../values/writer/ColumnValuesWriterFactory.java | 8 +++-
...uesWriter.java => FloatColumnValuesWriter.java} | 51 ++++++++++----------
.../values/writer/LongColumnValuesWriter.java | 17 ++++---
.../reader/AbstractDummyColumnValuesReader.java | 5 ++
.../serde/ARecordSerializerDeserializer.java | 8 ++++
.../lazy/AbstractLazyNestedVisitablePointable.java | 9 ++--
.../om/lazy/FixedListLazyVisitablePointable.java | 2 +-
.../om/lazy/MissingLazyVisitablePointable.java} | 17 ++-----
.../om/lazy/NullLazyVisitablePointable.java} | 17 ++-----
.../om/lazy/TypedRecordLazyVisitablePointable.java | 15 +++++-
.../lazy/VariableListLazyVisitablePointable.java | 1 +
.../hyracks/data/std/primitive/BytePointable.java | 2 +-
47 files changed, 401 insertions(+), 186 deletions(-)
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 0b65d9328e..90444fbe5e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -16441,10 +16441,10 @@
<test-case FilePath="column">
<compilation-unit name="supported-types">
<output-dir compare="Text">supported-types</output-dir>
- <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, double, string, boolean,
uuid]</expected-error>
- <expected-error>ASX0067: Type(s) '[datetime, date, time, duration]'
are not supported in columnar storage format. Supported types are [bigint,
double, string, boolean, uuid]</expected-error>
- <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, double, string, boolean,
uuid]</expected-error>
- <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, double, string, boolean,
uuid]</expected-error>
+ <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, float, double, string,
boolean, uuid]</expected-error>
+ <expected-error>ASX0067: Type(s) '[datetime, date, time, duration]'
are not supported in columnar storage format. Supported types are [bigint,
float, double, string, boolean, uuid]</expected-error>
+ <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, float, double, string,
boolean, uuid]</expected-error>
+ <expected-error>ASX0067: Type(s) '[datetime]' are not supported in
columnar storage format. Supported types are [bigint, float, double, string,
boolean, uuid]</expected-error>
<source-location>false</source-location>
</compilation-unit>
</test-case>
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AbstractNestedValueAssembler.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AbstractNestedValueAssembler.java
index 1a4c3ef2e7..13820e0e2e 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AbstractNestedValueAssembler.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AbstractNestedValueAssembler.java
@@ -22,7 +22,7 @@ import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-abstract class AbstractNestedValueAssembler extends AbstractValueAssembler {
+public abstract class AbstractNestedValueAssembler extends
AbstractValueAssembler {
protected final ArrayBackedValueStorage storage;
AbstractNestedValueAssembler(int level, AssemblerInfo info) {
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerBuilderVisitor.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerBuilderVisitor.java
index 15e2bb9d3d..a3101e8548 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerBuilderVisitor.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerBuilderVisitor.java
@@ -27,6 +27,7 @@ import java.util.Map;
import org.apache.asterix.column.assembler.value.IValueGetter;
import org.apache.asterix.column.assembler.value.IValueGetterFactory;
+import org.apache.asterix.column.metadata.FieldNamesDictionary;
import org.apache.asterix.column.metadata.schema.AbstractSchemaNode;
import org.apache.asterix.column.metadata.schema.ISchemaNodeVisitor;
import org.apache.asterix.column.metadata.schema.ObjectSchemaNode;
@@ -95,16 +96,18 @@ public class AssemblerBuilderVisitor implements
ISchemaNodeVisitor<AbstractValue
BitSet declaredFields = handleDeclaredFields(objectNode, info,
objectAssembler);
IntList childrenFieldNameIndexes =
objectNode.getChildrenFieldNameIndexes();
- if (declaredFields.length() < childrenFieldNameIndexes.size()) {
- //Open fields are requested
+ int numberOfAddedChildren = declaredFields.cardinality();
+ if (numberOfAddedChildren < childrenFieldNameIndexes.size()) {
+ // Now handle any open fields
for (int i = 0; i < childrenFieldNameIndexes.size(); i++) {
- int fieldNameIndex = childrenFieldNameIndexes.getInt(i);
- AbstractSchemaNode childNode =
objectNode.getChild(fieldNameIndex);
- if (childNode.getTypeTag() != ATypeTag.MISSING &&
!declaredFields.get(fieldNameIndex)) {
+ int fieldNameIdx = childrenFieldNameIndexes.getInt(i);
+ AbstractSchemaNode childNode =
objectNode.getChild(fieldNameIdx);
+ if (fieldNameIdx ==
FieldNamesDictionary.DUMMY_FIELD_NAME_INDEX ||
!declaredFields.get(fieldNameIdx)) {
+ numberOfAddedChildren++;
IAType childType = getChildType(childNode,
BuiltinType.ANY);
- IValueReference fieldName =
columnMetadata.getFieldNamesDictionary().getFieldName(fieldNameIndex);
+ IValueReference fieldName =
columnMetadata.getFieldNamesDictionary().getFieldName(fieldNameIdx);
//The last child should be a delegate
- boolean delegate = i == childrenFieldNameIndexes.size() -
1;
+ boolean delegate = numberOfAddedChildren ==
childrenFieldNameIndexes.size();
AssemblerInfo childInfo = new AssemblerInfo(childType,
objectAssembler, delegate, fieldName);
childNode.accept(this, childInfo);
}
@@ -125,17 +128,18 @@ public class AssemblerBuilderVisitor implements
ISchemaNodeVisitor<AbstractValue
String[] declaredFieldNames = declaredType.getFieldNames();
IAType[] declaredFieldTypes = declaredType.getFieldTypes();
- // The last child of a declared field can be a delegate iff all
requested fields are declared
- boolean containsDelegate = objectNode.getChildren().size() ==
declaredFieldTypes.length;
+ int addedChildren = 0;
+ int requestedChildren = objectNode.getChildren().size();
for (int i = 0; i < declaredFieldTypes.length; i++) {
String fieldName = declaredFieldNames[i];
int fieldNameIndex =
columnMetadata.getFieldNamesDictionary().getFieldNameIndex(fieldName);
//Check if the declared field was requested
AbstractSchemaNode childNode = objectNode.getChild(fieldNameIndex);
if (childNode.getTypeTag() != ATypeTag.MISSING) {
+ addedChildren++;
IAType childType = getChildType(childNode,
declaredFieldTypes[i]);
processedFields.set(fieldNameIndex);
- boolean delegate = containsDelegate && i ==
declaredFieldTypes.length - 1;
+ boolean delegate = addedChildren == requestedChildren;
AssemblerInfo childInfo = new AssemblerInfo(childType,
objectAssembler, delegate, i);
childNode.accept(this, childInfo);
}
@@ -204,7 +208,7 @@ public class AssemblerBuilderVisitor implements
ISchemaNodeVisitor<AbstractValue
@Override
public AbstractValueAssembler visit(PrimitiveSchemaNode primitiveNode,
AssemblerInfo info) {
AbstractPrimitiveValueAssembler assembler;
- IValueGetter valueGetter =
valueGetterFactory.createValueGetter(primitiveNode.getTypeTag());
+ IValueGetter valueGetter =
valueGetterFactory.createValueGetter(getTypeTag(info, primitiveNode));
if (!delimiters.isEmpty()) {
IColumnValuesReader reader =
readerFactory.createValueReader(primitiveNode.getTypeTag(),
primitiveNode.getColumnIndex(), level, getDelimiters());
@@ -227,6 +231,17 @@ public class AssemblerBuilderVisitor implements
ISchemaNodeVisitor<AbstractValue
return assembler;
}
+ private ATypeTag getTypeTag(AssemblerInfo info, PrimitiveSchemaNode
primitiveNode) {
+ IAType declaredType = info.getDeclaredType();
+
+ if (declaredType.getTypeTag() == ATypeTag.ANY) {
+ return primitiveNode.getTypeTag();
+ }
+
+ // Declared types are not (and cannot be) normalized
+ return declaredType.getTypeTag();
+ }
+
private int[] getDelimiters() {
int numOfDelimiters = delimiters.size();
int[] reversed = new int[numOfDelimiters];
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerInfo.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerInfo.java
index 712e65c842..bb085c3c12 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerInfo.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/AssemblerInfo.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.column.assembler;
+import static
org.apache.asterix.om.typecomputer.impl.TypeComputeUtils.getActualType;
+
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
import org.apache.asterix.om.types.IAType;
@@ -60,7 +62,7 @@ public class AssemblerInfo {
public AssemblerInfo(IAType declaredType, AbstractNestedValueAssembler
parent, boolean delegate,
IValueReference fieldName, int fieldIndex, boolean
fieldNameTagged) {
this.parent = parent;
- this.declaredType = declaredType;
+ this.declaredType = getActualType(declaredType);
this.delegate = delegate;
this.fieldName = fieldNameTagged ? fieldName :
createTaggedFieldName(fieldName);
this.fieldIndex = fieldIndex;
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
index be463331ae..520f1d5e1c 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
@@ -50,6 +50,8 @@ final class PrimitiveValueAssembler extends
AbstractPrimitiveValueAssembler {
throw createException();
} else if (reader.isNull() && (isDelegate() || reader.getLevel() + 1
== level)) {
addNullToAncestor(reader.getLevel());
+ } else if (reader.isMissing() && isDelegate() && reader.getLevel() <
level) {
+ addMissingToAncestor(reader.getLevel());
} else if (reader.isValue()) {
addValueToParent();
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/FloatValueGetter.java
similarity index 79%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/FloatValueGetter.java
index e76e3c9564..c183e6880e 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/FloatValueGetter.java
@@ -21,16 +21,16 @@ package org.apache.asterix.column.assembler.value;
import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
+class FloatValueGetter extends AbstractFixedLengthValueGetter {
+ FloatValueGetter() {
+ super(ATypeTag.FLOAT, Float.BYTES);
}
@Override
public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
+ FloatPointable.setFloat(value.getByteArray(), value.getStartOffset() +
1, reader.getFloat());
return value;
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int16ValueGetter.java
similarity index 78%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int16ValueGetter.java
index e76e3c9564..8c6672801b 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int16ValueGetter.java
@@ -21,16 +21,16 @@ package org.apache.asterix.column.assembler.value;
import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.ShortPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
+public class Int16ValueGetter extends AbstractFixedLengthValueGetter {
+ Int16ValueGetter() {
+ super(ATypeTag.SMALLINT, Short.BYTES);
}
@Override
public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
+ ShortPointable.setShort(value.getByteArray(), value.getStartOffset() +
1, (short) reader.getLong());
return value;
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int32ValueGetter.java
similarity index 78%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int32ValueGetter.java
index e76e3c9564..969f5c2e4b 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int32ValueGetter.java
@@ -21,16 +21,16 @@ package org.apache.asterix.column.assembler.value;
import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
+class Int32ValueGetter extends AbstractFixedLengthValueGetter {
+ Int32ValueGetter() {
+ super(ATypeTag.INTEGER, Integer.BYTES);
}
@Override
public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
+ IntegerPointable.setInteger(value.getByteArray(),
value.getStartOffset() + 1, (int) reader.getLong());
return value;
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int64ValueGetter.java
similarity index 93%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int64ValueGetter.java
index e76e3c9564..9152140175 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int64ValueGetter.java
@@ -23,8 +23,8 @@ import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.api.IValueReference;
import org.apache.hyracks.data.std.primitive.LongPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
+class Int64ValueGetter extends AbstractFixedLengthValueGetter {
+ Int64ValueGetter() {
super(ATypeTag.BIGINT, Long.BYTES);
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int8ValueGetter.java
similarity index 79%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int8ValueGetter.java
index e76e3c9564..cb052dddb7 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/Int8ValueGetter.java
@@ -21,16 +21,17 @@ package org.apache.asterix.column.assembler.value;
import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.BytePointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
+class Int8ValueGetter extends AbstractFixedLengthValueGetter {
+
+ Int8ValueGetter() {
+ super(ATypeTag.TINYINT, Byte.BYTES);
}
@Override
public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
+ BytePointable.setByte(value.getByteArray(), value.getStartOffset() +
1, (byte) reader.getLong());
return value;
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/ValueGetterFactory.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/ValueGetterFactory.java
index 5f7fd7e096..bb3839fe9a 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/ValueGetterFactory.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/ValueGetterFactory.java
@@ -35,8 +35,16 @@ public class ValueGetterFactory implements
IValueGetterFactory {
return MissingValueGetter.INSTANCE;
case BOOLEAN:
return new BooleanValueGetter();
+ case TINYINT:
+ return new Int8ValueGetter();
+ case SMALLINT:
+ return new Int16ValueGetter();
+ case INTEGER:
+ return new Int32ValueGetter();
case BIGINT:
- return new LongValueGetter();
+ return new Int64ValueGetter();
+ case FLOAT:
+ return new FloatValueGetter();
case DOUBLE:
return new DoubleValueGetter();
case STRING:
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/AbstractParquetValuesReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/AbstractParquetValuesReader.java
index 5f5b88caf9..230da0a7fb 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/AbstractParquetValuesReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/AbstractParquetValuesReader.java
@@ -40,6 +40,10 @@ public abstract class AbstractParquetValuesReader {
throw new UnsupportedOperationException(getClass().getName());
}
+ public float readFloat() {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+
public double readDouble() {
throw new UnsupportedOperationException(getClass().getName());
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
index 07713e1562..417043e2d8 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
@@ -67,6 +67,15 @@ public class ParquetPlainFixedLengthValuesReader extends
AbstractParquetValuesRe
}
}
+ @Override
+ public float readFloat() {
+ try {
+ return in.readFloat();
+ } catch (IOException e) {
+ throw new ParquetDecodingException("could not read double", e);
+ }
+ }
+
@Override
public double readDouble() {
try {
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/AbstractParquetValuesWriter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/AbstractParquetValuesWriter.java
index 97e5746d6d..e54a19a1f4 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/AbstractParquetValuesWriter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/AbstractParquetValuesWriter.java
@@ -82,6 +82,13 @@ public abstract class AbstractParquetValuesWriter {
throw new UnsupportedOperationException(getClass().getName());
}
+ /**
+ * @param v the value to encode
+ */
+ public void writeFloat(float v) {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+
/**
* @param v the value to encode
*/
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/ParquetPlainFixedLengthValuesWriter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/ParquetPlainFixedLengthValuesWriter.java
index 2aba7d2e78..1dbaa03220 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/ParquetPlainFixedLengthValuesWriter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/encoder/ParquetPlainFixedLengthValuesWriter.java
@@ -61,6 +61,15 @@ public class ParquetPlainFixedLengthValuesWriter extends
AbstractParquetValuesWr
}
}
+ @Override
+ public void writeFloat(float v) {
+ try {
+ out.writeFloat(v);
+ } catch (IOException e) {
+ throw new ParquetEncodingException("could not write int", e);
+ }
+ }
+
@Override
public final void writeDouble(double v) {
try {
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/in/ValueInputStream.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/in/ValueInputStream.java
index ee975f1f25..1b6fba9a20 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/in/ValueInputStream.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/in/ValueInputStream.java
@@ -25,6 +25,7 @@ import java.io.InputStream;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.api.IValueReference;
import org.apache.hyracks.data.std.primitive.DoublePointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
import org.apache.hyracks.data.std.primitive.IntegerPointable;
import org.apache.hyracks.data.std.primitive.LongPointable;
import org.apache.parquet.bytes.LittleEndianDataInputStream;
@@ -59,6 +60,11 @@ public final class ValueInputStream extends InputStream {
return LongPointable.getLong(readBuffer, 0);
}
+ public float readFloat() throws IOException {
+ readFully(readBuffer, Float.BYTES);
+ return FloatPointable.getFloat(readBuffer, 0);
+ }
+
public double readDouble() throws IOException {
readFully(readBuffer, Double.BYTES);
return DoublePointable.getDouble(readBuffer, 0);
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/ValueOutputStream.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/ValueOutputStream.java
index a106a00a23..d478ee5a90 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/ValueOutputStream.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/ValueOutputStream.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.io.OutputStream;
import org.apache.hyracks.data.std.primitive.DoublePointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
import org.apache.hyracks.data.std.primitive.IntegerPointable;
import org.apache.hyracks.data.std.primitive.LongPointable;
@@ -49,9 +50,13 @@ public final class ValueOutputStream extends OutputStream {
out.write(writeBuffer, 0, Long.BYTES);
}
+ public void writeFloat(float value) throws IOException {
+ FloatPointable.setFloat(writeBuffer, 0, value);
+ out.write(writeBuffer, 0, Float.BYTES);
+ }
+
public void writeDouble(double value) throws IOException {
DoublePointable.setDouble(writeBuffer, 0, value);
out.write(writeBuffer, 0, Double.BYTES);
}
-
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/FieldNamesDictionary.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/FieldNamesDictionary.java
index aa2e19464f..9ac226ba33 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/FieldNamesDictionary.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/FieldNamesDictionary.java
@@ -32,6 +32,7 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
import
org.apache.hyracks.data.std.accessors.PointableBinaryHashFunctionFactory;
import org.apache.hyracks.data.std.api.IValueReference;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
import org.apache.hyracks.util.string.UTF8StringReader;
import org.apache.hyracks.util.string.UTF8StringWriter;
@@ -42,6 +43,11 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
public class FieldNamesDictionary {
+ /**
+ * Dummy field name used to add a column when encountering empty object
+ */
+ public static final IValueReference DUMMY_FIELD_NAME;
+ public static final int DUMMY_FIELD_NAME_INDEX = -1;
//For both declared and inferred fields
private final List<IValueReference> fieldNames;
private final Object2IntMap<String> declaredFieldNamesToIndexMap;
@@ -55,6 +61,12 @@ public class FieldNamesDictionary {
//For lookups
private final ArrayBackedValueStorage lookupStorage;
+ static {
+ VoidPointable dummy = new VoidPointable();
+ dummy.set(new byte[0], 0, 0);
+ DUMMY_FIELD_NAME = dummy;
+ }
+
public FieldNamesDictionary() {
this(new ArrayList<>(), new Object2IntOpenHashMap<>(), new
Int2IntOpenHashMap());
}
@@ -78,6 +90,10 @@ public class FieldNamesDictionary {
//TODO solve collision (they're so rare that I haven't seen any)
public int getOrCreateFieldNameIndex(IValueReference fieldName) throws
HyracksDataException {
+ if (fieldName == DUMMY_FIELD_NAME) {
+ return DUMMY_FIELD_NAME_INDEX;
+ }
+
int hash = getHash(fieldName);
if (!hashToFieldNameIndexMap.containsKey(hash)) {
int index = addFieldName(creatFieldName(fieldName), hash);
@@ -137,6 +153,9 @@ public class FieldNamesDictionary {
}
public IValueReference getFieldName(int index) {
+ if (index == DUMMY_FIELD_NAME_INDEX) {
+ return DUMMY_FIELD_NAME;
+ }
return fieldNames.get(index);
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/AbstractSchemaNode.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/AbstractSchemaNode.java
index c9d8635d97..622705c0ff 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/AbstractSchemaNode.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/AbstractSchemaNode.java
@@ -77,7 +77,11 @@ public abstract class AbstractSchemaNode {
case NULL:
case MISSING:
case BOOLEAN:
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
case BIGINT:
+ case FLOAT:
case DOUBLE:
case STRING:
case UUID:
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/ObjectSchemaNode.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/ObjectSchemaNode.java
index a230e864e1..451ece5cfa 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/ObjectSchemaNode.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/ObjectSchemaNode.java
@@ -27,6 +27,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
+import org.apache.asterix.column.metadata.FieldNamesDictionary;
import org.apache.asterix.column.metadata.PathInfoSerializer;
import
org.apache.asterix.column.metadata.schema.primitive.MissingFieldSchemaNode;
import org.apache.asterix.column.operation.lsm.flush.FlushColumnMetadata;
@@ -41,14 +42,17 @@ import it.unimi.dsi.fastutil.ints.Int2IntMap.Entry;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntImmutableList;
import it.unimi.dsi.fastutil.ints.IntList;
+import it.unimi.dsi.fastutil.ints.IntUnaryOperator;
public final class ObjectSchemaNode extends AbstractSchemaNestedNode {
private final Int2IntMap fieldNameIndexToChildIndexMap;
private final List<AbstractSchemaNode> children;
+ private IntUnaryOperator nextIndex;
public ObjectSchemaNode() {
fieldNameIndexToChildIndexMap = new Int2IntOpenHashMap();
children = new ArrayList<>();
+ nextIndex = this::nextIndex;
}
ObjectSchemaNode(DataInput input, Map<AbstractSchemaNestedNode,
RunLengthIntArray> definitionLevels)
@@ -60,6 +64,11 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
fieldNameIndexToChildIndexMap = new Int2IntOpenHashMap();
deserializeFieldNameIndexToChildIndex(input,
fieldNameIndexToChildIndexMap, numberOfChildren);
+ if
(fieldNameIndexToChildIndexMap.containsKey(FieldNamesDictionary.DUMMY_FIELD_NAME_INDEX))
{
+ nextIndex = this::emptyColumnIndex;
+ } else {
+ nextIndex = this::nextIndex;
+ }
children = new ArrayList<>();
deserializeChildren(input, children, numberOfChildren,
definitionLevels);
@@ -69,7 +78,7 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
FlushColumnMetadata columnMetadata) throws HyracksDataException {
int numberOfChildren = children.size();
int fieldNameIndex =
columnMetadata.getFieldNamesDictionary().getOrCreateFieldNameIndex(fieldName);
- int childIndex =
fieldNameIndexToChildIndexMap.getOrDefault(fieldNameIndex, numberOfChildren);
+ int childIndex =
fieldNameIndexToChildIndexMap.getOrDefault(fieldNameIndex,
nextIndex.apply(fieldNameIndex));
AbstractSchemaNode currentChild = childIndex == numberOfChildren ?
null : children.get(childIndex);
AbstractSchemaNode newChild =
columnMetadata.getOrCreateChild(currentChild, childTypeTag);
if (currentChild == null) {
@@ -88,6 +97,15 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
children.add(child);
}
+ public void setEmptyObject(FlushColumnMetadata columnMetadata) throws
HyracksDataException {
+ if (!children.isEmpty()) {
+ return;
+ }
+ AbstractSchemaNode emptyChild = columnMetadata.getOrCreateChild(null,
ATypeTag.MISSING);
+ addChild(FieldNamesDictionary.DUMMY_FIELD_NAME_INDEX, emptyChild);
+ nextIndex = this::emptyColumnIndex;
+ }
+
public AbstractSchemaNode getChild(int fieldNameIndex) {
if (fieldNameIndexToChildIndexMap.containsKey(fieldNameIndex)) {
return
children.get(fieldNameIndexToChildIndexMap.get(fieldNameIndex));
@@ -95,11 +113,6 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
return MissingFieldSchemaNode.INSTANCE;
}
- public void removeChild(int fieldNameIndex) {
- int childIndex = fieldNameIndexToChildIndexMap.remove(fieldNameIndex);
- children.remove(childIndex);
- }
-
public List<AbstractSchemaNode> getChildren() {
return children;
}
@@ -112,10 +125,6 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
.sorted(Comparator.comparingInt(Entry::getIntValue)).mapToInt(Entry::getIntKey));
}
- public boolean containsField(int fieldNameIndex) {
- return fieldNameIndexToChildIndexMap.containsKey(fieldNameIndex);
- }
-
@Override
public ATypeTag getTypeTag() {
return ATypeTag.OBJECT;
@@ -141,7 +150,8 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
output.write(ATypeTag.OBJECT.serialize());
output.writeInt(children.size());
for (Int2IntMap.Entry fieldNameIndexChildIndex :
fieldNameIndexToChildIndexMap.int2IntEntrySet()) {
- output.writeInt(fieldNameIndexChildIndex.getIntKey());
+ int fieldNameIndex = fieldNameIndexChildIndex.getIntKey();
+ output.writeInt(fieldNameIndex);
output.writeInt(fieldNameIndexChildIndex.getIntValue());
}
pathInfoSerializer.enter(this);
@@ -179,4 +189,15 @@ public final class ObjectSchemaNode extends
AbstractSchemaNestedNode {
children.add(AbstractSchemaNode.deserialize(input,
definitionLevels));
}
}
+
+ private int nextIndex(int fieldNameIndex) {
+ return children.size();
+ }
+
+ private int emptyColumnIndex(int fieldNameIndex) {
+ nextIndex = this::nextIndex;
+
fieldNameIndexToChildIndexMap.remove(FieldNamesDictionary.DUMMY_FIELD_NAME_INDEX);
+ fieldNameIndexToChildIndexMap.put(fieldNameIndex, 0);
+ return 0;
+ }
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/UnionSchemaNode.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/UnionSchemaNode.java
index 3cacb8ada5..2503143500 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/UnionSchemaNode.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/UnionSchemaNode.java
@@ -122,15 +122,18 @@ public final class UnionSchemaNode extends
AbstractSchemaNestedNode {
}
/**
- * This would return any numeric node
+ * This would return any numeric node that has a different typeTag than
the 'excludeTypeTag'
*
+ * @param excludeTypeTag exclude child with the provided {@link ATypeTag}
* @return first numeric node or missing node
* @see SchemaClipperVisitor
*/
- public AbstractSchemaNode getNumericChildOrMissing() {
- for (AbstractSchemaNode node : children.values()) {
- if (ATypeHierarchy.getTypeDomain(node.getTypeTag()) ==
ATypeHierarchy.Domain.NUMERIC) {
- return node;
+ public AbstractSchemaNode getNumericChildOrMissing(ATypeTag
excludeTypeTag) {
+ for (AbstractSchemaNode child : children.values()) {
+ ATypeTag childTypeTag = child.getTypeTag();
+ boolean numeric = ATypeHierarchy.getTypeDomain(childTypeTag) ==
ATypeHierarchy.Domain.NUMERIC;
+ if (numeric && childTypeTag != excludeTypeTag) {
+ return child;
}
}
return MissingFieldSchemaNode.INSTANCE;
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
index 5b27a74b4f..76ea58fe7f 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/ColumnSupportedTypesValidator.java
@@ -45,7 +45,7 @@ import org.apache.hyracks.api.exceptions.SourceLocation;
*/
public class ColumnSupportedTypesValidator implements IATypeVisitor<Void,
Set<ATypeTag>> {
private static final Set<ATypeTag> SUPPORTED_PRIMITIVE_TYPES =
- Set.of(ATypeTag.BOOLEAN, ATypeTag.BIGINT, ATypeTag.DOUBLE,
ATypeTag.STRING, ATypeTag.UUID);
+ Set.of(ATypeTag.BOOLEAN, ATypeTag.BIGINT, ATypeTag.FLOAT,
ATypeTag.DOUBLE, ATypeTag.STRING, ATypeTag.UUID);
private static final String SUPPORTED_TYPES_STRING =
SUPPORTED_PRIMITIVE_TYPES.stream().sorted().collect(Collectors.toList()).toString();
private static final ColumnSupportedTypesValidator VALIDATOR = new
ColumnSupportedTypesValidator();
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaBuilderFromIATypeVisitor.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaBuilderFromIATypeVisitor.java
index fb098faa1f..e6a85b8ea8 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaBuilderFromIATypeVisitor.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaBuilderFromIATypeVisitor.java
@@ -18,12 +18,15 @@
*/
package org.apache.asterix.column.metadata.schema.visitor;
+import static
org.apache.asterix.om.typecomputer.impl.TypeComputeUtils.getActualType;
+
import java.util.List;
import org.apache.asterix.column.metadata.FieldNamesDictionary;
import org.apache.asterix.column.metadata.schema.AbstractSchemaNode;
import org.apache.asterix.column.metadata.schema.ObjectSchemaNode;
-import org.apache.asterix.column.metadata.schema.collection.ArraySchemaNode;
+import
org.apache.asterix.column.metadata.schema.collection.AbstractCollectionSchemaNode;
+import
org.apache.asterix.column.metadata.schema.primitive.MissingFieldSchemaNode;
import org.apache.asterix.column.operation.lsm.flush.FlushColumnMetadata;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.AUnionType;
@@ -51,9 +54,10 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
ObjectSchemaNode objectNode = (ObjectSchemaNode) arg;
columnMetadata.enterLevel(objectNode);
try {
- if (processedPrimaryKeys < primaryKeys.size()) {
+ if (isProcessingPrimaryKeys()) {
processPrimaryKeys(recordType, objectNode);
}
+
for (int i = 0; i < recordType.getFieldTypes().length; i++) {
processField(i, recordType, objectNode);
}
@@ -66,8 +70,8 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
@Override
public Void visit(AbstractCollectionType collectionType,
AbstractSchemaNode arg) {
- ArraySchemaNode collectionNode = (ArraySchemaNode) arg;
- IAType itemType = collectionType.getItemType();
+ AbstractCollectionSchemaNode collectionNode =
(AbstractCollectionSchemaNode) arg;
+ IAType itemType = getActualType(collectionType.getItemType());
columnMetadata.enterLevel(collectionNode);
try {
AbstractSchemaNode itemNode =
collectionNode.getOrCreateItem(itemType.getTypeTag(), columnMetadata);
@@ -86,7 +90,7 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
@Override
public Void visitFlat(IAType flatType, AbstractSchemaNode arg) {
- if (processedPrimaryKeys < primaryKeys.size()) {
+ if (isProcessingPrimaryKeys()) {
processedPrimaryKeys++;
}
return null;
@@ -97,9 +101,14 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
* Handling primary keys and record fields conversion
* **************************************************************
*/
+
+ private boolean isProcessingPrimaryKeys() {
+ return processedPrimaryKeys < primaryKeys.size();
+ }
+
private void processPrimaryKeys(ARecordType recordType, ObjectSchemaNode
objectNode) throws HyracksDataException {
if (objectNode == columnMetadata.getRoot() || objectNode ==
columnMetadata.getMetaRoot()) {
- while (processedPrimaryKeys < primaryKeys.size()) {
+ while (isProcessingPrimaryKeys()) {
currentPrimaryKeyPath = primaryKeys.get(processedPrimaryKeys);
currentPathIndex = 0;
processPrimaryKeyPath(recordType, objectNode);
@@ -113,6 +122,10 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
private void processPrimaryKeyPath(ARecordType recordType,
ObjectSchemaNode objectNode)
throws HyracksDataException {
int fieldIndex =
recordType.getFieldIndex(currentPrimaryKeyPath.get(currentPathIndex));
+ if (fieldIndex < 0) {
+ currentPathIndex--;
+ return;
+ }
processField(fieldIndex, recordType, objectNode);
}
@@ -122,10 +135,22 @@ public class SchemaBuilderFromIATypeVisitor implements
IATypeVisitor<Void, Abstr
String[] fieldNames = recordType.getFieldNames();
FieldNamesDictionary dictionary =
columnMetadata.getFieldNamesDictionary();
+ if (isProcessingPrimaryKeys() &&
!fieldNames[fieldIndex].equals(currentPrimaryKeyPath.get(currentPathIndex))) {
+ // Still processing PKs, do not add any fields to the children
until all PKs are processed
+ return;
+ }
+
int fieldNameIndex =
dictionary.getOrCreateFieldNameIndex(fieldNames[fieldIndex]);
+ AbstractSchemaNode childNode = objectNode.getChild(fieldNameIndex);
+ if (!childNode.isNested() && childNode !=
MissingFieldSchemaNode.INSTANCE) {
+ // Avoid processing the flat child twice
+ // Can happen if the child is a PK
+ return;
+ }
+
IValueReference fieldName = dictionary.getFieldName(fieldNameIndex);
- IAType fieldType = fieldTypes[fieldIndex];
+ IAType fieldType = getActualType(fieldTypes[fieldIndex]);
AbstractSchemaNode child = objectNode.getOrCreateChild(fieldName,
fieldType.getTypeTag(), columnMetadata);
fieldType.accept(this, child);
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaClipperVisitor.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaClipperVisitor.java
index 5db01f29ec..3d7d954e7b 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaClipperVisitor.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/SchemaClipperVisitor.java
@@ -87,11 +87,12 @@ public class SchemaClipperVisitor implements
IATypeVisitor<AbstractSchemaNode, A
@Override
public AbstractSchemaNode visit(AbstractCollectionType collectionType,
AbstractSchemaNode arg) {
- if (isNotCompatible(collectionType, arg)) {
+ // We check only if arg is a collection to include both array and
multiset
+ if (!arg.isCollection() && isNotCompatible(collectionType, arg)) {
return MissingFieldSchemaNode.INSTANCE;
}
AbstractCollectionSchemaNode collectionNode =
- getActualNode(arg, collectionType.getTypeTag(),
AbstractCollectionSchemaNode.class);
+ getActualNode(arg, arg.getTypeTag(),
AbstractCollectionSchemaNode.class);
AbstractSchemaNode newItemNode =
collectionType.getItemType().accept(this, collectionNode.getItemNode());
AbstractCollectionSchemaNode clippedCollectionNode =
AbstractCollectionSchemaNode.create(collectionType.getTypeTag());
@@ -115,14 +116,12 @@ public class SchemaClipperVisitor implements
IATypeVisitor<AbstractSchemaNode, A
}
private AbstractSchemaNode getNonCompatibleNumericNodeIfAny(IAType
flatType, AbstractSchemaNode arg) {
- ATypeHierarchy.Domain requestedDomain =
ATypeHierarchy.getTypeDomain(flatType.getTypeTag());
- ATypeHierarchy.Domain nodeDomain =
ATypeHierarchy.getTypeDomain(arg.getTypeTag());
- if (nodeDomain == requestedDomain && nodeDomain ==
ATypeHierarchy.Domain.NUMERIC) {
+ if (isNumeric(flatType.getTypeTag()) && isNumeric(arg.getTypeTag())) {
// This will be reconciled by the filter accessor
return arg;
} else if (arg.getTypeTag() == ATypeTag.UNION) {
UnionSchemaNode unionNode = (UnionSchemaNode) arg;
- return unionNode.getNumericChildOrMissing();
+ return unionNode.getNumericChildOrMissing(flatType.getTypeTag());
}
return MissingFieldSchemaNode.INSTANCE;
@@ -139,14 +138,16 @@ public class SchemaClipperVisitor implements
IATypeVisitor<AbstractSchemaNode, A
}
private boolean isNotCompatible(IAType requestedType, AbstractSchemaNode
schemaNode) {
- if (requestedType.getTypeTag() != schemaNode.getTypeTag()) {
+ ATypeTag requestedTypeTag = requestedType.getTypeTag();
+ if (requestedTypeTag != schemaNode.getTypeTag()) {
if (schemaNode.getTypeTag() != ATypeTag.UNION) {
warn(requestedType, schemaNode);
return true;
}
// Handle union
UnionSchemaNode unionNode = (UnionSchemaNode) schemaNode;
- return notInUnion(requestedType, unionNode);
+ return notInUnion(requestedType, unionNode)
+ || isNumeric(requestedTypeTag) &&
unionContainsMultipleNumeric(schemaNode);
}
return unionContainsMultipleNumeric(schemaNode);
}
@@ -178,4 +179,8 @@ public class SchemaClipperVisitor implements
IATypeVisitor<AbstractSchemaNode, A
}
return false;
}
+
+ private static boolean isNumeric(ATypeTag typeTag) {
+ return ATypeHierarchy.getTypeDomain(typeTag) ==
ATypeHierarchy.Domain.NUMERIC;
+ }
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/ColumnTransformer.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/ColumnTransformer.java
index d40e00c7ec..cccac50290 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/ColumnTransformer.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/ColumnTransformer.java
@@ -110,6 +110,11 @@ public class ColumnTransformer implements
ILazyVisitablePointableVisitor<Abstrac
}
}
+ if (pointable.getNumberOfChildren() == 0) {
+ // Set as empty object
+ objectNode.setEmptyObject(columnMetadata);
+ }
+
columnMetadata.exitNode(arg);
currentParent = previousParent;
return null;
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnMetadata.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnMetadata.java
index e89a120965..2cee53368e 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnMetadata.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnMetadata.java
@@ -339,9 +339,10 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
AbstractSchemaNode currentChild = child;
ATypeTag normalizedTypeTag = getNormalizedTypeTag(childTypeTag);
if (currentChild == null || normalizedTypeTag != ATypeTag.MISSING &&
normalizedTypeTag != ATypeTag.NULL
- && currentChild.getTypeTag() != ATypeTag.UNION &&
currentChild.getTypeTag() != normalizedTypeTag) {
+ && currentChild.getTypeTag() != ATypeTag.UNION
+ && getNormalizedTypeTag(currentChild.getTypeTag()) !=
normalizedTypeTag) {
//Create a new child or union type if required type is different
from the current child type
- currentChild = createChild(child, normalizedTypeTag);
+ currentChild = createChild(child, childTypeTag);
//Flag that the schema has changed
changed = true;
}
@@ -422,6 +423,23 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
}
}
+ public void addNestedNull(AbstractSchemaNestedNode parent,
AbstractSchemaNestedNode node)
+ throws HyracksDataException {
+ //Flush all definition levels from parent to the current node
+ flushDefinitionLevels(level, parent, node);
+ //Add null value (+2) to say that both the parent and the child are
present
+ definitionLevels.get(node).add(ColumnValuesUtil.getNullMask(level + 2)
| level);
+ node.incrementCounter();
+ }
+
+ public void close() {
+ //Dereference multiPageOp
+ multiPageOpRef.setValue(null);
+ for (int i = 0; i < columnWriters.size(); i++) {
+ columnWriters.get(i).close();
+ }
+ }
+
private void flushDefinitionLevels(int parentMask, int childMask,
RunLengthIntArray parentDefLevels,
AbstractSchemaNode node) throws HyracksDataException {
int startIndex = node.getCounter();
@@ -480,9 +498,10 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
}
}
- private AbstractSchemaNode createChild(AbstractSchemaNode child, ATypeTag
normalizedTypeTag)
+ private AbstractSchemaNode createChild(AbstractSchemaNode child, ATypeTag
childTypeTag)
throws HyracksDataException {
AbstractSchemaNode createdChild;
+ ATypeTag normalizedTypeTag = getNormalizedTypeTag(childTypeTag);
if (child != null) {
if (child.getTypeTag() == ATypeTag.NULL) {
//The previous child was a NULL. The new child needs to
inherit the NULL definition levels
@@ -498,13 +517,13 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
createdChild = addDefinitionLevelsAndGet(new
UnionSchemaNode(child, createChild(normalizedTypeTag)));
}
} else {
- createdChild = createChild(normalizedTypeTag);
+ createdChild = createChild(childTypeTag);
}
return createdChild;
}
- private AbstractSchemaNode createChild(ATypeTag normalizedTypeTag) throws
HyracksDataException {
- switch (normalizedTypeTag) {
+ private AbstractSchemaNode createChild(ATypeTag childTypeTag) throws
HyracksDataException {
+ switch (childTypeTag) {
case OBJECT:
return addDefinitionLevelsAndGet(new ObjectSchemaNode());
case ARRAY:
@@ -514,12 +533,17 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
case NULL:
case MISSING:
case BOOLEAN:
+ case FLOAT:
case DOUBLE:
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
case BIGINT:
case STRING:
case UUID:
int columnIndex = nullWriterIndexes.isEmpty() ?
columnWriters.size() : nullWriterIndexes.removeInt(0);
boolean primaryKey = columnIndex < getNumberOfPrimaryKeys();
+ ATypeTag normalizedTypeTag = primaryKey ? childTypeTag :
getNormalizedTypeTag(childTypeTag);
boolean writeAlways = primaryKey || repeated > 0;
boolean filtered = !primaryKey;
int maxLevel = primaryKey ? 1 : level + 1;
@@ -531,7 +555,7 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
addColumn(columnIndex, writer);
return new PrimitiveSchemaNode(columnIndex, normalizedTypeTag,
primaryKey);
default:
- throw new IllegalStateException("Unsupported type " +
normalizedTypeTag);
+ throw new IllegalStateException("Unsupported type " +
childTypeTag);
}
}
@@ -564,21 +588,4 @@ public final class FlushColumnMetadata extends
AbstractColumnMetadata {
metaRecordSchema);
}
}
-
- public void close() {
- //Dereference multiPageOp
- multiPageOpRef.setValue(null);
- for (int i = 0; i < columnWriters.size(); i++) {
- columnWriters.get(i).close();
- }
- }
-
- public void addNestedNull(AbstractSchemaNestedNode parent,
AbstractSchemaNestedNode node)
- throws HyracksDataException {
- //Flush all definition levels from parent to the current node
- flushDefinitionLevels(level, parent, node);
- //Add null value (+2) to say that both the parent and the child are
present
- definitionLevels.get(node).add(ColumnValuesUtil.getNullMask(level + 2)
| level);
- node.incrementCounter();
- }
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/ColumnValuesUtil.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/ColumnValuesUtil.java
index 3094abece2..79d5f31137 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/ColumnValuesUtil.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/ColumnValuesUtil.java
@@ -54,8 +54,6 @@ public class ColumnValuesUtil {
case SMALLINT:
case INTEGER:
return ATypeTag.BIGINT;
- case FLOAT:
- return ATypeTag.DOUBLE;
default:
return typeTag;
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/SchemaStringBuilderVisitor.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/SchemaStringBuilderVisitor.java
index 85aca8f3ca..7134b2f709 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/SchemaStringBuilderVisitor.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/util/SchemaStringBuilderVisitor.java
@@ -82,7 +82,7 @@ public class SchemaStringBuilderVisitor implements
ISchemaNodeVisitor<Void, Void
for (int i = 0; i < children.size(); i++) {
int index = fieldNameIndexes.getInt(i);
- String fieldName = fieldNames.get(index);
+ String fieldName = index < 0 ? "<empty>" : fieldNames.get(index);
AbstractSchemaNode child = children.get(i);
append(fieldName, index, child);
child.accept(this, null);
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
index fcb21c0700..51ef2c1d67 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReader.java
@@ -108,6 +108,8 @@ public interface IColumnValuesReader extends
Comparable<IColumnValuesReader> {
long getLong();
+ float getFloat();
+
double getDouble();
boolean getBoolean();
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
index 8ed6df6389..133c744314 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
@@ -146,6 +146,11 @@ abstract class AbstractColumnValuesReader implements
IColumnValuesReader {
return valueReader.getLong();
}
+ @Override
+ public float getFloat() {
+ return valueReader.getFloat();
+ }
+
@Override
public final double getDouble() {
return valueReader.getDouble();
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
index bf80580093..34111385d1 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
@@ -26,11 +26,13 @@ import
org.apache.asterix.column.values.IColumnValuesReaderFactory;
import org.apache.asterix.column.values.reader.value.AbstractValueReader;
import org.apache.asterix.column.values.reader.value.BooleanValueReader;
import org.apache.asterix.column.values.reader.value.DoubleValueReader;
+import org.apache.asterix.column.values.reader.value.FloatValueReader;
import org.apache.asterix.column.values.reader.value.LongValueReader;
import org.apache.asterix.column.values.reader.value.NoOpValueReader;
import org.apache.asterix.column.values.reader.value.StringValueReader;
import org.apache.asterix.column.values.reader.value.UUIDValueReader;
import org.apache.asterix.column.values.reader.value.key.DoubleKeyValueReader;
+import org.apache.asterix.column.values.reader.value.key.FloatKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.LongKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.StringKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.UUIDKeyValueReader;
@@ -71,8 +73,13 @@ public class ColumnValueReaderFactory implements
IColumnValuesReaderFactory {
return NoOpValueReader.INSTANCE;
case BOOLEAN:
return new BooleanValueReader();
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
case BIGINT:
- return primaryKey ? new LongKeyValueReader() : new
LongValueReader();
+ return primaryKey ? new LongKeyValueReader(typeTag) : new
LongValueReader();
+ case FLOAT:
+ return primaryKey ? new FloatKeyValueReader() : new
FloatValueReader();
case DOUBLE:
return primaryKey ? new DoubleKeyValueReader() : new
DoubleValueReader();
case STRING:
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
index 4db082fc00..dbf4830f38 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
@@ -41,6 +41,10 @@ public abstract class AbstractValueReader implements
Comparable<AbstractValueRea
throw new UnsupportedOperationException(getClass().getName());
}
+ public float getFloat() {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+
public double getDouble() {
throw new UnsupportedOperationException(getClass().getName());
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/FloatValueReader.java
similarity index 54%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/FloatValueReader.java
index 4db082fc00..90f76e338f 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/AbstractValueReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/FloatValueReader.java
@@ -20,32 +20,40 @@ package org.apache.asterix.column.values.reader.value;
import java.io.IOException;
+import
org.apache.asterix.column.bytes.decoder.ParquetPlainFixedLengthValuesReader;
import org.apache.asterix.column.bytes.stream.in.AbstractBytesInputStream;
import org.apache.asterix.om.types.ATypeTag;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IValueReference;
-public abstract class AbstractValueReader implements
Comparable<AbstractValueReader> {
+public final class FloatValueReader extends AbstractValueReader {
+ private final ParquetPlainFixedLengthValuesReader floatReader;
+ private float nextValue;
- public abstract void init(AbstractBytesInputStream in, int tupleCount)
throws IOException;
-
- public abstract void nextValue() throws HyracksDataException;
+ public FloatValueReader() {
+ floatReader = new ParquetPlainFixedLengthValuesReader(Float.BYTES);
+ }
- public abstract ATypeTag getTypeTag();
+ @Override
+ public void init(AbstractBytesInputStream in, int tupleCount) throws
IOException {
+ floatReader.initFromPage(in);
+ }
- public boolean getBoolean() {
- throw new UnsupportedOperationException(getClass().getName());
+ @Override
+ public void nextValue() {
+ nextValue = floatReader.readFloat();
}
- public long getLong() {
- throw new UnsupportedOperationException(getClass().getName());
+ @Override
+ public float getFloat() {
+ return nextValue;
}
- public double getDouble() {
- throw new UnsupportedOperationException(getClass().getName());
+ @Override
+ public ATypeTag getTypeTag() {
+ return ATypeTag.FLOAT;
}
- public IValueReference getBytes() {
- throw new UnsupportedOperationException(getClass().getName());
+ @Override
+ public int compareTo(AbstractValueReader o) {
+ return Float.compare(nextValue, o.getFloat());
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
similarity index 75%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
index a981dca644..be83385f76 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
@@ -20,26 +20,26 @@ package org.apache.asterix.column.values.reader.value.key;
import org.apache.asterix.column.values.reader.value.AbstractValueReader;
import org.apache.asterix.om.types.ATypeTag;
-import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
-public final class LongKeyValueReader extends
AbstractFixedLengthColumnKeyValueReader {
+public final class FloatKeyValueReader extends
AbstractFixedLengthColumnKeyValueReader {
@Override
public ATypeTag getTypeTag() {
- return ATypeTag.BIGINT;
+ return ATypeTag.FLOAT;
}
@Override
protected int getValueLength() {
- return Long.BYTES;
+ return Float.BYTES;
}
@Override
- public long getLong() {
- return LongPointable.getLong(value.getByteArray(),
value.getStartOffset());
+ public double getDouble() {
+ return FloatPointable.getFloat(value.getByteArray(),
value.getStartOffset());
}
@Override
public int compareTo(AbstractValueReader o) {
- return Long.compare(getLong(), o.getLong());
+ return Float.compare(getFloat(), o.getFloat());
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
index a981dca644..b9456d8bca 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LongKeyValueReader.java
@@ -23,9 +23,15 @@ import org.apache.asterix.om.types.ATypeTag;
import org.apache.hyracks.data.std.primitive.LongPointable;
public final class LongKeyValueReader extends
AbstractFixedLengthColumnKeyValueReader {
+ private final ATypeTag typeTag;
+
+ public LongKeyValueReader(ATypeTag typeTag) {
+ this.typeTag = typeTag;
+ }
+
@Override
public ATypeTag getTypeTag() {
- return ATypeTag.BIGINT;
+ return typeTag;
}
@Override
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/ColumnValuesWriterFactory.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/ColumnValuesWriterFactory.java
index 6a514fffa6..3d32a2743f 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/ColumnValuesWriterFactory.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/ColumnValuesWriterFactory.java
@@ -40,8 +40,14 @@ public class ColumnValuesWriterFactory implements
IColumnValuesWriterFactory {
return new NullMissingColumnValuesWriter(columnIndex,
maxLevel, writeAlways, filtered);
case BOOLEAN:
return new BooleanColumnValuesWriter(columnIndex, maxLevel,
writeAlways, filtered);
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
case BIGINT:
- return new LongColumnValuesWriter(multiPageOpRef, columnIndex,
maxLevel, writeAlways, filtered);
+ return new LongColumnValuesWriter(multiPageOpRef, columnIndex,
maxLevel, writeAlways, filtered,
+ typeTag);
+ case FLOAT:
+ return new FloatColumnValuesWriter(multiPageOpRef,
columnIndex, maxLevel, writeAlways, filtered);
case DOUBLE:
return new DoubleColumnValuesWriter(multiPageOpRef,
columnIndex, maxLevel, writeAlways, filtered);
case STRING:
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/FloatColumnValuesWriter.java
similarity index 67%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
copy to
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/FloatColumnValuesWriter.java
index 6e41af7c5b..39abcad244 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/FloatColumnValuesWriter.java
@@ -20,40 +20,39 @@ package org.apache.asterix.column.values.writer;
import java.io.IOException;
-import org.apache.asterix.column.bytes.encoder.AbstractParquetValuesWriter;
-import
org.apache.asterix.column.bytes.encoder.ParquetDeltaBinaryPackingValuesWriterForLong;
import
org.apache.asterix.column.bytes.encoder.ParquetPlainFixedLengthValuesWriter;
import org.apache.asterix.column.values.IColumnValuesReader;
import
org.apache.asterix.column.values.writer.filters.AbstractColumnFilterWriter;
-import org.apache.asterix.column.values.writer.filters.LongColumnFilterWriter;
+import
org.apache.asterix.column.values.writer.filters.DoubleColumnFilterWriter;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.commons.lang3.mutable.Mutable;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.hyracks.data.std.primitive.DoublePointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
import org.apache.hyracks.data.std.primitive.IntegerPointable;
import org.apache.hyracks.data.std.primitive.LongPointable;
import org.apache.hyracks.data.std.primitive.ShortPointable;
import
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnWriteMultiPageOp;
import org.apache.parquet.bytes.BytesInput;
-final class LongColumnValuesWriter extends AbstractColumnValuesWriter {
- private final AbstractParquetValuesWriter longWriter;
+public final class FloatColumnValuesWriter extends AbstractColumnValuesWriter {
+ private final ParquetPlainFixedLengthValuesWriter floatWriter;
- public LongColumnValuesWriter(Mutable<IColumnWriteMultiPageOp>
multiPageOpRef, int columnIndex, int level,
+ public FloatColumnValuesWriter(Mutable<IColumnWriteMultiPageOp>
multiPageOpRef, int columnIndex, int level,
boolean collection, boolean filtered) {
super(columnIndex, level, collection, filtered);
- longWriter = !filtered ? new
ParquetPlainFixedLengthValuesWriter(multiPageOpRef)
- : new
ParquetDeltaBinaryPackingValuesWriterForLong(multiPageOpRef);
+ floatWriter = new ParquetPlainFixedLengthValuesWriter(multiPageOpRef);
}
@Override
protected void addValue(ATypeTag tag, IValueReference value) throws
IOException {
- final long normalizedInt = getValue(tag, value.getByteArray(),
value.getStartOffset());
- longWriter.writeLong(normalizedInt);
- filterWriter.addLong(normalizedInt);
+ final float normalizedDouble = getValue(tag, value.getByteArray(),
value.getStartOffset());
+ floatWriter.writeFloat(normalizedDouble);
+ filterWriter.addDouble(normalizedDouble);
}
- private long getValue(ATypeTag typeTag, byte[] byteArray, int offset) {
+ private float getValue(ATypeTag typeTag, byte[] byteArray, int offset) {
switch (typeTag) {
case TINYINT:
return byteArray[offset];
@@ -63,55 +62,59 @@ final class LongColumnValuesWriter extends
AbstractColumnValuesWriter {
return IntegerPointable.getInteger(byteArray, offset);
case BIGINT:
return LongPointable.getLong(byteArray, offset);
+ case FLOAT:
+ return FloatPointable.getFloat(byteArray, offset);
+ case DOUBLE:
+ return (float) DoublePointable.getDouble(byteArray, offset);
default:
- throw new IllegalAccessError(typeTag + "is not of type
integer");
+ throw new IllegalAccessError(typeTag + "is not of floating
type");
}
}
@Override
protected void resetValues() throws HyracksDataException {
- longWriter.reset();
+ floatWriter.reset();
}
@Override
protected BytesInput getBytes() throws IOException {
- return longWriter.getBytes();
+ return floatWriter.getBytes();
}
@Override
protected int getValuesEstimatedSize() {
- return longWriter.getEstimatedSize();
+ return floatWriter.getEstimatedSize();
}
@Override
protected int calculateEstimatedSize(int length) {
- return longWriter.calculateEstimatedSize(length);
+ return floatWriter.calculateEstimatedSize(length);
}
@Override
protected int getValuesAllocatedSize() {
- return longWriter.getAllocatedSize();
+ return floatWriter.getAllocatedSize();
}
@Override
protected void addValue(IColumnValuesReader reader) throws IOException {
- long value = reader.getLong();
- longWriter.writeLong(value);
- filterWriter.addLong(value);
+ float value = reader.getFloat();
+ floatWriter.writeFloat(value);
+ filterWriter.addDouble(value);
}
@Override
protected AbstractColumnFilterWriter createFilter() {
- return new LongColumnFilterWriter();
+ return new DoubleColumnFilterWriter();
}
@Override
protected void closeValues() {
- longWriter.close();
+ floatWriter.close();
}
@Override
protected ATypeTag getTypeTag() {
- return ATypeTag.BIGINT;
+ return ATypeTag.FLOAT;
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
index 6e41af7c5b..516f56d634 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
+++
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/writer/LongColumnValuesWriter.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.column.values.writer;
+import static
org.apache.asterix.column.util.ColumnValuesUtil.getNormalizedTypeTag;
+
import java.io.IOException;
import org.apache.asterix.column.bytes.encoder.AbstractParquetValuesWriter;
@@ -38,16 +40,19 @@ import org.apache.parquet.bytes.BytesInput;
final class LongColumnValuesWriter extends AbstractColumnValuesWriter {
private final AbstractParquetValuesWriter longWriter;
+ private final ATypeTag typeTag;
public LongColumnValuesWriter(Mutable<IColumnWriteMultiPageOp>
multiPageOpRef, int columnIndex, int level,
- boolean collection, boolean filtered) {
+ boolean collection, boolean filtered, ATypeTag typeTag) {
super(columnIndex, level, collection, filtered);
- longWriter = !filtered ? new
ParquetPlainFixedLengthValuesWriter(multiPageOpRef)
- : new
ParquetDeltaBinaryPackingValuesWriterForLong(multiPageOpRef);
+ longWriter = filtered ? new
ParquetDeltaBinaryPackingValuesWriterForLong(multiPageOpRef)
+ : new ParquetPlainFixedLengthValuesWriter(multiPageOpRef);
+
+ this.typeTag = filtered ? getNormalizedTypeTag(typeTag) : typeTag;
}
@Override
- protected void addValue(ATypeTag tag, IValueReference value) throws
IOException {
+ protected void addValue(ATypeTag tag, IValueReference value) {
final long normalizedInt = getValue(tag, value.getByteArray(),
value.getStartOffset());
longWriter.writeLong(normalizedInt);
filterWriter.addLong(normalizedInt);
@@ -64,7 +69,7 @@ final class LongColumnValuesWriter extends
AbstractColumnValuesWriter {
case BIGINT:
return LongPointable.getLong(byteArray, offset);
default:
- throw new IllegalAccessError(typeTag + "is not of type
integer");
+ throw new IllegalAccessError(typeTag + " is not of type
integer");
}
}
@@ -112,6 +117,6 @@ final class LongColumnValuesWriter extends
AbstractColumnValuesWriter {
@Override
protected ATypeTag getTypeTag() {
- return ATypeTag.BIGINT;
+ return typeTag;
}
}
diff --git
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
index aceddafacc..78ca96bc7c 100644
---
a/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
+++
b/asterixdb/asterix-column/src/test/java/org/apache/asterix/column/values/reader/AbstractDummyColumnValuesReader.java
@@ -115,6 +115,11 @@ public abstract class AbstractDummyColumnValuesReader
implements IColumnValuesRe
return !isNull() && level == maxLevel;
}
+ @Override
+ public float getFloat() {
+ return -1.0f;
+ }
+
@Override
public final long getLong() {
return -1;
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
index 45b9f7df67..e955756320 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
@@ -42,6 +42,7 @@ import
org.apache.hyracks.api.dataflow.value.IBinaryComparator;
import org.apache.hyracks.api.dataflow.value.IBinaryHashFunction;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
import org.apache.hyracks.util.string.UTF8StringUtil;
@@ -273,6 +274,13 @@ public class ARecordSerializerDeserializer implements
ISerializerDeserializer<AR
pointer += 1 + (isExpanded ? 4 : 0);
}
+ // get number of the actual schema fields
+ int numberOfSchemaFields = IntegerPointable.getInteger(serRecord,
pointer);
+ if (numberOfSchemaFields == 0) {
+ // This could happen when columnar datasets assemble empty records
(result of filtered mega leaf nodes)
+ return -1;
+ }
+
//advance to nullBitmap
pointer += 4;
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/AbstractLazyNestedVisitablePointable.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/AbstractLazyNestedVisitablePointable.java
index e9f8e8a8fc..892a8543aa 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/AbstractLazyNestedVisitablePointable.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/AbstractLazyNestedVisitablePointable.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.om.lazy;
+import static
org.apache.asterix.om.typecomputer.impl.TypeComputeUtils.getActualType;
+
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.AbstractCollectionType;
@@ -121,13 +123,14 @@ public abstract class
AbstractLazyNestedVisitablePointable extends AbstractLazyV
* @return a visitable pointable that corresponds to {@code type}
*/
static AbstractLazyVisitablePointable createVisitable(IAType type) {
- ATypeTag typeTag = type.getTypeTag();
+ IAType actualType = getActualType(type);
+ ATypeTag typeTag = actualType.getTypeTag();
switch (typeTag) {
case OBJECT:
- return new TypedRecordLazyVisitablePointable(false,
(ARecordType) type);
+ return new TypedRecordLazyVisitablePointable(false,
(ARecordType) actualType);
case ARRAY:
case MULTISET:
- AbstractCollectionType listType = (AbstractCollectionType)
type;
+ AbstractCollectionType listType = (AbstractCollectionType)
actualType;
return
NonTaggedFormatUtil.isFixedSizedCollection(listType.getItemType())
? new FixedListLazyVisitablePointable(false, listType)
: new VariableListLazyVisitablePointable(false,
listType);
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/FixedListLazyVisitablePointable.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/FixedListLazyVisitablePointable.java
index f3153b206c..711c31ed66 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/FixedListLazyVisitablePointable.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/FixedListLazyVisitablePointable.java
@@ -46,7 +46,7 @@ public class FixedListLazyVisitablePointable extends
AbstractListLazyVisitablePo
@Override
public void nextChild() {
byte[] data = getByteArray();
- int itemOffset = getStartOffset() + itemsOffset + currentIndex *
itemSize;
+ int itemOffset = itemsOffset + currentIndex * itemSize;
currentValue.set(data, itemOffset, itemSize);
currentIndex++;
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/MissingLazyVisitablePointable.java
similarity index 60%
copy from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
copy to
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/MissingLazyVisitablePointable.java
index e76e3c9564..db8f504cbb 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/MissingLazyVisitablePointable.java
@@ -16,21 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.asterix.column.assembler.value;
+package org.apache.asterix.om.lazy;
-import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
-import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
- }
+class MissingLazyVisitablePointable extends FlatLazyVisitablePointable {
+ public static final FlatLazyVisitablePointable INSTANCE = new
MissingLazyVisitablePointable();
- @Override
- public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
- return value;
+ public MissingLazyVisitablePointable() {
+ super(false, ATypeTag.MISSING);
}
}
diff --git
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/NullLazyVisitablePointable.java
similarity index 60%
rename from
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
rename to
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/NullLazyVisitablePointable.java
index e76e3c9564..95e0f5b4eb 100644
---
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/value/LongValueGetter.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/NullLazyVisitablePointable.java
@@ -16,21 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.asterix.column.assembler.value;
+package org.apache.asterix.om.lazy;
-import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.om.types.ATypeTag;
-import org.apache.hyracks.data.std.api.IValueReference;
-import org.apache.hyracks.data.std.primitive.LongPointable;
-class LongValueGetter extends AbstractFixedLengthValueGetter {
- LongValueGetter() {
- super(ATypeTag.BIGINT, Long.BYTES);
- }
+class NullLazyVisitablePointable extends FlatLazyVisitablePointable {
+ public static final AbstractLazyVisitablePointable INSTANCE = new
NullLazyVisitablePointable();
- @Override
- public IValueReference getValue(IColumnValuesReader reader) {
- LongPointable.setLong(value.getByteArray(), value.getStartOffset() +
1, reader.getLong());
- return value;
+ public NullLazyVisitablePointable() {
+ super(false, ATypeTag.NULL);
}
}
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/TypedRecordLazyVisitablePointable.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/TypedRecordLazyVisitablePointable.java
index 19eb076d2c..61e4eed2e3 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/TypedRecordLazyVisitablePointable.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/TypedRecordLazyVisitablePointable.java
@@ -102,12 +102,23 @@ public class TypedRecordLazyVisitablePointable extends
RecordLazyVisitablePointa
if (isTaggedChild()) {
visitablePointable = openVisitable;
} else {
- visitablePointable = closedVisitables[currentIndex];
+ visitablePointable = getClosedChildVisitable();
}
visitablePointable.set(getChildValue());
return visitablePointable;
}
+ private AbstractLazyVisitablePointable getClosedChildVisitable() {
+ switch (getChildTypeTag()) {
+ case MISSING:
+ return MissingLazyVisitablePointable.INSTANCE;
+ case NULL:
+ return NullLazyVisitablePointable.INSTANCE;
+ default:
+ return closedVisitables[currentIndex];
+ }
+ }
+
private void setClosedValueInfo() throws HyracksDataException {
ATypeTag typeTag = closedChildTags[currentIndex];
if (typeTag == ATypeTag.NULL) {
@@ -148,7 +159,7 @@ public class TypedRecordLazyVisitablePointable extends
RecordLazyVisitablePointa
int currentPointer = pointer + 4;
if (NonTaggedFormatUtil.hasOptionalField(recordType)) {
initClosedChildrenTags(data, currentPointer);
- currentPointer =
+ currentPointer +=
(numberOfClosedChildren % 4 == 0 ? numberOfClosedChildren
/ 4 : numberOfClosedChildren / 4 + 1);
}
closedValuesOffset = currentPointer;
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/VariableListLazyVisitablePointable.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/VariableListLazyVisitablePointable.java
index 9e4ab9fc56..4ea649b65a 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/VariableListLazyVisitablePointable.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/lazy/VariableListLazyVisitablePointable.java
@@ -38,6 +38,7 @@ public class VariableListLazyVisitablePointable extends
AbstractListLazyVisitabl
itemTag = listType.getItemType().getTypeTag();
//-1 if not tagged. The offsets were calculated as if the tag exists.
actualChildOffset = isTagged() ? 0 : -1;
+ currentChildTypeTag = itemTag.serialize();
}
@Override
diff --git
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
index 5ac68330cd..804dda4a2e 100644
---
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
+++
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BytePointable.java
@@ -66,7 +66,7 @@ public final class BytePointable extends AbstractPointable
implements IHashable,
return bytes[start];
}
- private static void setByte(byte[] bytes, int start, byte value) {
+ public static void setByte(byte[] bytes, int start, byte value) {
bytes[start] = value;
}