This is an automated email from the ASF dual-hosted git repository.

alsuliman 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 709ea79  [ASTERIXDB-2516][RT] Prevent passing null type to comparator 
provider
709ea79 is described below

commit 709ea795627554fde484d1f0ce33cc10aab2e0cb
Author: Ali Alsuliman <[email protected]>
AuthorDate: Tue Apr 16 17:56:12 2019 -0700

    [ASTERIXDB-2516][RT] Prevent passing null type to comparator provider
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    This change is to disallow passing null as IAType to the comparator
    provider when asking for a comparator. It also includes few fixes
    for issues appearing as a result of this change.
    
    - changed the generic comparator to check whether the tag of data
    at runtime is a valid tag and throw an exception if not.
    - modified the comparator provider to return non-tagged comparator
    for IAType SHORTWITHOUTINFOTYPE which is a short without tag.
    SHORTWITHOUTINFOTYPE should not use the generic comparator since
    the input data has no tag.
    - fixed Dataset class to consider external dataset when getting
    the IAType of the primary keys. The primary keys for external
    datasets are different from regular datasets. They are not
    part of the record type. Previously, null would be returned.
    This would cause a failure when getting a comparator for the
    primary keys of an external dataset since the type passed is null.
    - fixed the TypeTraitProvider to give the correct lengths for
    duration, day_time_duration, and year_month_duration.
    
    Change-Id: I37767a3f3d1e3b29597d2a4998c0b60005cadb09
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/3336
    Contrib: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Integration-Tests: Jenkins <[email protected]>
    Reviewed-by: Till Westmann <[email protected]>
---
 .../apache/asterix/metadata/entities/Dataset.java  | 16 +++++---
 .../AbstractAGenericBinaryComparator.java          | 41 ++++++++-----------
 .../AbstractAGenericBinaryComparatorFactory.java   | 29 ++++++-------
 .../hash/AMurmurHash3BinaryHashFunctionFamily.java | 14 ++-----
 .../nontagged/BinaryComparatorFactoryProvider.java | 27 +++++++++++--
 .../formats/nontagged/TypeTraitProvider.java       | 47 +++++++++++-----------
 .../data/std/primitive/BooleanPointable.java       |  6 +--
 .../hyracks/data/std/primitive/BytePointable.java  |  6 +--
 .../data/std/primitive/DoublePointable.java        |  6 +--
 .../hyracks/data/std/primitive/FloatPointable.java |  6 +--
 .../data/std/primitive/IntegerPointable.java       |  6 +--
 .../hyracks/data/std/primitive/LongPointable.java  |  6 +--
 .../hyracks/data/std/primitive/ShortPointable.java |  6 +--
 .../hyracks/dataflow/common/utils/SerdeUtils.java  |  4 +-
 14 files changed, 114 insertions(+), 106 deletions(-)

diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
index 855cf78..d207f7f 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
@@ -740,8 +740,10 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
         // Set the serde/traits for primary keys
         for (int i = 0; i < numPrimaryKeys; i++) {
             IAType keyType =
-                    (indicators == null || indicators.get(i) == 0) ? 
itemType.getSubFieldType(partitioningKeys.get(i))
-                            : 
metaType.getSubFieldType(partitioningKeys.get(i));
+                    datasetType == DatasetType.EXTERNAL ? 
IndexingConstants.getFieldType(i)
+                            : (indicators == null || indicators.get(i) == 0)
+                                    ? 
itemType.getSubFieldType(partitioningKeys.get(i))
+                                    : 
metaType.getSubFieldType(partitioningKeys.get(i));
             primaryRecFields[i] = 
serdeProvider.getSerializerDeserializer(keyType);
             primaryTypeTraits[i] = 
TypeTraitProvider.INSTANCE.getTypeTrait(keyType);
         }
@@ -778,8 +780,9 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
             indicators = ((InternalDatasetDetails) 
getDatasetDetails()).getKeySourceIndicator();
         }
         for (int i = 0; i < numPrimaryKeys; i++) {
-            IAType keyType =
-                    (indicators == null || indicators.get(i) == 0) ? 
recordType.getSubFieldType(partitioningKeys.get(i))
+            IAType keyType = datasetType == DatasetType.EXTERNAL ? 
IndexingConstants.getFieldType(i)
+                    : (indicators == null || indicators.get(i) == 0)
+                            ? 
recordType.getSubFieldType(partitioningKeys.get(i))
                             : 
metaType.getSubFieldType(partitioningKeys.get(i));
             cmpFactories[i] = 
cmpFactoryProvider.getBinaryComparatorFactory(keyType, true);
         }
@@ -806,8 +809,9 @@ public class Dataset implements IMetadataEntity<Dataset>, 
IDataset {
             indicators = ((InternalDatasetDetails) 
getDatasetDetails()).getKeySourceIndicator();
         }
         for (int i = 0; i < numPrimaryKeys; i++) {
-            IAType keyType =
-                    (indicators == null || indicators.get(i) == 0) ? 
recordType.getSubFieldType(partitioningKeys.get(i))
+            IAType keyType = datasetType == DatasetType.EXTERNAL ? 
IndexingConstants.getFieldType(i)
+                    : (indicators == null || indicators.get(i) == 0)
+                            ? 
recordType.getSubFieldType(partitioningKeys.get(i))
                             : 
metaType.getSubFieldType(partitioningKeys.get(i));
             hashFuncFactories[i] = 
BinaryHashFunctionFactoryProvider.INSTANCE.getBinaryHashFunctionFactory(keyType);
         }
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparator.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparator.java
index 4510310..e907f75 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparator.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparator.java
@@ -62,7 +62,7 @@ abstract class AbstractAGenericBinaryComparator implements 
IBinaryComparator {
             new 
PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY).createBinaryComparator();
     private final IBinaryComparator ascByteArrayComp =
             new 
PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY).createBinaryComparator();
-    // the type fields can be null
+
     protected final IAType leftType;
     protected final IAType rightType;
     private final ListObjectPool<IMutableValueStorage, Void> storageAllocator 
= new ListObjectPool<>(STORAGE_FACTORY);
@@ -70,28 +70,27 @@ abstract class AbstractAGenericBinaryComparator implements 
IBinaryComparator {
     private final ListObjectPool<SortedRecord, ARecordType> recordPool = new 
ListObjectPool<>(RECORD_FACTORY);
 
     AbstractAGenericBinaryComparator(IAType leftType, IAType rightType) {
-        // factory should have already made sure to get the actual type
+        // factory should have already made sure to get the actual type (and 
no null types)
         this.leftType = leftType;
         this.rightType = rightType;
     }
 
     protected final int compare(IAType leftType, byte[] b1, int s1, int l1, 
IAType rightType, byte[] b2, int s2, int l2)
             throws HyracksDataException {
-        if (b1[s1] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
-            return b2[s2] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG ? 0 : -1;
-        } else if (b2[s2] == ATypeTag.SERIALIZED_MISSING_TYPE_TAG) {
-            return 1;
-        }
-        if (b1[s1] == ATypeTag.SERIALIZED_NULL_TYPE_TAG) {
-            return b2[s2] == ATypeTag.SERIALIZED_NULL_TYPE_TAG ? 0 : -1;
-        } else if (b2[s2] == ATypeTag.SERIALIZED_NULL_TYPE_TAG) {
-            return 1;
-        }
         ATypeTag tag1 = 
EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b1[s1]);
         ATypeTag tag2 = 
EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b2[s2]);
-        // tag being null could mean several things among of which is that the 
passed args are not tagged
         if (tag1 == null || tag2 == null) {
-            return RawBinaryComparatorFactory.compare(b1, s1, l1, b2, s2, l2);
+            throw new IllegalStateException("Could not recognize the type of 
data.");
+        }
+        if (tag1 == ATypeTag.MISSING) {
+            return tag2 == ATypeTag.MISSING ? 0 : -1;
+        } else if (tag2 == ATypeTag.MISSING) {
+            return 1;
+        }
+        if (tag1 == ATypeTag.NULL) {
+            return tag2 == ATypeTag.NULL ? 0 : -1;
+        } else if (tag2 == ATypeTag.NULL) {
+            return 1;
         }
         if (ATypeHierarchy.isCompatible(tag1, tag2) && 
ATypeHierarchy.getTypeDomain(tag1) == Domain.NUMERIC) {
             return ComparatorUtil.compareNumbers(tag1, b1, s1 + 1, tag2, b2, 
s2 + 1);
@@ -142,9 +141,9 @@ abstract class AbstractAGenericBinaryComparator implements 
IBinaryComparator {
             case BINARY:
                 return ascByteArrayComp.compare(b1, s1 + 1, l1 - 1, b2, s2 + 
1, l2 - 1);
             case ARRAY:
-                return compareArrays(leftType, b1, s1, l1, rightType, b2, s2, 
l2);
+                return compareArrays(leftType, b1, s1, rightType, b2, s2);
             case OBJECT:
-                return compareRecords(leftType, b1, s1, l1, rightType, b2, s2, 
l2);
+                return compareRecords(leftType, b1, s1, rightType, b2, s2);
             default:
                 return RawBinaryComparatorFactory.compare(b1, s1, l1, b2, s2, 
l2);
         }
@@ -154,11 +153,8 @@ abstract class AbstractAGenericBinaryComparator implements 
IBinaryComparator {
         return AIntervalAscPartialBinaryComparatorFactory.compare(b1, s1 + 1, 
l1 - 1, b2, s2 + 1, l2 - 1);
     }
 
-    private int compareArrays(IAType leftType, byte[] b1, int s1, int l1, 
IAType rightType, byte[] b2, int s2, int l2)
+    private int compareArrays(IAType leftType, byte[] b1, int s1, IAType 
rightType, byte[] b2, int s2)
             throws HyracksDataException {
-        if (leftType == null || rightType == null) {
-            return RawBinaryComparatorFactory.compare(b1, s1, l1, b2, s2, l2);
-        }
         int leftNumItems = ListAccessorUtil.numberOfItems(b1, s1);
         int rightNumItems = ListAccessorUtil.numberOfItems(b2, s2);
         IAType leftArrayType = TypeComputeUtils.getActualTypeOrOpen(leftType, 
ATypeTag.ARRAY);
@@ -195,11 +191,8 @@ abstract class AbstractAGenericBinaryComparator implements 
IBinaryComparator {
         }
     }
 
-    private int compareRecords(IAType leftType, byte[] b1, int s1, int l1, 
IAType rightType, byte[] b2, int s2, int l2)
+    private int compareRecords(IAType leftType, byte[] b1, int s1, IAType 
rightType, byte[] b2, int s2)
             throws HyracksDataException {
-        if (leftType == null || rightType == null) {
-            return RawBinaryComparatorFactory.compare(b1, s1, l1, b2, s2, l2);
-        }
         ARecordType leftRecordType = (ARecordType) 
TypeComputeUtils.getActualTypeOrOpen(leftType, ATypeTag.OBJECT);
         ARecordType rightRecordType = (ARecordType) 
TypeComputeUtils.getActualTypeOrOpen(rightType, ATypeTag.OBJECT);
         SortedRecord leftRecord = recordPool.allocate(leftRecordType);
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparatorFactory.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparatorFactory.java
index 140db22..c743e6e 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparatorFactory.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AbstractAGenericBinaryComparatorFactory.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.dataflow.data.nontagged.comparators;
 
 import org.apache.asterix.om.typecomputer.impl.TypeComputeUtils;
+import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -28,36 +29,32 @@ import org.apache.hyracks.api.io.IPersistedResourceRegistry;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
-public abstract class AbstractAGenericBinaryComparatorFactory implements 
IBinaryComparatorFactory {
+abstract class AbstractAGenericBinaryComparatorFactory implements 
IBinaryComparatorFactory {
 
     private static final long serialVersionUID = 1L;
-    // these fields can be null
-    protected final IAType leftType;
-    protected final IAType rightType;
+    final IAType leftType;
+    final IAType rightType;
 
     AbstractAGenericBinaryComparatorFactory(IAType leftType, IAType rightType) 
{
-        this.leftType = leftType == null ? null : 
TypeComputeUtils.getActualType(leftType);
-        this.rightType = rightType == null ? null : 
TypeComputeUtils.getActualType(rightType);
+        this.leftType = TypeComputeUtils.getActualType(leftType);
+        this.rightType = TypeComputeUtils.getActualType(rightType);
     }
 
     JsonNode convertToJson(IPersistedResourceRegistry registry, Class<? 
extends IJsonSerializable> clazz, long version)
             throws HyracksDataException {
         ObjectNode jsonNode = registry.getClassIdentifier(clazz, version);
-        if (leftType != null) {
-            jsonNode.set("leftType", leftType.toJson(registry));
-        }
-        if (rightType != null) {
-            jsonNode.set("rightType", rightType.toJson(registry));
-        }
+        jsonNode.set("leftType", leftType.toJson(registry));
+        jsonNode.set("rightType", rightType.toJson(registry));
         return jsonNode;
     }
 
     static IJsonSerializable convertToObject(IPersistedResourceRegistry 
registry, JsonNode json, boolean asc)
             throws HyracksDataException {
-        JsonNode leftNode = json.get("leftType");
-        JsonNode rightNode = json.get("rightType");
-        IAType leftType = leftNode == null || leftNode.isNull() ? null : 
(IAType) registry.deserialize(leftNode);
-        IAType rightType = rightNode == null || rightNode.isNull() ? null : 
(IAType) registry.deserialize(rightNode);
+        JsonNode left = json.get("leftType");
+        JsonNode right = json.get("rightType");
+        // default to ANY for comparators that didn't originally have the new 
type fields
+        IAType leftType = left == null || left.isNull() ? BuiltinType.ANY : 
(IAType) registry.deserialize(left);
+        IAType rightType = right == null || right.isNull() ? BuiltinType.ANY : 
(IAType) registry.deserialize(right);
         return asc ? new AGenericAscBinaryComparatorFactory(leftType, 
rightType)
                 : new AGenericDescBinaryComparatorFactory(leftType, rightType);
     }
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AMurmurHash3BinaryHashFunctionFamily.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AMurmurHash3BinaryHashFunctionFamily.java
index 020fbd1..f02c764 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AMurmurHash3BinaryHashFunctionFamily.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AMurmurHash3BinaryHashFunctionFamily.java
@@ -122,22 +122,19 @@ public class AMurmurHash3BinaryHashFunctionFamily 
implements IBinaryHashFunction
                             valueBuffer.getLength(), seed);
                 case ARRAY:
                     try {
-                        return hashArray(type, bytes, offset, length);
+                        return hashArray(type, bytes, offset);
                     } catch (IOException e) {
                         throw HyracksDataException.create(e);
                     }
                 case OBJECT:
-                    return hashRecord(type, bytes, offset, length);
+                    return hashRecord(type, bytes, offset);
                 case DOUBLE:
                 default:
                     return MurmurHash3BinaryHash.hash(bytes, offset, length, 
seed);
             }
         }
 
-        private int hashArray(IAType type, byte[] bytes, int offset, int 
length) throws IOException {
-            if (type == null) {
-                return MurmurHash3BinaryHash.hash(bytes, offset, length, seed);
-            }
+        private int hashArray(IAType type, byte[] bytes, int offset) throws 
IOException {
             IAType arrayType = TypeComputeUtils.getActualTypeOrOpen(type, 
ATypeTag.ARRAY);
             IAType itemType = ((AbstractCollectionType) 
arrayType).getItemType();
             ATypeTag itemTag = itemType.getTypeTag();
@@ -158,10 +155,7 @@ public class AMurmurHash3BinaryHashFunctionFamily 
implements IBinaryHashFunction
             return hash;
         }
 
-        private int hashRecord(IAType type, byte[] bytes, int offset, int 
length) throws HyracksDataException {
-            if (type == null) {
-                return MurmurHash3BinaryHash.hash(bytes, offset, length, seed);
-            }
+        private int hashRecord(IAType type, byte[] bytes, int offset) throws 
HyracksDataException {
             ARecordType recordType = (ARecordType) 
TypeComputeUtils.getActualTypeOrOpen(type, ATypeTag.OBJECT);
             SortedRecord record = recordPool.allocate(recordType);
             IPointable fieldValue = voidPointableAllocator.allocate(null);
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryComparatorFactoryProvider.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryComparatorFactoryProvider.java
index 7567e0c..b3a6d27 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryComparatorFactoryProvider.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryComparatorFactoryProvider.java
@@ -33,6 +33,7 @@ import 
org.apache.asterix.dataflow.data.nontagged.comparators.APolygonPartialBin
 import 
org.apache.asterix.dataflow.data.nontagged.comparators.ARectanglePartialBinaryComparatorFactory;
 import 
org.apache.asterix.dataflow.data.nontagged.comparators.AUUIDPartialBinaryComparatorFactory;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.hyracks.algebricks.data.IBinaryComparatorFactoryProvider;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
@@ -91,19 +92,23 @@ public class BinaryComparatorFactoryProvider implements 
IBinaryComparatorFactory
     @Override
     public IBinaryComparatorFactory getBinaryComparatorFactory(Object 
leftType, Object rightType, boolean ascending,
             boolean ignoreCase) {
-        if (leftType == null || rightType == null) {
-            return createGenericBinaryComparatorFactory(null, null, ascending);
-        }
         IAType left = (IAType) leftType;
         IAType right = (IAType) rightType;
+        // TODO(ali): what if someone passed ignoreCase=true and type ANY (at 
runtime it could be a string)?
         if (left.getTypeTag() == ATypeTag.STRING && right.getTypeTag() == 
ATypeTag.STRING && ignoreCase) {
             return addOffset(UTF8STRING_LOWERCASE_POINTABLE_INSTANCE, 
ascending);
         }
+        if (isShortWithoutTag(left, right)) {
+            return SHORT_POINTABLE_INSTANCE;
+        }
         return createGenericBinaryComparatorFactory(left, right, ascending);
     }
 
     @Override
     public IBinaryComparatorFactory getBinaryComparatorFactory(Object 
leftType, Object rightType, boolean ascending) {
+        if (isShortWithoutTag((IAType) leftType, (IAType) rightType)) {
+            return SHORT_POINTABLE_INSTANCE;
+        }
         // During a comparison, since proper type promotion among several 
numeric types are required,
         // we will use AGenericAscBinaryComparatorFactory, instead of using a 
specific comparator
         return createGenericBinaryComparatorFactory((IAType) leftType, 
(IAType) rightType, ascending);
@@ -113,8 +118,9 @@ public class BinaryComparatorFactoryProvider implements 
IBinaryComparatorFactory
         switch (type) {
             case ANY:
             case UNION:
+                // i think UNION shouldn't be allowed. the actual type could 
be closed array or record. ANY would fail.
                 // we could do smth better for nullable fields
-                return createGenericBinaryComparatorFactory(null, null, 
ascending);
+                return createGenericBinaryComparatorFactory(BuiltinType.ANY, 
BuiltinType.ANY, ascending);
             case NULL:
             case MISSING:
                 return new AnyBinaryComparatorFactory();
@@ -186,4 +192,17 @@ public class BinaryComparatorFactoryProvider implements 
IBinaryComparatorFactory
             return AIntervalDescPartialBinaryComparatorFactory.INSTANCE;
         }
     }
+
+    private static boolean isShortWithoutTag(IAType left, IAType right) {
+        ATypeTag leftTag = left.getTypeTag();
+        ATypeTag rightTag = right.getTypeTag();
+        if (leftTag != ATypeTag.SHORTWITHOUTTYPEINFO && rightTag != 
ATypeTag.SHORTWITHOUTTYPEINFO) {
+            return false;
+        }
+        if (leftTag != rightTag) {
+            // this should not happen (i.e. comparing untagged (short without 
tag) vs some tagged)
+            throw new IllegalStateException();
+        }
+        return true;
+    }
 }
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
index 8cfe78d..51f4664 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/TypeTraitProvider.java
@@ -27,18 +27,17 @@ import 
org.apache.hyracks.data.std.primitive.VarLengthTypeTrait;
 public class TypeTraitProvider implements ITypeTraitProvider {
 
     // WARNING: the byte sizes depend on the serializer!
-    // currently assuming a serializer that adds a 1-byte type indicator before
-    // the data
-    private static final ITypeTraits ONEBYTETYPETRAIT = new 
FixedLengthTypeTrait(1 + 1);
-    private static final ITypeTraits TWOBYTETYPETRAIT = new 
FixedLengthTypeTrait(2 + 1);
-    private static final ITypeTraits FOURBYTETYPETRAIT = new 
FixedLengthTypeTrait(4 + 1);
-    private static final ITypeTraits EIGHTBYTETYPETRAIT = new 
FixedLengthTypeTrait(8 + 1);
-    private static final ITypeTraits SIXTEENBYTETYPETRAIT = new 
FixedLengthTypeTrait(16 + 1);
-    private static final ITypeTraits SEVENTEENBYTETYPETRAIT = new 
FixedLengthTypeTrait(17 + 1);
-    private static final ITypeTraits THIRTYTWOBYTETYPETRAIT = new 
FixedLengthTypeTrait(32 + 1);
-    private static final ITypeTraits TWENTYFOURBYTETYPETRAIT = new 
FixedLengthTypeTrait(24 + 1);
-
-    private static final ITypeTraits VARLENTYPETRAIT = 
VarLengthTypeTrait.INSTANCE;
+    // currently assuming a serializer that adds a 1-byte type indicator 
before the data
+    private static final ITypeTraits ONE_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(1 + 1);
+    private static final ITypeTraits TWO_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(2 + 1);
+    private static final ITypeTraits FOUR_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(4 + 1);
+    private static final ITypeTraits EIGHT_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(8 + 1);
+    private static final ITypeTraits TWELVE_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(12 + 1);
+    private static final ITypeTraits SIXTEEN_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(16 + 1);
+    private static final ITypeTraits SEVENTEEN_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(17 + 1);
+    private static final ITypeTraits THIRTY_TWO_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(32 + 1);
+    private static final ITypeTraits TWENTY_FOUR_BYTE_TYPE_TRAIT = new 
FixedLengthTypeTrait(24 + 1);
+    private static final ITypeTraits VAR_LEN_TYPE_TRAIT = 
VarLengthTypeTrait.INSTANCE;
 
     public static final TypeTraitProvider INSTANCE = new TypeTraitProvider();
 
@@ -51,31 +50,33 @@ public class TypeTraitProvider implements 
ITypeTraitProvider {
         switch (type.getTypeTag()) {
             case BOOLEAN:
             case TINYINT:
-                return ONEBYTETYPETRAIT;
+                return ONE_BYTE_TYPE_TRAIT;
             case SMALLINT:
-                return TWOBYTETYPETRAIT;
+                return TWO_BYTE_TYPE_TRAIT;
             case INTEGER:
             case FLOAT:
             case DATE:
             case TIME:
-                return FOURBYTETYPETRAIT;
+            case YEARMONTHDURATION:
+                return FOUR_BYTE_TYPE_TRAIT;
             case BIGINT:
             case DOUBLE:
             case DATETIME:
+            case DAYTIMEDURATION:
+                return EIGHT_BYTE_TYPE_TRAIT;
             case DURATION:
-                return EIGHTBYTETYPETRAIT;
+                return TWELVE_BYTE_TYPE_TRAIT;
             case POINT:
             case UUID:
-                return SIXTEENBYTETYPETRAIT;
+                return SIXTEEN_BYTE_TYPE_TRAIT;
             case INTERVAL:
-                return SEVENTEENBYTETYPETRAIT;
+                return SEVENTEEN_BYTE_TYPE_TRAIT;
             case POINT3D:
-                return TWENTYFOURBYTETYPETRAIT;
+                return TWENTY_FOUR_BYTE_TYPE_TRAIT;
             case LINE:
-                return THIRTYTWOBYTETYPETRAIT;
-            default: {
-                return VARLENTYPETRAIT;
-            }
+                return THIRTY_TWO_BYTE_TYPE_TRAIT;
+            default:
+                return VAR_LEN_TYPE_TRAIT;
         }
     }
 }
\ No newline at end of file
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
index 3b122f8..8615529 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/BooleanPointable.java
@@ -33,9 +33,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class BooleanPointable extends AbstractPointable implements 
IHashable, IComparable {
 
-    private static final int LENGTH = 1;
+    private static final int SIZE = 1;
     public static final BooleanPointableFactory FACTORY = new 
BooleanPointableFactory();
-    public static final FixedLengthTypeTrait TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH);
+    public static final FixedLengthTypeTrait TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE);
 
     public static class BooleanPointableFactory implements IPointableFactory {
         private static final long serialVersionUID = 1L;
@@ -99,7 +99,7 @@ public final class BooleanPointable extends AbstractPointable 
implements IHashab
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Boolean.compare(getBoolean(b1, s1), getBoolean(b2, s2));
     }
 
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 41e7c82..5ac6833 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
@@ -34,9 +34,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class BytePointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 1;
+    private static final int SIZE = 1;
     public static final BytePointableFactory FACTORY = new 
BytePointableFactory();
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH);
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE);
 
     public static final class BytePointableFactory implements 
IPointableFactory {
         private static final long serialVersionUID = 1L;
@@ -89,7 +89,7 @@ public final class BytePointable extends AbstractPointable 
implements IHashable,
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Byte.compare(getByte(b1, s1), getByte(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
index ee31f30..4f5d0a1 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/DoublePointable.java
@@ -34,9 +34,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class DoublePointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 8;
+    private static final int SIZE = 8;
     public static final DoublePointableFactory FACTORY = new 
DoublePointableFactory();
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH) {
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE) {
         private static final long serialVersionUID = 7348262203696059687L;
 
         //TODO fix RTREE logic based on class comparision in 
LSMRTreeUtils#proposeBestLinearizer
@@ -112,7 +112,7 @@ public final class DoublePointable extends 
AbstractPointable implements IHashabl
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Double.compare(getDouble(b1, s1), getDouble(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
index 0e330e7..289e441 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/FloatPointable.java
@@ -34,8 +34,8 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class FloatPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 4;
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH);
+    private static final int SIZE = 4;
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE);
     public static final FloatPointableFactory FACTORY = new 
FloatPointableFactory();
 
     public static final class FloatPointableFactory implements 
IPointableFactory {
@@ -95,7 +95,7 @@ public final class FloatPointable extends AbstractPointable 
implements IHashable
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Float.compare(getFloat(b1, s1), getFloat(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
index 453c568..ad80e23 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/IntegerPointable.java
@@ -34,9 +34,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class IntegerPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 4;
+    private static final int SIZE = 4;
     public static final IntegerPointableFactory FACTORY = new 
IntegerPointableFactory();
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH) {
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE) {
         private static final long serialVersionUID = -7178318032449879790L;
 
         //TODO fix RTREE logic based on class comparision in 
LSMRTreeUtils#proposeBestLinearizer
@@ -101,7 +101,7 @@ public final class IntegerPointable extends 
AbstractPointable implements IHashab
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Integer.compare(getInteger(b1, s1), getInteger(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/LongPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/LongPointable.java
index 5929171..2de7b82 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/LongPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/LongPointable.java
@@ -34,9 +34,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class LongPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 8;
+    private static final int SIZE = 8;
     public static final LongPointableFactory FACTORY = new 
LongPointableFactory();
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH);
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE);
 
     public static class LongPointableFactory implements IPointableFactory {
         private static final long serialVersionUID = 1L;
@@ -113,7 +113,7 @@ public final class LongPointable extends AbstractPointable 
implements IHashable,
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Long.compare(getLong(b1, s1), getLong(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
index 48599e9..3806c0c 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ShortPointable.java
@@ -34,8 +34,8 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 public final class ShortPointable extends AbstractPointable implements 
IHashable, IComparable, INumeric {
 
-    private static final int LENGTH = 2;
-    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(LENGTH);
+    private static final int SIZE = 2;
+    public static final ITypeTraits TYPE_TRAITS = new 
FixedLengthTypeTrait(SIZE);
     public static final IPointableFactory FACTORY = new 
ShortPointableFactory();
 
     public static final class ShortPointableFactory implements 
IPointableFactory {
@@ -90,7 +90,7 @@ public final class ShortPointable extends AbstractPointable 
implements IHashable
     }
 
     public static int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, 
int l2) {
-        DataUtils.ensureLengths(LENGTH, l1, l2);
+        DataUtils.ensureLengths(SIZE, l1, l2);
         return Short.compare(getShort(b1, s1), getShort(b2, s2));
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
index 2f200c0..292482d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
@@ -23,6 +23,7 @@ import 
org.apache.hyracks.api.dataflow.value.IBinaryComparator;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
+import org.apache.hyracks.data.std.accessors.BooleanBinaryComparatorFactory;
 import org.apache.hyracks.data.std.accessors.DoubleBinaryComparatorFactory;
 import org.apache.hyracks.data.std.accessors.FloatBinaryComparatorFactory;
 import org.apache.hyracks.data.std.accessors.IntegerBinaryComparatorFactory;
@@ -126,8 +127,7 @@ public class SerdeUtils {
             return DoubleBinaryComparatorFactory.INSTANCE;
         }
         if (serde instanceof BooleanSerializerDeserializer) {
-            // TODO(ali): how come?
-            throw new UnsupportedOperationException("Binary comparator factory 
for Boolean not implemented.");
+            return BooleanBinaryComparatorFactory.INSTANCE;
         }
         if (serde instanceof UTF8StringSerializerDeserializer) {
             return 
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY);

Reply via email to