package org.infinispan.objectfilter.impl.syntax;
/**
* An expression that represents a comparison of Comparable values.
*
* @author anistor@redhat.com
* @since 7.0
*/
public final class ComparisonExpr implements PrimaryPredicateExpr {
private final ValueExpr leftChild;
private final ValueExpr rightChild;
private final Type type;
public enum Type {
LESS,
LESS_OR_EQUAL,
EQUAL,
NOT_EQUAL,
GREATER_OR_EQUAL,
GREATER;
public Type negate() {
switch (this) {
case LESS:
return GREATER_OR_EQUAL;
case LESS_OR_EQUAL:
return GREATER;
case EQUAL:
return NOT_EQUAL;
case NOT_EQUAL:
return EQUAL;
case GREATER_OR_EQUAL:
return LESS;
case GREATER:
return LESS_OR_EQUAL;
default:
return this;
}
}
public Type reverse() {
switch (this) {
case LESS:
return GREATER;
case GREATER:
return LESS;
case LESS_OR_EQUAL:
return GREATER_OR_EQUAL;
case GREATER_OR_EQUAL:
return LESS_OR_EQUAL;
default:
return this;
}
}
}
public ComparisonExpr(ValueExpr leftChild, ValueExpr rightChild, Type type) {
this.leftChild = leftChild;
this.rightChild = rightChild;
this.type = type;
}
public ValueExpr getLeftChild() {
return leftChild;
}
public ValueExpr getRightChild() {
return rightChild;
}
public Type getComparisonType() {
return type;
}
@Override
public ValueExpr getChild() {
return leftChild;
}
@Override
public <T> T acceptVisitor(Visitor<?, ?> visitor) {
return (T) visitor.visit(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ComparisonExpr other = (ComparisonExpr) o;
return type == other.type && leftChild.equals(other.leftChild) && rightChild.equals(other.rightChild);
}
@Override
public int hashCode() {
int result = 31 * leftChild.hashCode() + rightChild.hashCode();
return 31 * result + type.hashCode();
}
@Override
public String toString() {
return type + "(" + leftChild + ", " + rightChild + ')';
}
@Override
public String toQueryString() {
StringBuilder sb = new StringBuilder();
sb.append(leftChild.toQueryString()).append(' ');
switch (type) {
case LESS:
sb.append('<');
break;
case LESS_OR_EQUAL:
sb.append("<=");
break;
case EQUAL:
sb.append('=');
break;
case NOT_EQUAL:
sb.append("!=");
break;
case GREATER_OR_EQUAL:
sb.append(">=");
break;
case GREATER:
sb.append('>');
break;
}
sb.append(' ').append(rightChild.toQueryString());
return sb.toString();
}
}