{
if (currentExpr == null && tupple.size() > 1)
{
// Check for starting with parameter/variable
String first = (String)tupple.get(0);
Symbol firstSym = symtbl.getSymbol(first);
if (firstSym != null)
{
if (firstSym.getType() == Symbol.PARAMETER)
{
currentExpr = new ParameterExpression(symtbl, first, -1);
if (tupple.size() > 2)
{
currentExpr = new PrimaryExpression(symtbl, currentExpr, tupple.subList(1, tupple.size()-1));
}
}
else if (firstSym.getType() == Symbol.VARIABLE)
{
currentExpr = new VariableExpression(symtbl, first);
if (tupple.size() > 2)
{
currentExpr = new PrimaryExpression(symtbl, currentExpr, tupple.subList(1, tupple.size()-1));
}
}
}
if (currentExpr == null)
{
currentExpr = new PrimaryExpression(symtbl, tupple.subList(0, tupple.size()-1));
}
}
String methodName = (String)tupple.get(tupple.size()-1);
if (currentExpr instanceof PrimaryExpression)
{
// TODO Add plugin point to define aliases for methods for the query language
// ExpressionCompiler would need to know the query language name
String id = ((PrimaryExpression)currentExpr).getId();
if (id.equals("Math") || id.equals("java.lang.Math"))
{
methodName = "Math." + methodName;
currentExpr = null;
}
else if (id.equals("JDOHelper") || id.equals("javax.jdo.JDOHelper"))
{
methodName = "JDOHelper." + methodName;
currentExpr = null;
}
}
List parameterExprs = getExpressionsForPropertiesOfNode(currentNode);
currentExpr = new InvokeExpression(symtbl, currentExpr, methodName, parameterExprs);
currentNode = currentNode.getFirstChild();
tupple = new ArrayList();
}
else if (currentNode.getNodeType() == Node.CAST)
{
if (currentExpr == null && tupple.size() > 1)
{
// Start from PrimaryExpression and invoke on that
currentExpr = new PrimaryExpression(symtbl, tupple.subList(0, tupple.size()-1));
PrimaryExpression primExpr = (PrimaryExpression)currentExpr;
if (primExpr.tuples.size() == 1)
{
Symbol sym = symtbl.getSymbol(primExpr.getId());
if (sym != null)
{
if (sym.getType() == Symbol.PARAMETER)
{
// Parameter symbol registered for this identifier so use ParameterExpression
currentExpr = new ParameterExpression(symtbl, primExpr.getId(), -1);
}
else if (sym.getType() == Symbol.VARIABLE)
{
// Variable symbol registered for this identifier so use VariableExpression
currentExpr = new VariableExpression(symtbl, primExpr.getId());
}
}
}
}
String className = (String)tupple.get(tupple.size()-1);
currentExpr = new CastExpression(symtbl, currentExpr, className);
currentNode = currentNode.getFirstChild();
tupple = new ArrayList();
}
else
{
// Part of identifier chain
currentNode = currentNode.getFirstChild();
}
}
if (currentExpr != null && tupple.size() > 0)
{
// We have a trailing identifier expression
// e.g "((B)a).c" where we have a CastExpression and trailing "c"
currentExpr = new PrimaryExpression(symtbl, currentExpr, tupple);
}
if (currentExpr == null)
{
// Find type of first of tupples
String first = (String)tupple.get(0);
Symbol firstSym = symtbl.getSymbol(first);
if (firstSym != null)
{
if (firstSym.getType() == Symbol.PARAMETER)
{
ParameterExpression paramExpr = new ParameterExpression(symtbl, first, -1);
if (tupple.size() > 1)
{
currentExpr = new PrimaryExpression(symtbl, paramExpr, tupple.subList(1, tupple.size()));
}
else
{
currentExpr = paramExpr;
}
}
else if (firstSym.getType() == Symbol.VARIABLE)
{
VariableExpression varExpr = new VariableExpression(symtbl, first);
if (tupple.size() > 1)
{
currentExpr = new PrimaryExpression(symtbl, varExpr, tupple.subList(1, tupple.size()));