public IScalarEvaluatorFactory createEvaluatorFactory()

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);
                        }
                    }
                };
            }
        };
    }