Github user ramkrish86 commented on a diff in the pull request:

    https://github.com/apache/incubator-phoenix/pull/8#discussion_r9903698
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayConstructorExpression.java
 ---
    @@ -62,27 +67,62 @@ public void reset() {
             position = 0;
             Arrays.fill(elements, null);
         }
    -    
    +
         @Override
         public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
    -        for (int i = position >= 0 ? position : 0; i < elements.length; 
i++) {
    -            Expression child = children.get(i);
    -            if (!child.evaluate(tuple, ptr)) {
    -                if (tuple != null && !tuple.isImmutable()) {
    -                    if (position >= 0) position = i;
    -                    return false;
    +        try {
    +            int offset = 0;
    +            // track the elementlength for variable array
    +            int elementLength = 0;
    +            for (int i = position >= 0 ? position : 0; i < 
elements.length; i++) {
    +                Expression child = children.get(i);
    +                if (!child.evaluate(tuple, ptr)) {
    +                    if (tuple != null && !tuple.isImmutable()) {
    +                        if (position >= 0) position = i;
    +                        return false;
    +                    }
    +                } else {
    +                    // track the offset position here from the size of the 
byteStream
    +                    if (!baseType.isFixedWidth() || 
baseType.isCoercibleTo(PDataType.VARCHAR)) {
    +                        Bytes.putInt(offsetArr, offset, 
(byteStream.size()));
    +                        offset += Bytes.SIZEOF_INT;
    +                        elementLength += ptr.getLength();
    +                    }
    +                    if (!child.isStateless()) {
    +                        oStream.write(ptr.get(), ptr.getOffset(), 
ptr.getLength());
    +                    } else {
    +                        oStream.write(ptr.get());
    +                    }
                     }
    -            } else {
    -                elements[i] = baseType.toObject(ptr, child.getDataType(), 
child.getSortOrder());
    +            }
    +            if (position >= 0) position = elements.length;
    +            if (!baseType.isFixedWidth() || 
baseType.isCoercibleTo(PDataType.VARCHAR)) {
    +                oStream.writeByte(0);
    --- End diff --
    
    Ya.. I think this would solve all cases.  Good suggestion. I can now see 
the importance of having null in side the Arrays.. I was not seeing it in terms 
of byte comparision where as looking only interms of arrays and its contents.
    So two arrays
    a, b, null, null 65,66,0,2,0,0
    a.b, null  65,66,0,1,0,0
    So here also the first one becomes bigger? In this one the nulls are not in 
the middle but at the end and still this works out, correct?  Do I need to do 
this in the current patch or in a different one?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. To do so, please top-post your response.
If your project does not have this feature enabled and wishes so, or if the
feature is enabled but not working, please contact infrastructure at
[email protected] or file a JIRA ticket with INFRA.
---

Reply via email to