use of org.datanucleus.query.expression.DyadicExpression in project tests by datanucleus.
the class JDOQLCompilerTest method testFilterCollectionContainsVariable.
/**
* Tests for collection.contains(element).
*/
public void testFilterCollectionContainsVariable() {
JavaQueryCompiler compiler = null;
QueryCompilation compilation = null;
try {
compiler = new JDOQLCompiler(nucCtx, nucCtx.getClassLoaderResolver(null), null, Inventory.class, null, "products.contains(element) && element.price < 200", null, null, null, null, null, null, Product.class.getName() + " element", null);
compilation = compiler.compile(new HashMap(), null);
} catch (NucleusException ne) {
NucleusLogger.QUERY.error("Exception thrown during compilation", ne);
fail("compilation of filter with valid field threw exception : " + ne.getMessage());
}
Expression expr = compilation.getExprFilter();
assertTrue("Compiled expression should have been DyadicExpression but wasnt", expr instanceof DyadicExpression);
DyadicExpression dyExpr = (DyadicExpression) expr;
// product.contains(element)
assertTrue("Left expression should have been InvokeExpression but wasnt", dyExpr.getLeft() instanceof InvokeExpression);
InvokeExpression leftExpr = (InvokeExpression) dyExpr.getLeft();
assertTrue("InvokeExpression should have been invoked on PrimaryExpression but wasnt", leftExpr.getLeft() instanceof PrimaryExpression);
assertEquals("Left expression : Name of field upon which we invoke the method was wrong", "products", ((PrimaryExpression) leftExpr.getLeft()).getId());
assertEquals("Left expression : Name of invoked method was wrong", "contains", leftExpr.getOperation());
assertEquals("Left expression : Number of parameters to contains() is wrong", 1, leftExpr.getArguments().size());
Object param1 = leftExpr.getArguments().get(0);
assertTrue("Left expression : Parameter1 to contains() is of wrong type", param1 instanceof VariableExpression);
VariableExpression vrExpr = (VariableExpression) param1;
assertEquals("Left expression : Name of variable to contains() is incorrect", "element", vrExpr.getId());
// element.price < 200
assertTrue("Right expression should have been DyadicExpression but wasnt", dyExpr.getRight() instanceof DyadicExpression);
DyadicExpression rightExpr = (DyadicExpression) dyExpr.getRight();
assertTrue("Right expression (left) should have been PrimaryExpression but wasnt", rightExpr.getLeft() instanceof PrimaryExpression);
PrimaryExpression rightExprLeft = (PrimaryExpression) rightExpr.getLeft();
assertTrue("Right expression (left).left is of incorrect type", rightExprLeft.getLeft() instanceof VariableExpression);
VariableExpression rightExprLeftLeft = (VariableExpression) rightExprLeft.getLeft();
assertTrue("Right expression (left).left is of incorrect type", rightExprLeft.getLeft() instanceof VariableExpression);
assertEquals("Right expression (left) part1 is incorrect", "element", rightExprLeftLeft.getId());
assertEquals("Right expression (left) has incorrect number of tuples", 1, rightExprLeft.getTuples().size());
assertEquals("Right expression (left) part2 is incorrect", "price", rightExprLeft.getTuples().get(0));
assertEquals("Right expression : Operator between left and right is incorrect", Expression.OP_LT, rightExpr.getOperator());
assertTrue("Right expression (right) should have been Literal but wasnt", rightExpr.getRight() instanceof Literal);
Literal rightExprRight = (Literal) rightExpr.getRight();
assertEquals("Right expression (right) literal has incorrect value", 200, ((Long) rightExprRight.getLiteral()).longValue());
// Check symbols
SymbolTable symbols = compilation.getSymbolTable();
assertTrue("Symbol table doesnt have entry for 'element'", symbols.hasSymbol("element"));
assertTrue("Symbol table doesnt have entry for 'this'", symbols.hasSymbol("this"));
Symbol sy1 = symbols.getSymbol("element");
assertEquals("Type of symbol for 'element' is wrong", Product.class, sy1.getValueType());
Symbol sy2 = symbols.getSymbol("this");
assertEquals("Type of symbol for 'this' is wrong", Inventory.class, sy2.getValueType());
}
use of org.datanucleus.query.expression.DyadicExpression in project tests by datanucleus.
the class JDOQLCompilerTest method testFilterImplicitVariable.
/**
* Test for use of an implicit variable in the filter.
*/
public void testFilterImplicitVariable() {
// Test use of implicit variable in filter
JavaQueryCompiler compiler = null;
QueryCompilation compilation = null;
try {
compiler = new JDOQLCompiler(nucCtx, nucCtx.getClassLoaderResolver(null), null, Product.class, null, "notaField == 2", null, null, null, null, null, null, null, null);
compilation = compiler.compile(null, null);
} catch (NucleusUserException ne) {
// TODO Debatable if this should throw a JDOUserException since the "notaField" is not bound, nor typed
NucleusLogger.QUERY.error("Exception thrown during compilation", ne);
fail("compilation of filter with valid field threw exception : " + ne.getMessage());
}
Expression expr = compilation.getExprFilter();
assertTrue("Compiled expression should have been DyadicExpression but wasnt", expr instanceof DyadicExpression);
DyadicExpression dyExpr = (DyadicExpression) expr;
assertTrue("Compiled left expression should be VariableExpression but isnt", dyExpr.getLeft() instanceof VariableExpression);
assertTrue("Compiled right expression should be Literal but isnt", dyExpr.getRight() instanceof Literal);
VariableExpression left = (VariableExpression) dyExpr.getLeft();
assertEquals("Variable expression name is wrong", left.getId(), "notaField");
Literal right = (Literal) dyExpr.getRight();
assertEquals("Literal has wrong value", new Long(2), right.getLiteral());
}
use of org.datanucleus.query.expression.DyadicExpression in project tests by datanucleus.
the class JDOQLCompilerTest method testFilterWithNegateExpression.
/**
* Tests for "!(expression)".
*/
public void testFilterWithNegateExpression() {
JavaQueryCompiler compiler = null;
QueryCompilation compilation = null;
try {
compiler = new JDOQLCompiler(nucCtx, nucCtx.getClassLoaderResolver(null), null, Product.class, null, "!(price > 32)", null, null, null, null, null, null, null, null);
compilation = compiler.compile(new HashMap(), null);
} catch (NucleusException ne) {
NucleusLogger.QUERY.error("Exception thrown during compilation", ne);
fail("compilation of filter with valid field threw exception : " + ne.getMessage());
}
Expression expr = compilation.getExprFilter();
assertTrue("Compiled expression should have been DyadicExpression but wasnt", expr instanceof DyadicExpression);
DyadicExpression dyExpr = (DyadicExpression) expr;
assertTrue("Compiled left expression should have been DyadicExpression but wasnt", dyExpr.getLeft() instanceof DyadicExpression);
assertNull("Compiled right expression should have been null but wasnt", dyExpr.getRight());
assertEquals("Expression operator is wrong", Expression.OP_NOT, dyExpr.getOperator());
DyadicExpression leftExpr = (DyadicExpression) dyExpr.getLeft();
assertTrue("Left (left) should be PrimaryExpression but isnt", leftExpr.getLeft() instanceof PrimaryExpression);
assertTrue("Left (right) should be Literal but isnt", leftExpr.getRight() instanceof Literal);
assertEquals("Left expression operator is wrong", Expression.OP_GT, leftExpr.getOperator());
PrimaryExpression primExpr = (PrimaryExpression) leftExpr.getLeft();
assertEquals("Left (left) expression has incorrect number of tuples", 1, primExpr.getTuples().size());
assertEquals("Left (left) expression 'id' is incorrect", "price", primExpr.getId());
Literal lit = (Literal) leftExpr.getRight();
assertTrue("Left (right) expression literal is of incorrect type", lit.getLiteral() instanceof Long);
assertEquals("Left (right) expression literal has incorrect value", 32, ((Long) lit.getLiteral()).longValue());
}
use of org.datanucleus.query.expression.DyadicExpression in project datanucleus-core by datanucleus.
the class MathFunction method evaluate.
/* (non-Javadoc)
* @see org.datanucleus.query.evaluator.memory.InvocationEvaluator#evaluate(org.datanucleus.query.expression.InvokeExpression, org.datanucleus.query.evaluator.memory.InMemoryExpressionEvaluator)
*/
public Object evaluate(InvokeExpression expr, Object invokedValue, InMemoryExpressionEvaluator eval) {
String method = expr.getOperation();
Object param = expr.getArguments().get(0);
Object paramValue = null;
if (param instanceof PrimaryExpression) {
PrimaryExpression primExpr = (PrimaryExpression) param;
paramValue = eval.getValueForPrimaryExpression(primExpr);
} else if (param instanceof ParameterExpression) {
ParameterExpression paramExpr = (ParameterExpression) param;
paramValue = QueryUtils.getValueForParameterExpression(eval.getParameterValues(), paramExpr);
} else if (param instanceof InvokeExpression) {
InvokeExpression invokeExpr = (InvokeExpression) param;
paramValue = eval.getValueForInvokeExpression(invokeExpr);
} else if (param instanceof Literal) {
paramValue = ((Literal) param).getLiteral();
} else if (param instanceof DyadicExpression) {
DyadicExpression dyExpr = (DyadicExpression) param;
paramValue = dyExpr.evaluate(eval);
} else {
throw new NucleusException(method + "(num) where num is instanceof " + param.getClass().getName() + " not supported");
}
Object result = null;
if (paramValue instanceof Double) {
result = new Double(evaluateMathFunction(((Double) paramValue).doubleValue()));
} else if (paramValue instanceof Float) {
result = new Float(evaluateMathFunction(((Float) paramValue).floatValue()));
} else if (paramValue instanceof BigDecimal) {
result = new BigDecimal(evaluateMathFunction(((BigDecimal) paramValue).doubleValue()));
} else if (paramValue instanceof Integer) {
result = new Double(evaluateMathFunction(((Integer) paramValue).doubleValue()));
} else if (paramValue instanceof Long) {
result = new Double(evaluateMathFunction(((Long) paramValue).doubleValue()));
} else {
throw new NucleusException("Not possible to use " + getFunctionName() + " on value of type " + paramValue.getClass().getName());
}
return result;
}
use of org.datanucleus.query.expression.DyadicExpression in project datanucleus-core by datanucleus.
the class StringCharAtMethod method evaluate.
/* (non-Javadoc)
* @see org.datanucleus.query.evaluator.memory.InvocationEvaluator#evaluate(org.datanucleus.query.expression.InvokeExpression, org.datanucleus.query.evaluator.memory.InMemoryExpressionEvaluator)
*/
public Object evaluate(InvokeExpression expr, Object invokedValue, InMemoryExpressionEvaluator eval) {
String method = expr.getOperation();
if (invokedValue == null) {
return Integer.valueOf(-1);
}
if (!(invokedValue instanceof String)) {
throw new NucleusException(Localiser.msg("021011", method, invokedValue.getClass().getName()));
}
// Evaluate the argument
Object arg1Obj = null;
Object param = expr.getArguments().get(0);
if (param instanceof PrimaryExpression) {
PrimaryExpression primExpr = (PrimaryExpression) param;
arg1Obj = eval.getValueForPrimaryExpression(primExpr);
} else if (param instanceof ParameterExpression) {
ParameterExpression paramExpr = (ParameterExpression) param;
arg1Obj = QueryUtils.getValueForParameterExpression(eval.getParameterValues(), paramExpr);
} else if (param instanceof Literal) {
arg1Obj = ((Literal) param).getLiteral();
} else if (param instanceof InvokeExpression) {
arg1Obj = eval.getValueForInvokeExpression((InvokeExpression) param);
} else if (param instanceof DyadicExpression) {
arg1Obj = ((DyadicExpression) param).evaluate(eval);
} else {
throw new NucleusException(method + "(param1) where param is instanceof " + param.getClass().getName() + " not supported");
}
if (!(arg1Obj instanceof Number)) {
throw new NucleusException(method + "(param1]) : param1 must be numeric");
}
int arg1 = ((Number) arg1Obj).intValue();
return Integer.valueOf(((String) invokedValue).indexOf(arg1));
}
Aggregations