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