blob: a37114e5da72249b87ffc22cd7ac701973e492f8 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.api.predicate;
import org.apache.ambari.server.controller.predicate.*;
import org.apache.ambari.server.controller.spi.Predicate;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
/**
* QueryParser unit tests.
*/
public class QueryParserTest {
@Test
public void testParse_simple() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
//a=b
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "b"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
assertEquals(new EqualsPredicate<String>("a", "b"), p);
}
@Test
public void testParse() throws InvalidQueryException {
List<Token> listTokens = new ArrayList<Token>();
// foo=bar&(a<1&(b<=2|c>3)&d>=100)|e!=5&!(f=6|g=7)
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "foo"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "bar"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.BRACKET_OPEN, "("));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "<"));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "1"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.BRACKET_OPEN, "("));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "<="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "b"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "2"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "|"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, ">"));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "c"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "3"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, ">="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "d"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "100"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "|"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "!="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "e"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "5"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.LOGICAL_UNARY_OPERATOR, "!"));
listTokens.add(new Token(Token.TYPE.BRACKET_OPEN, "("));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "f"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "6"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "|"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "g"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "7"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
EqualsPredicate<String> fooPred = new EqualsPredicate<String>("foo", "bar");
LessPredicate<String> aPred = new LessPredicate<String>("a", "1");
LessEqualsPredicate<String> bPred = new LessEqualsPredicate<String>("b", "2");
GreaterEqualsPredicate<String> cPred = new GreaterEqualsPredicate<String>("c", "3");
GreaterEqualsPredicate<String> dPred = new GreaterEqualsPredicate<String>("d", "100");
NotPredicate ePred = new NotPredicate(new EqualsPredicate<String>("e", "5"));
EqualsPredicate fPred = new EqualsPredicate<String>("f", "6");
EqualsPredicate gPRed = new EqualsPredicate<String>("g", "7");
OrPredicate bORcPred = new OrPredicate(bPred, cPred);
AndPredicate aANDbORcPred = new AndPredicate(aPred, bORcPred);
AndPredicate aANDbORcANDdPred = new AndPredicate(aANDbORcPred, dPred);
AndPredicate fooANDaANDbORcANDdPred = new AndPredicate(fooPred, aANDbORcANDdPred);
OrPredicate fORgPred = new OrPredicate(fPred, gPRed);
NotPredicate NOTfORgPred = new NotPredicate(fORgPred);
AndPredicate eANDNOTfORgPred = new AndPredicate(ePred, NOTfORgPred);
OrPredicate rootPredicate = new OrPredicate(fooANDaANDbORcANDdPred, eANDNOTfORgPred);
assertEquals(rootPredicate, p);
}
@Test
public void testParse_NotOp__simple() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
//!a=b
listTokens.add(new Token(Token.TYPE.LOGICAL_UNARY_OPERATOR, "!"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "b"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
assertEquals(new NotPredicate(new EqualsPredicate<String>("a", "b")), p);
}
@Test
public void testParse_NotOp() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
//a=1&!b=2
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "1"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.LOGICAL_UNARY_OPERATOR, "!"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "b"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "2"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
EqualsPredicate aPred = new EqualsPredicate<String>("a", "1");
EqualsPredicate bPred = new EqualsPredicate<String>("b", "2");
NotPredicate notPred = new NotPredicate(bPred);
AndPredicate andPred = new AndPredicate(aPred, notPred);
assertEquals(andPred, p);
}
@Test
public void testParse_InOp__simple() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
// foo.in(one,two,3)
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR_FUNC, ".in("));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "foo"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "one,two,3"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
EqualsPredicate ep1 = new EqualsPredicate("foo", "one");
EqualsPredicate ep2 = new EqualsPredicate("foo", "two");
EqualsPredicate ep3 = new EqualsPredicate("foo", "3");
OrPredicate orPredicate = new OrPredicate(ep1, ep2, ep3);
assertEquals(orPredicate, p);
}
@Test
public void testParse_InOp__exception() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
// foo.in()
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR_FUNC, ".in("));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "foo"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
QueryParser parser = new QueryParser();
try {
parser.parse(listTokens.toArray(new Token[listTokens.size()]));
fail("Expected InvalidQueryException due to missing right operand");
} catch (InvalidQueryException e) {
// expected
}
}
@Test
public void testParse_isEmptyOp__simple() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
// category1.isEmpty()
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR_FUNC, ".isEmpty("));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "category1"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
QueryParser parser = new QueryParser();
Predicate p = parser.parse(listTokens.toArray(new Token[listTokens.size()]));
assertEquals(new CategoryIsEmptyPredicate("category1"), p);
}
@Test
public void testParse_isEmptyOp__exception() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
// category1.isEmpty()
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR_FUNC, ".isEmpty("));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "category1"));
// missing closing bracket
QueryParser parser = new QueryParser();
try {
parser.parse(listTokens.toArray(new Token[listTokens.size()]));
fail("Expected InvalidQueryException due to missing closing bracket");
} catch (InvalidQueryException e) {
// expected
}
}
@Test
public void testParse_isEmptyOp__exception2() throws Exception {
List<Token> listTokens = new ArrayList<Token>();
// category1.isEmpty()
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR_FUNC, ".isEmpty("));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "category1"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "one,two,3"));
listTokens.add(new Token(Token.TYPE.BRACKET_CLOSE, ")"));
QueryParser parser = new QueryParser();
try {
parser.parse(listTokens.toArray(new Token[listTokens.size()]));
fail("Expected InvalidQueryException due to existence of right operand");
} catch (InvalidQueryException e) {
// expected
}
}
@Test
public void testParse_noTokens() throws InvalidQueryException {
assertNull(new QueryParser().parse(new Token[0]));
}
@Test
public void testParse_mismatchedBrackets() {
List<Token> listTokens = new ArrayList<Token>();
// a=1&(b<=2|c>3
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "1"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "&"));
listTokens.add(new Token(Token.TYPE.BRACKET_OPEN, "("));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "<="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "b"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "2"));
listTokens.add(new Token(Token.TYPE.LOGICAL_OPERATOR, "|"));
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, ">"));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "c"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "3"));
try {
new QueryParser().parse(listTokens.toArray(new Token[listTokens.size()]));
fail("Expected InvalidQueryException due to missing closing bracket");
} catch (InvalidQueryException e) {
// expected
}
}
@Test
public void testParse_outOfOrderTokens() {
List<Token> listTokens = new ArrayList<Token>();
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
listTokens.add(new Token(Token.TYPE.PROPERTY_OPERAND, "a"));
listTokens.add(new Token(Token.TYPE.VALUE_OPERAND, "1"));
// should be a logical operator
listTokens.add(new Token(Token.TYPE.RELATIONAL_OPERATOR, "="));
try {
new QueryParser().parse(listTokens.toArray(new Token[listTokens.size()]));
fail("Expected InvalidQueryException due to invalid last token");
} catch (InvalidQueryException e) {
// expected
}
}
}