in asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/AppendInternalPathDescriptor.java [63:132]
public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
return new IScalarEvaluatorFactory() {
private static final long serialVersionUID = 1L;
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
return new IScalarEvaluator() {
private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
private final DataOutput dataOutput = resultStorage.getDataOutput();
private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
private final IScalarEvaluator arg1Eval = args[1].createScalarEvaluator(ctx);
private final IScalarEvaluator arg2Eval = args[2].createScalarEvaluator(ctx);
private final IPointable arg0Ptr = new VoidPointable();
private final IPointable arg1Ptr = new VoidPointable();
private final IPointable arg2Ptr = new VoidPointable();
@Override
public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
arg0Eval.evaluate(tuple, arg0Ptr);
arg1Eval.evaluate(tuple, arg1Ptr);
arg2Eval.evaluate(tuple, arg2Ptr);
if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr, arg2Ptr)) {
return;
}
resultStorage.reset();
try {
// Build our path header. We start with our type tag.
dataOutput.writeByte(PATH_SERIALIZED_TYPE_TAG);
// Write the end offset of our new vertex list.
int oldVertexLocalListEnd = IntegerPointable.getInteger(arg2Ptr.getByteArray(),
arg2Ptr.getStartOffset() + HEADER_VERTEX_LIST_END);
int vertexItemSize = arg0Ptr.getLength() + LIST_ITEM_LENGTH_SIZE;
dataOutput.writeInt(oldVertexLocalListEnd + vertexItemSize);
// materializeInternalPathCallbackFactory
// Write the end offset of our new edge list.
int oldEdgeLocalListEnd = IntegerPointable.getInteger(arg2Ptr.getByteArray(),
arg2Ptr.getStartOffset() + HEADER_EDGE_LIST_END);
int edgeItemSize = arg1Ptr.getLength() + LIST_ITEM_LENGTH_SIZE;
dataOutput.writeInt(oldEdgeLocalListEnd + edgeItemSize);
// Copy all of our old vertices.
int oldVertexAbsoluteListStart = arg2Ptr.getStartOffset() + PATH_HEADER_LENGTH;
dataOutput.write(arg2Ptr.getByteArray(), oldVertexAbsoluteListStart,
(oldVertexLocalListEnd + arg2Ptr.getStartOffset()) - oldVertexAbsoluteListStart);
// Copy our new vertex.
dataOutput.writeInt(arg0Ptr.getLength());
dataOutput.write(arg0Ptr.getByteArray(), arg0Ptr.getStartOffset(), arg0Ptr.getLength());
// Copy all of our new edges.
int oldEdgeAbsoluteListStart = oldVertexLocalListEnd + arg2Ptr.getStartOffset();
dataOutput.write(arg2Ptr.getByteArray(), oldEdgeAbsoluteListStart,
(oldEdgeLocalListEnd + arg2Ptr.getStartOffset()) - oldEdgeAbsoluteListStart);
// Copy our new edge.
dataOutput.writeInt(arg1Ptr.getLength());
dataOutput.write(arg1Ptr.getByteArray(), arg1Ptr.getStartOffset(), arg1Ptr.getLength());
} catch (IOException e) {
throw HyracksDataException.create(e);
}
}
};
}
};
}