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

Reply via email to