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 072b98da24 [ASTERIXDB-3446][RT] Use VoidPointable instead of
IVisitablePointable
072b98da24 is described below
commit 072b98da24ef8a3071b5bb7c44fca176cf779a12
Author: Ali Alsuliman <[email protected]>
AuthorDate: Thu Jun 27 00:58:04 2024 +0300
[ASTERIXDB-3446][RT] Use VoidPointable instead of IVisitablePointable
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
For the result pointable of the cast(), Use VoidPointable instead of
IVisitablePointable to avoid unnecessary objects creation when
set() is called by the result pointable.
Change-Id: Ie1006b20fb9d7fbd6e4c0f04e67b0e14d85116f5
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18404
Reviewed-by: Ali Alsuliman <[email protected]>
Reviewed-by: Wail Alkowaileet <[email protected]>
Integration-Tests: Jenkins <[email protected]>
Tested-by: Ali Alsuliman <[email protected]>
---
.../test/om/lazy/LazyVisitablePointableTest.java | 15 +++----
.../asterix/om/pointables/cast/ACastVisitor.java | 45 ++++++++++---------
.../asterix/om/pointables/cast/AListCaster.java | 27 +++++-------
.../asterix/om/pointables/cast/ARecordCaster.java | 31 +++++++-------
.../asterix/om/pointables/cast/CastResult.java | 50 ++++++++++++++++++++++
.../ListifyAggregateFunctionEvalFactory.java | 2 +-
.../functions/AbstractArrayAddRemoveEval.java | 2 +-
.../functions/AbstractArrayProcessArraysEval.java | 2 +-
.../functions/ArrayFlattenDescriptor.java | 2 +-
.../functions/ArrayIntersectDescriptor.java | 2 +-
.../functions/ArrayReplaceEvaluator.java | 2 +-
.../evaluators/functions/ArrayStarDescriptor.java | 2 +-
.../evaluators/functions/CastTypeEvaluator.java | 36 +++++-----------
.../evaluators/functions/CastTypeLaxEvaluator.java | 4 +-
.../functions/ToObjectVarStrDescriptor.java | 12 +++---
.../records/AbstractRecordPairsEvaluator.java | 2 +-
.../functions/records/RecordConcatEvalFactory.java | 21 +++++----
.../functions/records/RecordReplaceEvaluator.java | 4 +-
.../functions/records/RecordUnwrapEvaluator.java | 15 +++----
.../functions/records/RecordValuesEvaluator.java | 2 +-
20 files changed, 150 insertions(+), 128 deletions(-)
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
index d981be1ed6..d6cf02615f 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/om/lazy/LazyVisitablePointableTest.java
@@ -29,12 +29,10 @@ import
org.apache.asterix.om.lazy.RecordLazyVisitablePointable;
import org.apache.asterix.om.lazy.TypedRecordLazyVisitablePointable;
import org.apache.asterix.om.pointables.ARecordVisitablePointable;
import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
-import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.IAType;
import org.apache.asterix.runtime.evaluators.comparisons.DeepEqualAssessor;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
import org.junit.Assert;
@@ -55,7 +53,7 @@ public class LazyVisitablePointableTest {
private final RecordLazyVisitablePointable openLazyPointable;
private final ARecordVisitablePointable openPointable;
private final ArrayBackedValueStorage recordStorage;
- private final Triple<IVisitablePointable, IAType, Boolean> arg;
+ private final CastResult castResult;
static {
BASE_DIR = "data";
@@ -74,8 +72,7 @@ public class LazyVisitablePointableTest {
openLazyPointable = new RecordLazyVisitablePointable(true);
openPointable = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
recordStorage = new ArrayBackedValueStorage();
- arg = new Triple<>(null, null, null);
- arg.third = Boolean.FALSE;
+ castResult = new CastResult(null, null);
}
private void prepareParser(String path) throws IOException {
@@ -91,12 +88,12 @@ public class LazyVisitablePointableTest {
//Infer the schema
ARecordType inferredFromOpen = (ARecordType)
openLazyPointable.accept(schemaInference, "fromOpen");
ARecordVisitablePointable closedPointable = new
ARecordVisitablePointable(inferredFromOpen);
- arg.first = closedPointable;
- arg.second = inferredFromOpen;
+ castResult.setOutPointable(closedPointable);
+ castResult.setOutType(inferredFromOpen);
//Cast to closed using the inferred type
openPointable.set(recordStorage);
- openPointable.accept(castVisitor, arg);
+ openPointable.accept(castVisitor, castResult);
//Ensure both closed and open records are the same
Assert.assertTrue(deepEqualAssessor.isEqual(openPointable,
closedPointable));
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
index 993edee384..2dd7bfe5f1 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
@@ -37,9 +37,9 @@ import org.apache.asterix.om.types.AbstractCollectionType;
import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
/**
@@ -53,7 +53,7 @@ import
org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
* memory/storage layout, the visitor will change the layout as specified at
* runtime.
*/
-public class ACastVisitor implements IVisitablePointableVisitor<Void,
Triple<IVisitablePointable, IAType, Boolean>> {
+public class ACastVisitor implements IVisitablePointableVisitor<Void,
CastResult> {
private final Map<IVisitablePointable, ARecordCaster> raccessorToCaster =
new HashMap<>();
private final Map<IVisitablePointable, AListCaster> laccessorToCaster =
new HashMap<>();
@@ -76,8 +76,7 @@ public class ACastVisitor implements
IVisitablePointableVisitor<Void, Triple<IVi
}
@Override
- public Void visit(AListVisitablePointable accessor,
Triple<IVisitablePointable, IAType, Boolean> arg)
- throws HyracksDataException {
+ public Void visit(AListVisitablePointable accessor, CastResult castResult)
throws HyracksDataException {
AListCaster caster = laccessorToCaster.get(accessor);
if (caster == null) {
caster = new AListCaster();
@@ -85,27 +84,26 @@ public class ACastVisitor implements
IVisitablePointableVisitor<Void, Triple<IVi
}
AbstractCollectionType resultType;
- switch (arg.second.getTypeTag()) {
+ switch (castResult.getOutType().getTypeTag()) {
case ANY:
resultType = accessor.ordered() ?
DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE
:
DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE;
break;
case ARRAY:
case MULTISET:
- resultType = (AbstractCollectionType) arg.second;
+ resultType = (AbstractCollectionType) castResult.getOutType();
break;
default:
throw new RuntimeDataException(ErrorCode.TYPE_CONVERT,
sourceLoc,
- accessor.ordered() ? ATypeTag.ARRAY :
ATypeTag.MULTISET, arg.second.getTypeTag());
+ accessor.ordered() ? ATypeTag.ARRAY :
ATypeTag.MULTISET, castResult.getOutType().getTypeTag());
}
- caster.castList(accessor, arg.first, resultType, this);
+ caster.castList(accessor, castResult.getOutPointable(), resultType,
this);
return null;
}
@Override
- public Void visit(ARecordVisitablePointable accessor,
Triple<IVisitablePointable, IAType, Boolean> arg)
- throws HyracksDataException {
+ public Void visit(ARecordVisitablePointable accessor, CastResult
castResult) throws HyracksDataException {
ARecordCaster caster = raccessorToCaster.get(accessor);
if (caster == null) {
caster = new ARecordCaster();
@@ -113,47 +111,48 @@ public class ACastVisitor implements
IVisitablePointableVisitor<Void, Triple<IVi
}
ARecordType resultType;
- switch (arg.second.getTypeTag()) {
+ IAType oType = castResult.getOutType();
+ switch (oType.getTypeTag()) {
case ANY:
resultType = DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
break;
case OBJECT:
- resultType = (ARecordType) arg.second;
+ resultType = (ARecordType) oType;
break;
default:
- throw new RuntimeDataException(ErrorCode.TYPE_CONVERT,
sourceLoc, ATypeTag.OBJECT,
- arg.second.getTypeTag());
+ throw new RuntimeDataException(ErrorCode.TYPE_CONVERT,
sourceLoc, ATypeTag.OBJECT, oType.getTypeTag());
}
- caster.castRecord(accessor, arg.first, resultType, this);
+ caster.castRecord(accessor, castResult.getOutPointable(), resultType,
this);
return null;
}
@Override
- public Void visit(AFlatValuePointable accessor,
Triple<IVisitablePointable, IAType, Boolean> arg)
- throws HyracksDataException {
- if (arg.second == null) {
+ public Void visit(AFlatValuePointable accessor, CastResult castResult)
throws HyracksDataException {
+ IAType oType = castResult.getOutType();
+ IPointable outPointable = castResult.getOutPointable();
+ if (oType == null) {
// for open type case
- arg.first.set(accessor);
+ outPointable.set(accessor);
return null;
}
// set the pointer for result
- ATypeTag reqTypeTag = (arg.second).getTypeTag();
+ ATypeTag reqTypeTag = oType.getTypeTag();
if (reqTypeTag == ATypeTag.ANY) {
// for open type case
- arg.first.set(accessor);
+ outPointable.set(accessor);
return null;
}
ATypeTag inputTypeTag =
EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(accessor.getByteArray()[accessor.getStartOffset()]);
if (!needPromote(inputTypeTag, reqTypeTag)) {
- arg.first.set(accessor);
+ outPointable.set(accessor);
} else {
try {
castBuffer.reset();
ATypeHierarchy.convertNumericTypeByteArray(accessor.getByteArray(),
accessor.getStartOffset(),
accessor.getLength(), reqTypeTag,
castBuffer.getDataOutput(), strictDemote);
- arg.first.set(castBuffer);
+ outPointable.set(castBuffer);
} catch (HyracksDataException e) {
throw e;
} catch (IOException e) {
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
index 492a9d3dd7..96c7db1c5a 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
@@ -26,7 +26,6 @@ import java.util.List;
import org.apache.asterix.builders.OrderedListBuilder;
import org.apache.asterix.builders.UnorderedListBuilder;
import org.apache.asterix.om.pointables.AListVisitablePointable;
-import org.apache.asterix.om.pointables.PointableAllocator;
import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.types.ATypeTag;
@@ -34,8 +33,9 @@ import org.apache.asterix.om.types.AbstractCollectionType;
import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.om.utils.ResettableByteArrayOutputStream;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
/**
* This class is to do the runtime type cast for a list. It is ONLY visible to
@@ -43,20 +43,15 @@ import
org.apache.hyracks.api.exceptions.HyracksDataException;
*/
class AListCaster {
- // for storing the cast result
- private final IVisitablePointable itemTempReference =
PointableAllocator.allocateUnrestableEmpty();
- private final Triple<IVisitablePointable, IAType, Boolean> itemVisitorArg =
- new Triple<>(itemTempReference, null, null);
-
+ private final CastResult itemCastResult = new CastResult(new
VoidPointable(), null);
private final UnorderedListBuilder unOrderedListBuilder = new
UnorderedListBuilder();
private final OrderedListBuilder orderedListBuilder = new
OrderedListBuilder();
-
private final ResettableByteArrayOutputStream dataBos = new
ResettableByteArrayOutputStream();
private final DataOutput dataDos = new DataOutputStream(dataBos);
private IAType reqItemType;
- public void castList(AListVisitablePointable listAccessor,
IVisitablePointable resultAccessor,
- AbstractCollectionType reqType, ACastVisitor visitor) throws
HyracksDataException {
+ public void castList(AListVisitablePointable listAccessor, IPointable
castOutResult, AbstractCollectionType reqType,
+ ACastVisitor visitor) throws HyracksDataException {
if (reqType.getTypeTag().equals(ATypeTag.MULTISET)) {
unOrderedListBuilder.reset(reqType);
reqItemType = reqType.getItemType();
@@ -77,16 +72,16 @@ class AListCaster {
ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
.deserialize(itemTypeTag.getByteArray()[itemTypeTag.getStartOffset()]);
if (reqItemType == null ||
reqItemType.getTypeTag().equals(ATypeTag.ANY)) {
- itemVisitorArg.second =
DefaultOpenFieldType.getDefaultOpenFieldType(typeTag);
+
itemCastResult.setOutType(DefaultOpenFieldType.getDefaultOpenFieldType(typeTag));
} else {
- itemVisitorArg.second = reqItemType;
+ itemCastResult.setOutType(reqItemType);
}
- item.accept(visitor, itemVisitorArg);
+ item.accept(visitor, itemCastResult);
if (reqType.getTypeTag().equals(ATypeTag.ARRAY)) {
- orderedListBuilder.addItem(itemVisitorArg.first);
+ orderedListBuilder.addItem(itemCastResult.getOutPointable());
}
if (reqType.getTypeTag().equals(ATypeTag.MULTISET)) {
- unOrderedListBuilder.addItem(itemVisitorArg.first);
+ unOrderedListBuilder.addItem(itemCastResult.getOutPointable());
}
}
if (reqType.getTypeTag().equals(ATypeTag.ARRAY)) {
@@ -96,6 +91,6 @@ class AListCaster {
unOrderedListBuilder.write(dataDos, true);
}
int end = dataBos.size();
- resultAccessor.set(dataBos.getByteArray(), start, end - start);
+ castOutResult.set(dataBos.getByteArray(), start, end - start);
}
}
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
index c6e14238e6..6dda563573 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
@@ -45,11 +45,12 @@ import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.om.utils.NonTaggedFormatUtil;
import org.apache.asterix.om.utils.ResettableByteArrayOutputStream;
import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.accessors.UTF8StringBinaryComparatorFactory;
+import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
import org.apache.hyracks.util.string.UTF8StringWriter;
@@ -73,9 +74,7 @@ class ARecordCaster {
UTF8StringBinaryComparatorFactory.INSTANCE.createBinaryComparator();
private final ByteArrayAccessibleOutputStream outputBos = new
ByteArrayAccessibleOutputStream();
private final DataOutputStream outputDos = new DataOutputStream(outputBos);
- private final IVisitablePointable fieldTempReference =
PointableAllocator.allocateUnrestableEmpty();
- private final Triple<IVisitablePointable, IAType, Boolean>
nestedVisitorArg =
- new Triple<>(fieldTempReference, null, null);
+ private final CastResult fieldCastResult = new CastResult(new
VoidPointable(), null);
private int numInputFields = 0;
// describe closed fields in the required type
private int[] fieldPermutation;
@@ -102,8 +101,8 @@ class ARecordCaster {
}
}
- public void castRecord(ARecordVisitablePointable recordAccessor,
IVisitablePointable resultAccessor,
- ARecordType reqType, ACastVisitor visitor) throws
HyracksDataException {
+ public void castRecord(ARecordVisitablePointable recordAccessor,
IPointable castOutResult, ARecordType reqType,
+ ACastVisitor visitor) throws HyracksDataException {
List<IVisitablePointable> fieldNames = recordAccessor.getFieldNames();
List<IVisitablePointable> fieldTypeTags =
recordAccessor.getFieldTypeTags();
List<IVisitablePointable> fieldValues =
recordAccessor.getFieldValues();
@@ -125,7 +124,7 @@ class ARecordCaster {
reset();
matchClosedPart(fieldNames, fieldTypeTags);
writeOutput(fieldNames, fieldTypeTags, fieldValues, outputDos,
visitor);
- resultAccessor.set(outputBos.getByteArray(), 0, outputBos.size());
+ castOutResult.set(outputBos.getByteArray(), 0, outputBos.size());
}
private void reset() {
@@ -289,7 +288,7 @@ class ARecordCaster {
final int pos = fieldPermutation[i];
final IVisitablePointable field = pos >= 0 ? fieldValues.get(pos)
: missingTypeTag;
final IAType fType = cachedReqType.getFieldTypes()[i];
- nestedVisitorArg.second = fType;
+ fieldCastResult.setOutType(fType);
// recursively casting, the result of casting can always be thought
// as flat
@@ -297,15 +296,15 @@ class ARecordCaster {
//the field is optional in the input record
IVisitablePointable fieldTypeTag = pos >= 0 ?
fieldTypeTags.get(pos) : null;
if (fieldTypeTag == null ||
fieldTypeTag.equals(missingTypeTag)) {
- nestedVisitorArg.second = BuiltinType.AMISSING;
+ fieldCastResult.setOutType(BuiltinType.AMISSING);
} else if (fieldTypeTag.equals(nullTypeTag)) {
- nestedVisitorArg.second = BuiltinType.ANULL;
+ fieldCastResult.setOutType(BuiltinType.ANULL);
} else {
- nestedVisitorArg.second = ((AUnionType)
fType).getActualType();
+ fieldCastResult.setOutType(((AUnionType)
fType).getActualType());
}
}
- field.accept(visitor, nestedVisitorArg);
- recBuilder.addField(i, nestedVisitorArg.first);
+ field.accept(visitor, fieldCastResult);
+ recBuilder.addField(i, fieldCastResult.getOutPointable());
}
// write the open part
@@ -317,9 +316,9 @@ class ARecordCaster {
ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
.deserialize(fieldTypeTag.getByteArray()[fieldTypeTag.getStartOffset()]);
- nestedVisitorArg.second =
DefaultOpenFieldType.getDefaultOpenFieldType(typeTag);
- field.accept(visitor, nestedVisitorArg);
- recBuilder.addField(name, nestedVisitorArg.first);
+
fieldCastResult.setOutType(DefaultOpenFieldType.getDefaultOpenFieldType(typeTag));
+ field.accept(visitor, fieldCastResult);
+ recBuilder.addField(name, fieldCastResult.getOutPointable());
}
}
recBuilder.write(output, true);
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java
new file mode 100644
index 0000000000..cc156aa390
--- /dev/null
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/CastResult.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.om.pointables.cast;
+
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class CastResult {
+
+ private IPointable outPointable;
+ private IAType outType;
+
+ public CastResult(IPointable outPointable, IAType outType) {
+ this.outPointable = outPointable;
+ this.outType = outType;
+ }
+
+ public IPointable getOutPointable() {
+ return outPointable;
+ }
+
+ public void setOutPointable(IPointable outPointable) {
+ this.outPointable = outPointable;
+ }
+
+ public IAType getOutType() {
+ return outType;
+ }
+
+ public void setOutType(IAType outType) {
+ this.outType = outType;
+ }
+}
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
index 838285c742..2518d5db8c 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/collections/ListifyAggregateFunctionEvalFactory.java
@@ -67,7 +67,7 @@ public class ListifyAggregateFunctionEvalFactory implements
IAggregateEvaluatorF
// create caster to open up input item if the list item type is
ANY but the received item is not fully open
private final CastTypeEvaluator caster =
orderedListType.getItemType().getTypeTag() == ATypeTag.ANY
&& !TypeHelper.isFullyOpen(itemType)
- ? new CastTypeEvaluator(BuiltinType.ANY, itemType,
eval) : null;
+ ? new CastTypeEvaluator(BuiltinType.ANY, itemType,
eval, sourceLoc) : null;
@Override
public void init() throws HyracksDataException {
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
index 175ec0ef19..f65bf30238 100755
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
@@ -71,7 +71,7 @@ public abstract class AbstractArrayAddRemoveEval implements
IScalarEvaluator {
orderedListBuilder = null;
unorderedListBuilder = null;
listAccessor = new ListAccessor();
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
storage = new ArrayBackedValueStorage();
listArg = new VoidPointable();
tempList = new VoidPointable();
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
index ddcb11311a..052b79dec7 100755
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayProcessArraysEval.java
@@ -68,7 +68,7 @@ public abstract class AbstractArrayProcessArraysEval
implements IScalarEvaluator
storageAllocator = new
ListObjectPool<>(ObjectFactories.STORAGE_FACTORY);
finalResult = new ArrayBackedValueStorage();
listAccessor = new ListAccessor();
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
tempList = new VoidPointable();
listsArgs = new IPointable[args.length];
listsEval = new IScalarEvaluator[args.length];
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
index 2b4e210330..72d6c3d58b 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
@@ -141,7 +141,7 @@ public class ArrayFlattenDescriptor extends
AbstractScalarFunctionDynamicDescrip
depthEval = args[1].createScalarEvaluator(ctx);
list = new VoidPointable();
pointable = new VoidPointable();
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
depthArg = new TaggedValuePointable();
orderedListBuilder = null;
unorderedListBuilder = null;
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
index ac192ef05c..c33222d7c8 100755
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
@@ -194,7 +194,7 @@ public class ArrayIntersectDescriptor extends
AbstractScalarFunctionDynamicDescr
hashes = new Int2ObjectOpenHashMap<>();
finalResult = new ArrayBackedValueStorage();
listAccessor = new ListAccessor();
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
// for functions that accept multiple lists arguments, they will
be casted to open, hence item is ANY
comp = BinaryComparatorFactoryProvider.INSTANCE
.getBinaryComparatorFactory(BuiltinType.ANY,
BuiltinType.ANY, true).createBinaryComparator();
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
index 329fa7869c..aeda168a17 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceEvaluator.java
@@ -108,7 +108,7 @@ public class ArrayReplaceEvaluator extends
AbstractScalarEval {
tempVal = new VoidPointable();
item = new VoidPointable();
listAccessor = new ListAccessor();
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
orderedListBuilder = null;
unorderedListBuilder = null;
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
index f6d8d1226d..78d8d3664e 100755
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
@@ -198,7 +198,7 @@ public class ArrayStarDescriptor extends
AbstractScalarFunctionDynamicDescriptor
list = new VoidPointable();
tempList = new VoidPointable();
listEval = args[0].createScalarEvaluator(ctx);
- caster = new CastTypeEvaluator();
+ caster = new CastTypeEvaluator(null);
listAccessor = new ListAccessor();
recordBuilder = new RecordBuilder();
listBuilder = new OrderedListBuilder();
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
index 210149c04c..eb5275a931 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeEvaluator.java
@@ -23,10 +23,10 @@ import org.apache.asterix.om.pointables.PointableAllocator;
import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
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.common.utils.Triple;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
@@ -41,24 +41,14 @@ public class CastTypeEvaluator implements IScalarEvaluator {
private final IPointable argPointable = new VoidPointable();
private final PointableAllocator allocator = new PointableAllocator();
private IVisitablePointable inputPointable;
- private IVisitablePointable resultPointable;
private final ACastVisitor castVisitor = createCastVisitor();
- private final Triple<IVisitablePointable, IAType, Boolean> arg = new
Triple<>(null, null, null);
-
- public CastTypeEvaluator() {
- this(null);
- // reset() should be called after using this constructor before
calling any method
- }
+ private final CastResult castResult = new CastResult(new VoidPointable(),
null);
public CastTypeEvaluator(SourceLocation sourceLoc) {
this.sourceLoc = sourceLoc;
// reset() should be called after using this constructor before
calling any method
}
- public CastTypeEvaluator(IAType reqType, IAType inputType,
IScalarEvaluator argEvaluator) {
- this(reqType, inputType, argEvaluator, null);
- }
-
public CastTypeEvaluator(IAType reqType, IAType inputType,
IScalarEvaluator argEvaluator,
SourceLocation sourceLoc) {
this.sourceLoc = sourceLoc;
@@ -68,10 +58,7 @@ public class CastTypeEvaluator implements IScalarEvaluator {
public void resetAndAllocate(IAType reqType, IAType inputType,
IScalarEvaluator argEvaluator) {
this.argEvaluator = argEvaluator;
this.inputPointable = allocatePointable(inputType, reqType);
- this.resultPointable = allocatePointable(reqType, inputType);
- this.arg.first = resultPointable;
- this.arg.second = reqType;
- this.arg.third = Boolean.FALSE;
+ this.castResult.setOutType(reqType);
}
protected ACastVisitor createCastVisitor() {
@@ -86,19 +73,18 @@ public class CastTypeEvaluator implements IScalarEvaluator {
return;
}
- inputPointable.set(argPointable);
- cast(result);
- }
-
- protected void cast(IPointable result) throws HyracksDataException {
- inputPointable.accept(castVisitor, arg);
- result.set(resultPointable);
+ cast(argPointable, result);
}
- // TODO: refactor in a better way
+ // TODO(ali): refactor in a better way
protected void cast(IPointable argPointable, IPointable result) throws
HyracksDataException {
inputPointable.set(argPointable);
- cast(result);
+ castInto(result);
+ }
+
+ protected void castInto(IPointable result) throws HyracksDataException {
+ inputPointable.accept(castVisitor, castResult);
+ result.set(castResult.getOutPointable());
}
// Allocates the result pointable.
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
index be74580f36..56035a5b37 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
@@ -46,9 +46,9 @@ class CastTypeLaxEvaluator extends CastTypeEvaluator {
}
@Override
- protected void cast(IPointable result) {
+ protected void castInto(IPointable result) {
try {
- super.cast(result);
+ super.castInto(result);
} catch (HyracksDataException e) {
if (LOGGER.isTraceEnabled()) {
LOGGER.log(Level.TRACE, e.toString(), e);
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
index 6b72fc968c..f9cf5a0649 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
@@ -29,15 +29,14 @@ import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.functions.IFunctionTypeInferer;
import org.apache.asterix.om.pointables.ARecordVisitablePointable;
-import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.om.types.TypeHelper;
import
org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.functions.FunctionTypeInferers;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -95,7 +94,7 @@ public class ToObjectVarStrDescriptor extends
AbstractScalarFunctionDynamicDescr
private final ARecordVisitablePointable argRec;
private final boolean castRequired;
private ACastVisitor castVisitor;
- private Triple<IVisitablePointable, IAType, Boolean>
castVisitorArg;
+ private CastResult castResult;
private boolean wroteEmpty;
private ToObjectVarStrEvaluator(final IEvaluatorContext ctx)
throws HyracksDataException {
@@ -103,9 +102,8 @@ public class ToObjectVarStrDescriptor extends
AbstractScalarFunctionDynamicDescr
if (!TypeHelper.isFullyOpen(argType) &&
TypeHelper.isFullyOpen(outType)) {
castRequired = true;
argRec = new ARecordVisitablePointable(argType);
- ARecordVisitablePointable openRec = new
ARecordVisitablePointable(NESTED_OPEN_RECORD_TYPE);
castVisitor = new ACastVisitor();
- castVisitorArg = new Triple<>(openRec,
openRec.getInputRecordType(), Boolean.FALSE);
+ castResult = new CastResult(new VoidPointable(),
NESTED_OPEN_RECORD_TYPE);
} else {
castRequired = false;
argRec = null;
@@ -119,8 +117,8 @@ public class ToObjectVarStrDescriptor extends
AbstractScalarFunctionDynamicDescr
if (arg0.getByteArray()[arg0.getStartOffset()] ==
ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
if (castRequired) {
argRec.set(arg0);
- argRec.accept(castVisitor, castVisitorArg);
- resultPointable.set(castVisitorArg.first);
+ argRec.accept(castVisitor, castResult);
+ resultPointable.set(castResult.getOutPointable());
} else {
resultPointable.set(arg0);
}
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
index e324230749..974d6212da 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/AbstractRecordPairsEvaluator.java
@@ -43,7 +43,7 @@ abstract class AbstractRecordPairsEvaluator implements
IScalarEvaluator {
AbstractRecordPairsEvaluator(IScalarEvaluator eval0, IAType inputType) {
this.eval0 = eval0;
if (inputType != null) {
- inputCaster = new CastTypeEvaluator(BuiltinType.ANY, inputType,
eval0);
+ inputCaster = new CastTypeEvaluator(BuiltinType.ANY, inputType,
eval0, null);
}
}
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
index 890bb13570..68e089bf11 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordConcatEvalFactory.java
@@ -31,13 +31,13 @@ import
org.apache.asterix.om.pointables.ARecordVisitablePointable;
import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.runtime.evaluators.common.ListAccessor;
import org.apache.asterix.runtime.evaluators.functions.BinaryHashMap;
import org.apache.asterix.runtime.exceptions.TypeMismatchException;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -100,11 +100,11 @@ class RecordConcatEvalFactory implements
IScalarEvaluatorFactory {
private final IScalarEvaluator[] argEvals;
private IPointable[] argPointables;
private ARecordVisitablePointable[] argRecordPointables;
- private final ARecordVisitablePointable openRecordPointable;
+ private final ARecordVisitablePointable openRecord;
private final BitSet castRequired;
private ACastVisitor castVisitor;
- private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+ private CastResult castResult;
private final RecordBuilder outRecordBuilder;
private final ArrayBackedValueStorage resultStorage;
@@ -123,12 +123,12 @@ class RecordConcatEvalFactory implements
IScalarEvaluatorFactory {
this.warningCollector = warningCollector;
firstArg = new VoidPointable();
- openRecordPointable = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+ openRecord = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
resultStorage = new ArrayBackedValueStorage();
resultOutput = resultStorage.getDataOutput();
outRecordBuilder = new RecordBuilder();
- outRecordBuilder.reset(openRecordPointable.getInputRecordType());
+ outRecordBuilder.reset(openRecord.getInputRecordType());
fieldMap = new BinaryHashMap(TABLE_SIZE, TABLE_FRAME_SIZE,
outRecordBuilder.getFieldNameHashFunction(),
outRecordBuilder.getFieldNameHashFunction(),
outRecordBuilder.getFieldNameComparator());
@@ -166,8 +166,7 @@ class RecordConcatEvalFactory implements
IScalarEvaluatorFactory {
private void initCastVisitor() {
if (castVisitor == null) {
castVisitor = new ACastVisitor();
- castVisitorArg =
- new Triple<>(openRecordPointable,
openRecordPointable.getInputRecordType(), Boolean.FALSE);
+ castResult = new CastResult(openRecord,
openRecord.getInputRecordType());
}
}
@@ -300,14 +299,14 @@ class RecordConcatEvalFactory implements
IScalarEvaluatorFactory {
if (argVisitablePointable != null) {
argVisitablePointable.set(recordPtr);
if (argCastRequired) {
- argVisitablePointable.accept(castVisitor, castVisitorArg);
- recordPointable = openRecordPointable;
+ argVisitablePointable.accept(castVisitor, castResult);
+ recordPointable = openRecord;
} else {
recordPointable = argVisitablePointable;
}
} else {
- openRecordPointable.set(recordPtr);
- recordPointable = openRecordPointable;
+ openRecord.set(recordPtr);
+ recordPointable = openRecord;
}
List<IVisitablePointable> fieldNames =
recordPointable.getFieldNames();
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
index 550a84ecfc..b2b8500a91 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordReplaceEvaluator.java
@@ -62,8 +62,8 @@ class RecordReplaceEvaluator implements IScalarEvaluator {
this.eval1 = eval1;
this.eval2 = eval2;
openRecordPointable = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
- inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
argTypes[0], eval0);
- newValueRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
argTypes[2], eval2);
+ inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
argTypes[0], eval0, null);
+ newValueRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
argTypes[2], eval2, null);
// comp compares a value existing in the input record with the
provided value. the input record is casted open
comp =
BinaryComparatorFactoryProvider.INSTANCE.getBinaryComparatorFactory(BuiltinType.ANY,
argTypes[1], true)
.createBinaryComparator();
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
index 522aa542d1..329f5b2d1c 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordUnwrapEvaluator.java
@@ -27,11 +27,11 @@ import
org.apache.asterix.om.pointables.ARecordVisitablePointable;
import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.asterix.om.pointables.base.IVisitablePointable;
import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.pointables.cast.CastResult;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.hyracks.algebricks.common.utils.Triple;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
@@ -44,23 +44,22 @@ class RecordUnwrapEvaluator implements IScalarEvaluator {
private final IPointable inputRecordPointable = new VoidPointable();
private final IScalarEvaluator eval0;
private ARecordVisitablePointable inputRecordVisitable;
- private ARecordVisitablePointable openRecordVisitablePointable;
+ private final ARecordVisitablePointable openRecord;
private boolean requiresCast = false;
private ACastVisitor castVisitor;
- private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+ private CastResult castResult;
private final ArrayBackedValueStorage resultStorage = new
ArrayBackedValueStorage();
private final DataOutput resultOutput = resultStorage.getDataOutput();
RecordUnwrapEvaluator(IScalarEvaluator eval0, ARecordType recordType) {
this.eval0 = eval0;
- openRecordVisitablePointable = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+ openRecord = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
if (recordType != null) {
inputRecordVisitable = new ARecordVisitablePointable(recordType);
if (hasDerivedType(recordType.getFieldTypes())) {
requiresCast = true;
castVisitor = new ACastVisitor();
- castVisitorArg = new Triple<>(openRecordVisitablePointable,
- openRecordVisitablePointable.getInputRecordType(),
Boolean.FALSE);
+ castResult = new CastResult(openRecord,
openRecord.getInputRecordType());
}
}
}
@@ -109,8 +108,8 @@ class RecordUnwrapEvaluator implements IScalarEvaluator {
}
private ARecordVisitablePointable castToOpenRecord() throws
HyracksDataException {
- inputRecordVisitable.accept(castVisitor, castVisitorArg);
- return openRecordVisitablePointable;
+ inputRecordVisitable.accept(castVisitor, castResult);
+ return openRecord;
}
private void writeValue(IVisitablePointable value) throws
HyracksDataException {
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
index 106a899939..5e179f6ec6 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
+++
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
@@ -60,7 +60,7 @@ class RecordValuesEvaluator implements IScalarEvaluator {
if (recordType != null) {
inputRecordOpen = recordType.isOpen() &&
recordType.getFieldTypes().length == 0;
openRecordPointable = new
ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
- inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
recordType, eval0);
+ inputRecordCaster = new CastTypeEvaluator(BuiltinType.ANY,
recordType, eval0, null);
listBuilder = new OrderedListBuilder();
} else {
inputRecordOpen = true;