/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.emulation.hibernate3.ast.whereClause;
import java.util.*;
import mockit.emulation.hibernate3.ast.*;
final class EqualityExpr extends Expr
{
final Expr lhsExpr;
final Expr rhsExpr;
final String operator;
EqualityExpr(Expr lhsExpr, Expr rhsExpr, String operator)
{
this.lhsExpr = lhsExpr;
this.rhsExpr = rhsExpr;
this.operator = operator;
}
public static Expr parse(Tokens tokens)
{
Expr lhsExpr = RelationalExpr.parse(tokens);
if (!tokens.hasNext()) {
return lhsExpr;
}
String operator = tokens.next().toLowerCase();
boolean equalityOperator;
if ("is".equals(operator)) {
equalityOperator = true;
String nextToken = tokens.next().toLowerCase();
if ("not".equals(nextToken)) {
operator += nextToken;
}
else {
tokens.pushback();
}
}
else {
equalityOperator = "=".equals(operator) || "!=".equals(operator) || "<>".equals(operator);
}
if (equalityOperator) {
Expr rhsExpr = RelationalExpr.parse(tokens);
if (rhsExpr == null) {
throw new QuerySyntaxException(tokens);
}
return new EqualityExpr(lhsExpr, rhsExpr, operator);
}
else {
tokens.pushback();
return lhsExpr;
}
}
@Override
public Boolean evaluate(QueryEval eval)
{
Object value1 = lhsExpr.evaluate(eval);
Object value2 = rhsExpr.evaluate(eval);
if ("=".equals(operator)) {
return value1.equals(value2);
}
else if ("!=".equals(operator) || "<>".equals(operator)) {
return !value1.equals(value2);
}
else if ("is".equals(operator)) {
if (value2 == null ) {
return value1 == null;
}
else if (value2 == Collections.EMPTY_SET) {
return ((Collection<?>) value1).isEmpty();
}
else {
throw new IllegalStateException("IS operator not applied to null nor empty");
}
}
else {
assert "isnot".equals(operator);
if (value2 == null) {
return value1 != null;
}
else if (value2 == Collections.EMPTY_SET) {
return !((Collection<?>) value1).isEmpty();
}
else {
throw new IllegalStateException("IS NOT operator not applied to null nor empty");
}
}
}
}