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