in asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctVertexDescriptor.java [45:93]
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 IPointable arg0Ptr = new VoidPointable();
private final IPointable arg1Ptr = new VoidPointable();
@Override
protected boolean readTuple(IFrameTupleReference tuple, IPointable result)
throws HyracksDataException {
arg0Eval.evaluate(tuple, arg0Ptr);
arg1Eval.evaluate(tuple, arg1Ptr);
// If our vertex or path is NULL or MISSING, then our result is NULL / MISSING.
if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr)) {
return false;
}
// Ensure that we have a path (i.e. bit-array) as our second argument.
byte typeTagByte = arg1Ptr.getByteArray()[arg1Ptr.getStartOffset()];
if (typeTagByte != InternalPathPointable.PATH_SERIALIZED_TYPE_TAG) {
throw new TypeMismatchException(sourceLoc, getIdentifier(), 1, typeTagByte,
InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
}
vertexListItemCallback.getInputItemPtr().set(arg0Ptr);
pathPtr.set(arg1Ptr);
return true;
}
@Override
protected boolean compare() {
SinglyLinkedListPointable<Boolean> vertexListPointable = pathPtr.getVertexListPointable();
while (vertexListPointable.hasNext()) {
if (vertexListPointable.next()) {
return true;
}
}
return false;
}
};
}
};
}