package org.infinispan.objectfilter.impl.predicateindex.be; import org.infinispan.objectfilter.impl.predicateindex.FilterEvalContext; /** * Base boolean expression Node. * * @author anistor@redhat.com * @since 7.0 */ public abstract class BENode { /** * The parent node or null if this is the root; */ protected final BENode parent; /** * The index of this node in the tree's node array. */ protected int startIndex; /** * The index of the last child. */ protected int endIndex; protected BENode(BENode parent) { this.parent = parent; } void setLocation(int startIndex, int endIndex) { this.startIndex = startIndex; this.endIndex = endIndex; } public final boolean isEvaluationComplete(FilterEvalContext evalContext) { return evalContext.treeCounters[0] <= 0 || evalContext.treeCounters[startIndex] <= 0; } public abstract void handleChildValue(BENode child, boolean childValue, FilterEvalContext evalContext); public void suspendSubscription(FilterEvalContext evalContext) { // nothing to do here, subclasses must override appropriately } protected final void setState(int nodeValue, FilterEvalContext evalContext) { BENode[] nodes = evalContext.beTree.getNodes(); for (int i = startIndex; i < endIndex; i++) { if (evalContext.treeCounters[i] == 1) { // this may be a predicate node evalContext.treeCounters[i] = nodeValue; // this is not the real value, but any value less that 1 will do nodes[i].suspendSubscription(evalContext); } } evalContext.treeCounters[startIndex] = nodeValue; } }