Github user JamesRTaylor commented on a diff in the pull request:
https://github.com/apache/incubator-phoenix/pull/8#discussion_r9882918
--- 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);
+ int offsetPosition = (byteStream.size());
+ oStream.write(offsetArr);
+ oStream.writeInt(offsetPosition);
+ }
+ // No of elements - writing it as negative as we treat the
array not to fit in Short size
+ oStream.writeInt(-(children.size()));
+ // Version of the array
+ oStream.write(PArrayDataType.ARRAY_SERIALIZATION_VERSION);
+ // For variable length arrays setting this way would mean that
we discard the additional 0 bytes in the
+ // array
+ // that gets created because we don't know the exact size. For
fixed length array elementLength = 0
+ ptr.set(byteStream.getBuffer(), 0, estimatedSize +
elementLength);
--- End diff --
I don't understand this. The byteStream already tracks what you've written.
That's what byteStream.getSize() returns. Why would you want to have some
different, potentially wrong mechanism for tracking the size?
---
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.
---