public IScalarEvaluatorFactory createEvaluatorFactory()

in asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEverythingDescriptor.java [45:103]


    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
        return new IScalarEvaluatorFactory() {
            private static final long serialVersionUID = 1L;

            @Override
            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
                return new AbstractElementCompareEvaluator() {
                    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
                    protected boolean readTuple(IFrameTupleReference tuple, IPointable result)
                            throws HyracksDataException {
                        arg0Eval.evaluate(tuple, arg0Ptr);
                        arg1Eval.evaluate(tuple, arg1Ptr);
                        arg2Eval.evaluate(tuple, arg2Ptr);

                        // If our edge, vertex, or path is NULL or MISSING, then our result is NULL / MISSING.
                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr, arg2Ptr)) {
                            return false;
                        }

                        // Ensure that we have a path (i.e. bit-array) as our third argument.
                        byte typeTagByte = arg2Ptr.getByteArray()[arg2Ptr.getStartOffset()];
                        if (typeTagByte != InternalPathPointable.PATH_SERIALIZED_TYPE_TAG) {
                            throw new TypeMismatchException(sourceLoc, getIdentifier(), 2, typeTagByte,
                                    InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
                        }

                        vertexListItemCallback.getInputItemPtr().set(arg0Ptr);
                        edgeListItemCallback.getInputItemPtr().set(arg1Ptr);
                        pathPtr.set(arg2Ptr);
                        return true;
                    }

                    @Override
                    protected boolean compare() {
                        SinglyLinkedListPointable<Boolean> vertexListPointable = pathPtr.getVertexListPointable();
                        SinglyLinkedListPointable<Boolean> edgeListPointable = pathPtr.getEdgeListPointable();
                        while (vertexListPointable.hasNext()) {
                            if (vertexListPointable.next()) {
                                return true;
                            }
                        }
                        while (edgeListPointable.hasNext()) {
                            if (edgeListPointable.next()) {
                                return true;
                            }
                        }
                        return false;
                    }
                };
            }
        };
    }