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

    https://github.com/apache/incubator-phoenix/pull/8#discussion_r9938526
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayConstructorExpression.java
 ---
    @@ -62,27 +63,54 @@ 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 noOfElements =  children.size();
    +            int elementLength = 0;
    +            byteStream = new TrustedByteArrayOutputStream(estimatedSize);
    +            oStream = new DataOutputStream(byteStream);
    +            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()) {
    +                        offset = byteStream.size();
    +                        offsetPos[i] = offset;
    --- End diff --
    
    I don't think we need to do that - we want to be able to lookup a value in
    two array dereferences - one to get the offset (and next offset), and the
    second one to locate the value. With the way we'd be writing nulls, the
    offsets would work out fine. It's ok if they get repeated.
    
    Note also, we're ignoring null values at the end which is what we want.
    
    
    On Thu, Feb 20, 2014 at 11:43 PM, ramkrish86 
<[email protected]>wrote:
    
    > In
    > 
phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayConstructorExpression.java:
    >
    > > +            int noOfElements =  children.size();
    > > +            int elementLength = 0;
    > > +            byteStream = new 
TrustedByteArrayOutputStream(estimatedSize);
    > > +            oStream = new DataOutputStream(byteStream);
    > > +            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()) {
    > > +                        offset = byteStream.size();
    > > +                        offsetPos[i] = offset;
    >
    > So may be while writing the offset of this null counter, we could negate
    > the offset so that on seeing a negative offset we could understand that
    > that is a count of null. What do you think?
    >
    > --
    > Reply to this email directly or view it on 
GitHub<https://github.com/apache/incubator-phoenix/pull/8/files#r9938328>
    > .
    >


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