use of com.linkedin.data.it.Predicate in project rest.li by linkedin.
the class TestPredicateExpressionParser method testAndAnd.
@Test
public void testAndAnd() {
final Predicate parsed = PredicateExpressionParser.parse("com.linkedin.data.it.AlwaysTruePredicate & com.linkedin.data.it.AlwaysTruePredicate & com.linkedin.data.it.AlwaysFalsePredicate");
Assert.assertEquals(parsed.getClass(), AndPredicate.class);
final List<Predicate> children = ((AndPredicate) parsed).getChildPredicates();
Assert.assertEquals(children.get(0).getClass(), AlwaysTruePredicate.class);
Assert.assertEquals(children.get(1).getClass(), AlwaysTruePredicate.class);
Assert.assertEquals(children.get(2).getClass(), AlwaysFalsePredicate.class);
}
use of com.linkedin.data.it.Predicate in project rest.li by linkedin.
the class TestPredicateExpressionParser method testAnd.
@Test
public void testAnd() {
final Predicate parsed = PredicateExpressionParser.parse("com.linkedin.data.it.AlwaysTruePredicate & com.linkedin.data.it.AlwaysFalsePredicate");
Assert.assertEquals(parsed.getClass(), AndPredicate.class);
final List<Predicate> children = ((AndPredicate) parsed).getChildPredicates();
Assert.assertEquals(children.get(0).getClass(), AlwaysTruePredicate.class);
Assert.assertEquals(children.get(1).getClass(), AlwaysFalsePredicate.class);
}
use of com.linkedin.data.it.Predicate in project rest.li by linkedin.
the class TestPredicateExpressionParser method testNotParenOr.
@Test
public void testNotParenOr() {
final Predicate parsed = PredicateExpressionParser.parse("!(com.linkedin.data.it.AlwaysTruePredicate | com.linkedin.data.it.AlwaysFalsePredicate)");
Assert.assertEquals(parsed.getClass(), NotPredicate.class);
final Predicate intermediate = ((NotPredicate) parsed).getChildPredicate();
Assert.assertEquals(intermediate.getClass(), OrPredicate.class);
final List<Predicate> children = ((OrPredicate) intermediate).getChildPredicates();
Assert.assertEquals(children.get(0).getClass(), AlwaysTruePredicate.class);
Assert.assertEquals(children.get(1).getClass(), AlwaysFalsePredicate.class);
}
use of com.linkedin.data.it.Predicate in project rest.li by linkedin.
the class PredicateExpressionParser method parse.
public static Predicate parse(String expression) {
final Stack<Predicate> predicateStack = new Stack<Predicate>();
final Stack<Character> operatorStack = new Stack<Character>();
final String trimmedExpression = expression.replaceAll("\\s", "");
final StringTokenizer tokenizer = new StringTokenizer(trimmedExpression, OPERATORS, true);
boolean isTokenMode = true;
while (true) {
final Character operator;
final String token;
if (isTokenMode) {
if (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
} else {
break;
}
if (OPERATORS.contains(token)) {
operator = token.charAt(0);
} else {
operator = null;
}
} else {
operator = operatorStack.pop();
token = null;
}
isTokenMode = true;
if (operator == null) {
try {
predicateStack.push(Class.forName(token).asSubclass(Predicate.class).newInstance());
} catch (ClassCastException e) {
throw new RuntimeException(token + " must implement " + Predicate.class.getName(), e);
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
if (operatorStack.empty() || operator == '(') {
operatorStack.push(operator);
} else if (operator == ')') {
while (operatorStack.peek() != '(') {
evaluate(predicateStack, operatorStack);
}
operatorStack.pop();
} else {
if (OPERATOR_PRECEDENCE.get(operator) < OPERATOR_PRECEDENCE.get(operatorStack.peek())) {
evaluate(predicateStack, operatorStack);
isTokenMode = false;
}
operatorStack.push(operator);
}
}
}
while (!operatorStack.empty()) {
evaluate(predicateStack, operatorStack);
}
if (predicateStack.size() > 1) {
throw new RuntimeException("Invalid logical expression");
}
return predicateStack.pop();
}
use of com.linkedin.data.it.Predicate in project rest.li by linkedin.
the class PredicateExpressionParser method evaluate.
private static void evaluate(Stack<Predicate> predicateStack, Stack<Character> operatorStack) {
final char operator = operatorStack.pop();
final Predicate evaluatedPredicate;
switch(operator) {
case '&':
case '|':
evaluatedPredicate = evaluateMultiaryOperator(predicateStack, operatorStack, operator);
break;
case '!':
evaluatedPredicate = Predicates.not(predicateStack.pop());
break;
default:
throw new RuntimeException("Unknown operator: " + operator);
}
predicateStack.push(evaluatedPredicate);
}
Aggregations