package org.infinispan.objectfilter.impl.predicateindex.be;
import org.infinispan.objectfilter.impl.predicateindex.FilterEvalContext;
/**
* @author anistor@redhat.com
* @since 7.0
*/
public final class AndNode extends BENode {
public AndNode(BENode parent) {
super(parent);
}
@Override
public void handleChildValue(BENode child, boolean childValue, FilterEvalContext evalContext) {
if (isEvaluationComplete(evalContext)) {
throw new IllegalStateException("This should never be called again because the state of this node has been decided already.");
}
if (childValue) {
if (--evalContext.treeCounters[startIndex] == 0) {
// value of this node is decided: TRUE
if (parent != null) {
// propagate to the parent, if we have a parent
parent.handleChildValue(this, true, evalContext);
} else {
// mark this node as 'satisfied'
setState(BETree.EXPR_TRUE, evalContext);
}
} else {
// value of this node cannot be decided yet, so we cannot propagate to the parent anything yet but let's at least mark down the child as 'satisfied'
child.setState(BETree.EXPR_TRUE, evalContext);
}
} else {
// value of this node is decided: FALSE
if (parent != null) {
// propagate to the parent, if we have a parent
parent.handleChildValue(this, false, evalContext);
} else {
// mark this node as 'unsatisfied'
setState(BETree.EXPR_FALSE, evalContext);
}
}
}
}