public Message preProcessMessage(EndOfEvaluationMessage msg) {
if (!this.isSortable || this.operands[1].isEmpty()) {
return super.preProcessMessage(msg);
} else if (!this.operands[0].isEmpty() && !this.operands[1].isEmpty()) {
QueryResult result = QueryResult.createInstance();
Iterator<Bindings> leftIt = this.operands[0].getQueryResult().iterator();
Iterator<Bindings> rightIt = this.operands[1].getQueryResult().iterator();
Bindings leftBindings = null, rightBindings = null;
if (leftIt.hasNext()) {
leftBindings = leftIt.next();
}
if (rightIt.hasNext()) {
rightBindings = rightIt.next();
}
while (rightBindings != null && leftBindings != null) {
int difference = this.comp.compare(leftBindings, rightBindings);
if (difference > 0) {
rightBindings = rightIt.hasNext() ? rightIt.next() : null;
} else if (difference == 0) {
leftBindings = leftIt.hasNext() ? leftIt.next() : null;
} else if (difference < 0) {
result.add(leftBindings);
leftBindings = leftIt.hasNext() ? leftIt.next() : null;
}
}
while (leftBindings != null) {
result.add(leftBindings);
leftBindings = leftIt.hasNext() ? leftIt.next() : null;
}
for (final OperatorIDTuple opId : this.succeedingOperators) {
opId.processAll(result);