use of org.datanucleus.query.expression.Literal in project datanucleus-core by datanucleus.
the class ArrayContainsMethod 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 Boolean.FALSE;
}
if (!invokedValue.getClass().isArray()) {
throw new NucleusException(Localiser.msg("021011", method, invokedValue.getClass().getName()));
}
Object param = expr.getArguments().get(0);
Object paramValue = null;
if (param instanceof Literal) {
paramValue = ((Literal) param).getLiteral();
} else 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 VariableExpression) {
VariableExpression varExpr = (VariableExpression) param;
try {
paramValue = eval.getValueForVariableExpression(varExpr);
} catch (VariableNotSetException vnse) {
// Throw an exception with the possible values
throw new VariableNotSetException(varExpr, (Object[]) invokedValue);
}
} else {
// TODO Implement this
throw new NucleusException("Dont currently support use of Array.contains(" + param.getClass().getName() + ")");
}
for (int i = 0; i < Array.getLength(invokedValue); i++) {
Object elem = Array.get(invokedValue, i);
if (elem == null && paramValue == null) {
return Boolean.TRUE;
} else if (elem != null && paramValue != null) {
if (elem.equals(paramValue)) {
return Boolean.TRUE;
}
if (!paramValue.getClass().isAssignableFrom(elem.getClass()) && !elem.getClass().isAssignableFrom(paramValue.getClass())) {
// Types are different, so add specific type conversion handling
if ((paramValue.getClass() == Long.class || paramValue.getClass() == Integer.class || paramValue.getClass() == Short.class) && (elem.getClass() == Long.class || elem.getClass() == Integer.class || elem.getClass() == Short.class)) {
long paramLong = ((Number) paramValue).longValue();
long elemLong = ((Number) elem).longValue();
if (paramLong == elemLong) {
return Boolean.TRUE;
}
}
}
}
}
return Boolean.FALSE;
}
use of org.datanucleus.query.expression.Literal in project datanucleus-core by datanucleus.
the class ListGetMethod 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 null;
}
if (!(invokedValue instanceof List)) {
throw new NucleusException(Localiser.msg("021011", method, invokedValue.getClass().getName()));
}
Object param = expr.getArguments().get(0);
Object paramValue = null;
if (param instanceof Literal) {
paramValue = ((Literal) param).getLiteral();
} else 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 VariableExpression) {
VariableExpression varExpr = (VariableExpression) param;
try {
paramValue = eval.getValueForVariableExpression(varExpr);
} catch (VariableNotSetException vnse) {
// Throw an exception with the possible values of elements
throw new VariableNotSetException(varExpr, ((List) invokedValue).toArray());
}
} else {
throw new NucleusException("Dont currently support use of get(" + param.getClass().getName() + ")");
}
int paramInt;
if (paramValue instanceof Number) {
paramInt = ((Number) paramValue).intValue();
} else {
throw new NucleusException("List.get() should take in an integer but is " + paramValue);
}
return ((List) invokedValue).get(paramInt);
}
use of org.datanucleus.query.expression.Literal in project datanucleus-core by datanucleus.
the class QueryUtils method getStringValueForExpression.
/**
* Convenience method to get the String value for an Expression.
* Currently only ParameterExpression and Literal are supported.
* @param expr Expression
* @param parameters Input parameters
* @return The String value in the object for this expression
*/
public static String getStringValueForExpression(Expression expr, Map parameters) {
String paramValue = null;
if (expr instanceof ParameterExpression) {
ParameterExpression paramExpr = (ParameterExpression) expr;
Object obj = getValueForParameterExpression(parameters, paramExpr);
paramValue = getStringValue(obj);
} else if (expr instanceof Literal) {
Literal literal = (Literal) expr;
paramValue = getStringValue(literal.getLiteral());
} else {
throw new NucleusException("getStringValueForExpression(expr) where expr is instanceof " + expr.getClass().getName() + " not supported");
}
return paramValue;
}
use of org.datanucleus.query.expression.Literal in project datanucleus-core by datanucleus.
the class JavaQueryCompiler method compileResult.
public Expression[] compileResult() {
if (result == null) {
return null;
}
Node[] node = parser.parseResult(result);
Expression[] expr = new Expression[node.length];
for (int i = 0; i < node.length; i++) {
ExpressionCompiler comp = new ExpressionCompiler();
comp.setSymbolTable(symtbl);
comp.setMethodAliases(queryMgr.getQueryMethodAliasesByPrefix());
// Find the last child of this node, and check for an alias (type = NAME)
String alias = null;
Node aliasNode = null;
List<Node> childNodes = node[i].getChildNodes();
if (childNodes != null && childNodes.size() > 0) {
Node lastChild = childNodes.get(childNodes.size() - 1);
if (lastChild.getNodeType() == NodeType.NAME) {
// Alias node
aliasNode = lastChild;
}
}
if (aliasNode != null) {
alias = (String) aliasNode.getNodeValue();
node[i].removeChildNode(aliasNode);
}
if (candidateAliasOrig != null) {
swapCandidateAliasNodeName(node[i]);
}
if (parameterSubtitutionMap != null) {
node[i] = swapSubqueryParameters(node[i]);
}
expr[i] = comp.compileExpression(node[i]);
if (alias != null) {
expr[i].setAlias(alias);
}
try {
expr[i].bind(symtbl);
} catch (PrimaryExpressionIsClassLiteralException peil) {
// PrimaryExpression should be swapped for a class Literal
expr[i] = peil.getLiteral();
expr[i].bind(symtbl);
} catch (PrimaryExpressionIsClassStaticFieldException peil) {
// PrimaryExpression should be swapped for a static field Literal
Field fld = peil.getLiteralField();
try {
// Get the value of the static field
Object value = fld.get(null);
expr[i] = new Literal(value);
expr[i].bind(symtbl);
} catch (Exception e) {
throw new NucleusUserException("Error processing static field " + fld.getName(), e);
}
} catch (PrimaryExpressionIsVariableException pive) {
// PrimaryExpression should be swapped for an implicit variable
expr[i] = pive.getVariableExpression();
expr[i].bind(symtbl);
}
if (expr[i] instanceof PrimaryExpression) {
String id = ((PrimaryExpression) expr[i]).getId();
if (isKeyword(id)) {
throw new NucleusUserException(Localiser.msg("021052", getLanguage(), id));
}
} else if (expr[i] instanceof ParameterExpression) {
String id = ((ParameterExpression) expr[i]).getId();
if (isKeyword(id)) {
throw new NucleusUserException(Localiser.msg("021052", getLanguage(), id));
}
} else if (expr[i] instanceof VariableExpression) {
String id = ((VariableExpression) expr[i]).getId();
if (isKeyword(id)) {
throw new NucleusUserException(Localiser.msg("021052", getLanguage(), id));
}
}
}
return expr;
}
use of org.datanucleus.query.expression.Literal in project tests by datanucleus.
the class JPQLCompilerTest method testFilterWithNegateExpression.
/**
* Tests for "!(expression)".
*/
public void testFilterWithNegateExpression() {
JavaQueryCompiler compiler = null;
QueryCompilation compilation = null;
try {
compiler = new JPQLCompiler(nucCtx, nucCtx.getClassLoaderResolver(null), null, Project.class, null, "NOT (budget > 32)", null, null, null, null, null, null, null);
compilation = compiler.compile(new HashMap(), null);
} catch (NucleusException ne) {
NucleusLogger.QUERY.error("Exception during compile", 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", "budget", 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());
}
Aggregations