>From Ali Alsuliman <[email protected]>:
Ali Alsuliman has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17610 )
Change subject: [ASTERIXDB-3215][RT] Avoid unnecessary fields sort in
ARecordCaster
......................................................................
[ASTERIXDB-3215][RT] Avoid unnecessary fields sort in ARecordCaster
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Do not sort fields when the input record is already open.
- Change OBJECT_VALUES() so that it avoids casting the input
record if it is already open.
- Fix getting the open field value from ARecordPointable to
include the tag when writing the value to the output stream.
Change-Id: I3fb928fe725ab7b6beb4abfc477b190d835138bb
---
M
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
M
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordValuesEvaluator.java
M
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
3 files changed, 68 insertions(+), 6 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/10/17610/1
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 56bdfc5..7354c1e 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
@@ -194,10 +194,12 @@
private void matchClosedPart(List<IVisitablePointable> fieldNames,
List<IVisitablePointable> fieldTypeTags)
throws HyracksDataException {
- // sort-merge based match
- quickSort(fieldNamesSortedIndex, fieldNames, 0, numInputFields - 1);
int fnStart = 0;
int reqFnStart = 0;
+ if (fnStart < numInputFields && reqFnStart < reqFieldNames.size()) {
+ // sort-merge based match
+ quickSort(fieldNamesSortedIndex, fieldNames, 0, numInputFields -
1);
+ }
while (fnStart < numInputFields && reqFnStart < reqFieldNames.size()) {
int fnPos = fieldNamesSortedIndex[fnStart];
int reqFnPos = reqFieldNamesSortedIndex[reqFnStart];
diff --git
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
index cc3816c..ab86c1d 100644
---
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
+++
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
@@ -244,7 +244,9 @@
// -----------------------
public final void getOpenFieldValue(ARecordType recordType, int fieldId,
DataOutput dOut) throws IOException {
- dOut.write(bytes, getOpenFieldValueOffset(recordType, fieldId),
getOpenFieldValueSize(recordType, fieldId));
+ // + 1 to include the tag
+ int len = getOpenFieldValueSize(recordType, fieldId) + 1;
+ dOut.write(bytes, getOpenFieldValueOffset(recordType, fieldId), len);
}
public final int getOpenFieldValueOffset(ARecordType recordType, int
fieldId) {
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 783f4e6..106a899 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
@@ -20,16 +20,19 @@
package org.apache.asterix.runtime.evaluators.functions.records;
import java.io.DataOutput;
+import java.io.IOException;
import java.util.List;
import org.apache.asterix.builders.OrderedListBuilder;
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.nonvisitor.ARecordPointable;
import org.apache.asterix.om.types.AOrderedListType;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.utils.RecordUtil;
import org.apache.asterix.runtime.evaluators.functions.CastTypeEvaluator;
import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -45,6 +48,9 @@
private final ArrayBackedValueStorage resultStorage = new
ArrayBackedValueStorage();
private final DataOutput resultOutput = resultStorage.getDataOutput();
private final IScalarEvaluator eval0;
+ private final boolean inputRecordOpen;
+ private final ARecordPointable recordPointable;
+ private final ArrayBackedValueStorage fieldValueStorage;
private OrderedListBuilder listBuilder;
private ARecordVisitablePointable openRecordPointable;
private CastTypeEvaluator inputRecordCaster;
@@ -52,9 +58,19 @@
RecordValuesEvaluator(IScalarEvaluator eval0, ARecordType recordType) {
this.eval0 = eval0;
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);
listBuilder = new OrderedListBuilder();
+ } else {
+ inputRecordOpen = true;
+ }
+ if (inputRecordOpen) {
+ recordPointable = new ARecordPointable();
+ fieldValueStorage = new ArrayBackedValueStorage();
+ } else {
+ recordPointable = null;
+ fieldValueStorage = null;
}
}
@@ -72,14 +88,18 @@
PointableHelper.setNull(result);
return;
}
- inputRecordCaster.evaluate(tuple, inputRecordPointable);
resultStorage.reset();
- buildOutputList();
+ if (inputRecordOpen) {
+ buildOutputList();
+ } else {
+ buildOutputList(tuple);
+ }
result.set(resultStorage);
}
- private void buildOutputList() throws HyracksDataException {
+ private void buildOutputList(IFrameTupleReference tuple) throws
HyracksDataException {
listBuilder.reset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE);
+ inputRecordCaster.evaluate(tuple, inputRecordPointable);
openRecordPointable.set(inputRecordPointable);
final List<IVisitablePointable> fieldValues =
openRecordPointable.getFieldValues();
for (int i = 0, valuesCount = fieldValues.size(); i < valuesCount;
i++) {
@@ -87,4 +107,21 @@
}
listBuilder.write(resultOutput, true);
}
+
+ private void buildOutputList() throws HyracksDataException {
+ listBuilder.reset(AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE);
+ recordPointable.set(inputRecordPointable);
+ int openFieldCount =
recordPointable.getOpenFieldCount(RecordUtil.FULLY_OPEN_RECORD_TYPE);
+ for (int i = 0; i < openFieldCount; i++) {
+ fieldValueStorage.reset();
+ try {
+
recordPointable.getOpenFieldValue(RecordUtil.FULLY_OPEN_RECORD_TYPE, i,
+ fieldValueStorage.getDataOutput());
+ listBuilder.addItem(fieldValueStorage);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
+ }
+ }
+ listBuilder.write(resultOutput, true);
+ }
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17610
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings
Gerrit-Project: asterixdb
Gerrit-Branch: stabilization-667a908755
Gerrit-Change-Id: I3fb928fe725ab7b6beb4abfc477b190d835138bb
Gerrit-Change-Number: 17610
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>
Gerrit-MessageType: newchange