package org.infinispan.objectfilter.impl.predicateindex;
/**
* A predicate attached to an attribute. It comes in two flavors: condition predicate or interval predicate. An interval
* predicate represents a range of values (possibly infinite at one end but not both). It requires that the attribute
* domain is Comparable, otherwise the notion of interval is meaningless. A condition predicate on the other hand can
* have any arbitrary condition and does not require the attribute value to be Comparable.
*
* @author anistor@redhat.com
* @since 7.0
*/
public class Predicate<AttributeDomain> {
protected AttributeNode attributeNode;
/**
* Indicates if this predicate is attached to a repeated attribute (one of the attribute path components is a
* collection/array) and thus it will have multiple evaluations.
*/
private final boolean isRepeated;
/**
* The condition, never null. There is always an equivalent condition even for interval predicates.
*/
private final Condition<AttributeDomain> condition;
public Predicate(boolean isRepeated, Condition<AttributeDomain> condition) {
this.isRepeated = isRepeated;
this.condition = condition;
}
public boolean isRepeated() {
return isRepeated;
}
public boolean match(AttributeDomain attributeValue) {
return condition.match(attributeValue);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Predicate other = (Predicate) obj;
return attributeNode == other.attributeNode
&& isRepeated == other.isRepeated
&& condition.equals(other.condition);
}
@Override
public int hashCode() {
int i = condition.hashCode();
i = i + 31 * attributeNode.hashCode();
return 31 * i + (isRepeated ? 1 : 0);
}
@Override
public String toString() {
return "Predicate(" + attributeNode + ", isRepeated=" + isRepeated + ", " + condition + ")";
}
}