This is an automated email from the ASF dual-hosted git repository. dlych pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 5363b3338ac5886a3260d7eb2a9be250088ca07e Author: Murtadha Hubail <[email protected]> AuthorDate: Tue Jan 8 21:07:19 2019 +0300 [ASTERIXDB-2507][RT] Objects Creation in ARecordSerializerDeserializer - user model changes: no - storage format changes: no - interface changes: no Details: - Reuse UTF8 hash function and comparator from evaluators when extracting a field's offset. Change-Id: Icdb47db9e909e49d65ebf1cd667e27e2467e4085 Reviewed-on: https://asterix-gerrit.ics.uci.edu/3109 Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Michael Blow <[email protected]> Integration-Tests: Jenkins <[email protected]> --- .../nontagged/serde/ARecordSerializerDeserializer.java | 17 +++++------------ .../functions/records/FieldAccessByNameEvalFactory.java | 10 +++++++++- .../functions/records/FieldAccessNestedEvalFactory.java | 11 ++++++++++- .../records/GetRecordFieldValueEvalFactory.java | 10 +++++++++- 4 files changed, 33 insertions(+), 15 deletions(-) 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 97c49e0..2685e48 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 @@ -305,8 +305,8 @@ public class ARecordSerializerDeserializer implements ISerializerDeserializer<AR return offset + AInt32SerializerDeserializer.getInt(serRecord, pointer + nullBitmapSize + (4 * fieldId)); } - public static int getFieldOffsetByName(byte[] serRecord, int start, int len, byte[] fieldName, int nstart) - throws HyracksDataException { + public static int getFieldOffsetByName(byte[] serRecord, int start, int len, byte[] fieldName, int nstart, + IBinaryHashFunction nameHashFunction, IBinaryComparator nameComparator) throws HyracksDataException { // 5 is the index of the byte that determines whether the record is expanded or not, i.e. it has an open part. if (hasNoFields(serRecord, start, len) || serRecord[start + 5] != 1) { return -1; @@ -316,14 +316,7 @@ public class ARecordSerializerDeserializer implements ISerializerDeserializer<AR int numberOfOpenField = AInt32SerializerDeserializer.getInt(serRecord, openPartOffset); int fieldUtflength = UTF8StringUtil.getUTFLength(fieldName, nstart + 1); int fieldUtfMetaLen = UTF8StringUtil.getNumBytesToStoreLength(fieldUtflength); - - IBinaryHashFunction utf8HashFunction = - BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction(); - - IBinaryComparator utf8BinaryComparator = - BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator(); - - int fieldNameHashCode = utf8HashFunction.hash(fieldName, nstart + 1, fieldUtflength + fieldUtfMetaLen); + int fieldNameHashCode = nameHashFunction.hash(fieldName, nstart + 1, fieldUtflength + fieldUtfMetaLen); int offset = openPartOffset + 4; int fieldOffset = -1; @@ -337,7 +330,7 @@ public class ARecordSerializerDeserializer implements ISerializerDeserializer<AR if (h == fieldNameHashCode) { fieldOffset = start + AInt32SerializerDeserializer.getInt(serRecord, offset + (8 * mid) + 4); // the utf8 comparator do not require to put the precise length, we can just pass a estimated limit. - if (utf8BinaryComparator.compare(serRecord, fieldOffset, len, fieldName, nstart + 1, + if (nameComparator.compare(serRecord, fieldOffset, len, fieldName, nstart + 1, fieldUtflength + fieldUtfMetaLen) == 0) { // since they are equal, we can directly use the meta length and the utf length. return fieldOffset + fieldUtfMetaLen + fieldUtflength; @@ -346,7 +339,7 @@ public class ARecordSerializerDeserializer implements ISerializerDeserializer<AR h = AInt32SerializerDeserializer.getInt(serRecord, offset + (8 * j)); if (h == fieldNameHashCode) { fieldOffset = start + AInt32SerializerDeserializer.getInt(serRecord, offset + (8 * j) + 4); - if (utf8BinaryComparator.compare(serRecord, fieldOffset, len, fieldName, nstart + 1, + if (nameComparator.compare(serRecord, fieldOffset, len, fieldName, nstart + 1, fieldUtflength) == 0) { return fieldOffset + fieldUtfMetaLen + fieldUtflength; } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java index 3deef73..e66cc52 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessByNameEvalFactory.java @@ -22,6 +22,8 @@ import java.io.DataOutput; import java.io.IOException; import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer; +import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider; +import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider; import org.apache.asterix.om.types.ATypeTag; import org.apache.asterix.om.types.EnumDeserializer; import org.apache.asterix.om.utils.NonTaggedFormatUtil; @@ -29,6 +31,8 @@ import org.apache.asterix.runtime.exceptions.TypeMismatchException; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.dataflow.value.IBinaryComparator; +import org.apache.hyracks.api.dataflow.value.IBinaryHashFunction; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.exceptions.SourceLocation; import org.apache.hyracks.data.std.api.IPointable; @@ -55,6 +59,10 @@ public class FieldAccessByNameEvalFactory implements IScalarEvaluatorFactory { public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { return new IScalarEvaluator() { + private final IBinaryHashFunction fieldNameHashFunction = + BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction(); + private final IBinaryComparator fieldNameComparator = + BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator(); private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage(); private DataOutput out = resultStorage.getDataOutput(); @@ -83,7 +91,7 @@ public class FieldAccessByNameEvalFactory implements IScalarEvaluatorFactory { byte[] serFldName = inputArg1.getByteArray(); int serFldNameOffset = inputArg1.getStartOffset(); fieldValueOffset = ARecordSerializerDeserializer.getFieldOffsetByName(serRecord, serRecordOffset, - serRecordLen, serFldName, serFldNameOffset); + serRecordLen, serFldName, serFldNameOffset, fieldNameHashFunction, fieldNameComparator); if (fieldValueOffset < 0) { out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG); result.set(resultStorage); diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java index 632a698..f885f5a 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/FieldAccessNestedEvalFactory.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.util.List; import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer; +import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider; +import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider; import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; import org.apache.asterix.om.base.AMissing; import org.apache.asterix.om.base.ANull; @@ -40,6 +42,8 @@ import org.apache.asterix.runtime.exceptions.TypeMismatchException; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.context.IHyracksTaskContext; +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.api.exceptions.SourceLocation; @@ -70,6 +74,10 @@ public class FieldAccessNestedEvalFactory implements IScalarEvaluatorFactory { public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { return new IScalarEvaluator() { + private final IBinaryHashFunction fieldNameHashFunction = + BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction(); + private final IBinaryComparator fieldNameComparator = + BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator(); private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage(); private final DataOutput out = resultStorage.getDataOutput(); private final ByteArrayAccessibleOutputStream subRecordTmpStream = new ByteArrayAccessibleOutputStream(); @@ -204,7 +212,8 @@ public class FieldAccessNestedEvalFactory implements IScalarEvaluatorFactory { for (; pathIndex < fieldPointables.length; pathIndex++) { openField = true; subFieldOffset = ARecordSerializerDeserializer.getFieldOffsetByName(serRecord, start, len, - fieldPointables[pathIndex].getByteArray(), fieldPointables[pathIndex].getStartOffset()); + fieldPointables[pathIndex].getByteArray(), fieldPointables[pathIndex].getStartOffset(), + fieldNameHashFunction, fieldNameComparator); if (subFieldOffset < 0) { out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG); result.set(resultStorage); diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java index 53dbaad..7cc3aa3 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java @@ -22,6 +22,8 @@ import java.io.DataOutput; import java.io.IOException; import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer; +import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider; +import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.om.types.ATypeTag; @@ -33,6 +35,8 @@ import org.apache.asterix.runtime.exceptions.TypeMismatchException; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.dataflow.value.IBinaryComparator; +import org.apache.hyracks.api.dataflow.value.IBinaryHashFunction; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.exceptions.SourceLocation; import org.apache.hyracks.data.std.api.IPointable; @@ -61,6 +65,10 @@ public class GetRecordFieldValueEvalFactory implements IScalarEvaluatorFactory { public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { return new IScalarEvaluator() { + private final IBinaryHashFunction fieldNameHashFunction = + BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction(); + private final IBinaryComparator fieldNameComparator = + BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator(); private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage(); private final DataOutput out = resultStorage.getDataOutput(); @@ -120,7 +128,7 @@ public class GetRecordFieldValueEvalFactory implements IScalarEvaluatorFactory { // Look at open fields. subFieldOffset = ARecordSerializerDeserializer.getFieldOffsetByName(serRecord, serRecordOffset, - serRecordLen, serFldName, serFldNameOffset); + serRecordLen, serFldName, serFldNameOffset, fieldNameHashFunction, fieldNameComparator); if (subFieldOffset < 0) { out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG); result.set(resultStorage);
