Skip to content

Commit 06d817c

Browse files
GH-4769 Use retain set logic to hide variables out of scope for a filter
Signed-off-by: Jerven Bolleman <jerven.bolleman@sib.swiss>
1 parent bfa7500 commit 06d817c

2 files changed

Lines changed: 253 additions & 119 deletions

File tree

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/DefaultEvaluationStrategy.java

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.concurrent.TimeUnit;
2020
import java.util.function.BiFunction;
2121
import java.util.function.Consumer;
22+
import java.util.function.Predicate;
2223
import java.util.function.Supplier;
2324

2425
import org.eclipse.rdf4j.collection.factory.api.CollectionFactory;
@@ -633,24 +634,8 @@ protected QueryEvaluationStep prepare(Service service, QueryEvaluationContext co
633634

634635
protected QueryEvaluationStep prepare(Filter node, QueryEvaluationContext context) throws QueryEvaluationException {
635636

636-
QueryEvaluationStep arg = precompile(node.getArg(), context);
637-
QueryValueEvaluationStep ves;
638-
try {
639-
final FilterIterator.RetainedVariableFilteredQueryEvaluationContext context2 = new FilterIterator.RetainedVariableFilteredQueryEvaluationContext(
640-
node, context);
641-
ves = precompile(node.getCondition(), context2);
642-
} catch (QueryEvaluationException e) {
643-
// If we have a failed compilation we always return false.
644-
// Which means empty. so let's short circuit that.
645-
return QueryEvaluationStep.EMPTY;
646-
}
647-
return new QueryEvaluationStep() {
637+
return FilterIterator.supply(node, DefaultEvaluationStrategy.this, context);
648638

649-
@Override
650-
public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(BindingSet bs) {
651-
return new FilterIterator(node, arg.evaluate(bs), ves, DefaultEvaluationStrategy.this);
652-
}
653-
};
654639
}
655640

656641
protected QueryEvaluationStep prepare(Order node, QueryEvaluationContext context) throws QueryEvaluationException {
@@ -1157,16 +1142,18 @@ protected QueryValueEvaluationStep prepare(Var var, QueryEvaluationContext conte
11571142
return new ConstantQueryValueEvaluationStep(value);
11581143
} else {
11591144
java.util.function.Function<BindingSet, Value> getValue = context.getValue(var.getName());
1145+
Predicate<BindingSet> hasValue = context.hasBinding(var.getName());
11601146
return new QueryValueEvaluationStep() {
11611147

11621148
@Override
11631149
public Value evaluate(BindingSet bindings)
11641150
throws QueryEvaluationException {
1165-
Value value = getValue.apply(bindings);
1166-
if (value == null) {
1151+
if (hasValue.test(bindings)) {
1152+
Value value = getValue.apply(bindings);
1153+
return value;
1154+
} else {
11671155
throw new ValueExprEvaluationException();
11681156
}
1169-
return value;
11701157
}
11711158
};
11721159
}

0 commit comments

Comments
 (0)