/* * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.query.algebra.evaluation.iterator; import java.util.Set; import info.aduna.iteration.CloseableIteration; import info.aduna.iteration.FilterIteration; import org.openrdf.query.BindingSet; import org.openrdf.query.QueryEvaluationException; import org.openrdf.query.algebra.Filter; import org.openrdf.query.algebra.evaluation.QueryBindingSet; import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException; import org.openrdf.query.algebra.evaluation.EvaluationStrategy; public class FilterIterator extends FilterIteration<BindingSet, QueryEvaluationException> { /*-----------* * Constants * *-----------*/ private final Filter filter; private final EvaluationStrategy strategy; /** * The set of binding names that are "in scope" for the filter. The filter * must not include bindings that are (only) included because of the * depth-first evaluation strategy in the evaluation of the constraint. */ private final Set<String> scopeBindingNames; /*--------------* * Constructors * *--------------*/ public FilterIterator(Filter filter, CloseableIteration<BindingSet, QueryEvaluationException> iter, EvaluationStrategy strategy) throws QueryEvaluationException { super(iter); this.filter = filter; this.strategy = strategy; this.scopeBindingNames = filter.getBindingNames(); } /*---------* * Methods * *---------*/ @Override protected boolean accept(BindingSet bindings) throws QueryEvaluationException { try { // Limit the bindings to the ones that are in scope for this filter QueryBindingSet scopeBindings = new QueryBindingSet(bindings); scopeBindings.retainAll(scopeBindingNames); return strategy.isTrue(filter.getCondition(), scopeBindings); } catch (ValueExprEvaluationException e) { // failed to evaluate condition return false; } } }