return parseOrExpression();
}
private SelectorNode parseSpecialConstructs() throws InvalidSelectorException
{
SelectorNode lNode = parseComparison();
if (isSpecialOperator(currentToken))
{
if (currentToken.equalsIgnoreCase("is null"))
{
readNextToken(); // skip operator
return new IsNullOperator(lNode);
}
if (currentToken.equalsIgnoreCase("is not null"))
{
readNextToken(); // skip operator
return new IsNotNullOperator(lNode);
}
if (currentToken.equalsIgnoreCase("is true"))
{
readNextToken(); // skip operator
return new EqualsOperator(lNode,new BooleanLiteral(Boolean.TRUE));
}
if (currentToken.equalsIgnoreCase("is false"))
{
readNextToken(); // skip operator
return new EqualsOperator(lNode,new BooleanLiteral(Boolean.FALSE));
}
if (currentToken.equalsIgnoreCase("is not true"))
{
readNextToken(); // skip operator
return new EqualsOperator(lNode,new BooleanLiteral(Boolean.FALSE));
}
if (currentToken.equalsIgnoreCase("is not false"))
{
readNextToken(); // skip operator
return new EqualsOperator(lNode,new BooleanLiteral(Boolean.TRUE));
}
if (currentToken.equalsIgnoreCase("in"))
{
readNextToken(); // skip operator
return new InOperator(lNode, parseListConstruct());
}
if (currentToken.equalsIgnoreCase("not in"))
{
readNextToken(); // skip operator
return new NotInOperator(lNode, parseListConstruct());
}
if (currentToken.equalsIgnoreCase("like"))
{
readNextToken(); // skip operator
return new LikeOperator(lNode, parsePatternExpression(), parseEscapeExpression());
}
if (currentToken.equalsIgnoreCase("not like"))
{
readNextToken(); // skip operator
return new NotLikeOperator(lNode, parsePatternExpression(), parseEscapeExpression());
}
if (currentToken.equalsIgnoreCase("between"))
{
readNextToken(); // skip 'between'
SelectorNode lowerBound = parseAdditiveExpression();
if (isEndOfExpression())
throw new InvalidSelectorException("Unexpected end of expression");
if (!currentToken.equalsIgnoreCase("and"))
throw new InvalidSelectorException("Expected an AND operator after lower bound in BETWEEN construct");
readNextToken(); // Skip 'and'
SelectorNode upperBound = parseAdditiveExpression();
return new BetweenOperator(lNode, lowerBound, upperBound);
}
if (currentToken.equalsIgnoreCase("not between"))
{
readNextToken(); // skip 'between'
SelectorNode lowerBound = parseAdditiveExpression();
if (isEndOfExpression())
throw new InvalidSelectorException("Unexpected end of expression");
if (!currentToken.equalsIgnoreCase("and"))
throw new InvalidSelectorException("Expected an AND operator after lower bound in BETWEEN construct");
readNextToken(); // Skip 'and'
SelectorNode upperBound = parseAdditiveExpression();
return new NotBetweenOperator(lNode, lowerBound, upperBound);
}
}