org.apache.openjpa.kernel.jpql
Class JPQLExpressionBuilder

java.lang.Object
  extended by org.apache.openjpa.kernel.exps.AbstractExpressionBuilder
      extended by org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder
All Implemented Interfaces:
org.apache.openjpa.kernel.jpql.JPQLTreeConstants

public class JPQLExpressionBuilder
extends AbstractExpressionBuilder
implements org.apache.openjpa.kernel.jpql.JPQLTreeConstants

Builder for JPQL expressions. This class takes the query parsed in JPQLExpressionBuilder.ParsedJPQL and converts it to an expression tree using an ExpressionFactory. Public for unit testing purposes.

Author:
Marc Prud'hommeaux, Patrick Linskey

Nested Class Summary
protected static class JPQLExpressionBuilder.JPQLNode
          Base node that will be generated by the JPQLExpressionBuilder; base class of the SimpleNode that is used by JPQLExpressionBuilder.ParsedJPQL.
static class JPQLExpressionBuilder.ParsedJPQL
          Public for unit testing purposes.
 
Field Summary
 
Fields inherited from class org.apache.openjpa.kernel.exps.AbstractExpressionBuilder
CONTAINS_TYPE_ELEMENT, CONTAINS_TYPE_KEY, CONTAINS_TYPE_VALUE, EX_FATAL, EX_UNSUPPORTED, EX_USER, factory, resolver, TYPE_CHAR_OBJ, TYPE_COLLECTION, TYPE_MAP, TYPE_NUMBER, TYPE_OBJECT, TYPE_STRING
 
Fields inherited from interface org.apache.openjpa.kernel.jpql.JPQLTreeConstants
JJTABS, JJTABSTRACTSCHEMANAME, JJTADD, JJTAGGREGATE, JJTALL, JJTAND, JJTANY, JJTASCENDING, JJTAVERAGE, JJTBETWEEN, JJTBOOLEANLITERAL, JJTCASE, JJTCLASSNAME, JJTCOALESCE, JJTCOLLECTIONPARAMETER, JJTCONCAT, JJTCONSTRUCTOR, JJTCONSTRUCTORPARAM, JJTCONSTRUCTORPARAMS, JJTCOUNT, JJTCURRENTDATE, JJTCURRENTTIME, JJTCURRENTTIMESTAMP, JJTDATELITERAL, JJTDECIMALLITERAL, JJTDELETE, JJTDESCENDING, JJTDISTINCT, JJTDISTINCTPATH, JJTDIVIDE, JJTENTRY, JJTEQUALS, JJTESCAPECHARACTER, JJTEXISTS, JJTFROM, JJTFROMITEM, JJTGENERALCASE, JJTGENERALIDENTIFIER, JJTGREATEROREQUAL, JJTGREATERTHAN, JJTGROUPBY, JJTGROUPBYEXTENSION, JJTHAVING, JJTIDENTIFICATIONVARIABLE, JJTIDENTIFIER, JJTIN, JJTINDEX, JJTINNERFETCHJOIN, JJTINNERJOIN, JJTINTEGERLITERAL, JJTISEMPTY, JJTISNULL, JJTKEY, JJTLENGTH, JJTLESSOREQUAL, JJTLESSTHAN, JJTLIKE, JJTLOCATE, JJTLOWER, JJTMAX, JJTMEMBEROF, JJTMIN, JJTMOD, JJTMULTIPLY, JJTNAMEDINPUTPARAMETER, JJTNEGATIVE, jjtNodeName, JJTNOT, JJTNOTEQUALS, JJTNULLIF, JJTOR, JJTORDERBY, JJTORDERBYEXTENSION, JJTORDERBYITEM, JJTOUTERFETCHJOIN, JJTOUTERJOIN, JJTPATH, JJTPATTERNVALUE, JJTPOSITIONALINPUTPARAMETER, JJTQUALIFIEDIDENTIFIER, JJTQUALIFIEDPATH, JJTSCALAREXPRESSION, JJTSELECT, JJTSELECTCLAUSE, JJTSELECTEXPRESSION, JJTSELECTEXPRESSIONS, JJTSELECTEXTENSION, JJTSIMPLECASE, JJTSIZE, JJTSQRT, JJTSTRINGLITERAL, JJTSUBSELECT, JJTSUBSTRING, JJTSUBTRACT, JJTSUM, JJTTIMELITERAL, JJTTIMESTAMPLITERAL, JJTTOK, JJTTRIM, JJTTRIMBOTH, JJTTRIMCHARACTER, JJTTRIMLEADING, JJTTRIMTRAILING, JJTTYPE, JJTTYPELITERAL, JJTUPDATE, JJTUPDATEITEM, JJTUPDATEVALUE, JJTUPPER, JJTVALUE, JJTVOID, JJTWHEN, JJTWHENSCALAR, JJTWHERE
 
Constructor Summary
JPQLExpressionBuilder(ExpressionFactory factory, ExpressionStoreQuery query, Object parsedQuery)
          Constructor.
 
Method Summary
protected  void addSchemaToContext(String id, ClassMetaData meta)
          Register the schema alias to the current JPQL query context.
protected  void addVariableToContext(String id, Value var)
          Register the variable associated with the schema alias (id) to the current JPQL query context.
static void checkEmbeddable(Value val, String currentQuery)
           
static Value convertSubstringArguments(ExpressionFactory factory, Value val1, Value val2, Value val3)
          Converts JPQL substring() function to OpenJPA ExpressionFactory substring() arguments.
protected  String currentQuery()
          Returns the current string being parsed; used for error messages.
protected  Expression evalFetchJoins(QueryExpressions exps)
           
protected  void evalSetClause(QueryExpressions exps)
           
protected  ClassMetaData getCandidateMetaData(JPQLExpressionBuilder.JPQLNode node)
           
protected  ClassLoader getClassLoader()
          Returns the class loader that should be used for resolving class names (in addition to the resolver in the query).
protected  Class<?> getDeclaredVariableType(String name)
          Returns the type of the named variable if it has been declared.
protected  Value getDefinedVariable(String id)
           
protected  Localizer getLocalizer()
          Used for obtaining the Localizer to use for translating error messages.
protected  JPQLExpressionBuilder.ParsedJPQL getParsedQuery()
           
protected  JPQLExpressionBuilder.ParsedJPQL getParsedQuery(String jpql)
           
protected  Value getVariable(String var)
          Returns the variable associated with the schema alias (id).
protected  Value getVariable(String id, boolean bind)
          Identification variables in JPQL are case insensitive, so lower-case all variables we are going to bind.
protected  boolean isDeclaredVariable(String name)
          Returns whether the specified variable name has been explicitly declared.
protected  boolean isSeenVariable(String var)
          Return whether the given id has been used as a variable.
protected  ClassMetaData resolveClassMetaData(JPQLExpressionBuilder.JPQLNode node)
           
 void setImplicitTypes(Value val1, Value val2, Class<?> expected)
          Set the implicit types of the given values based on the fact that they're used together, and based on the operator type.
static void setImplicitTypes(Value val1, Value val2, Class<?> expected, Resolver resolver, OrderedMap<Object,Class<?>> parameterTypes, String currentQuery)
           
 
Methods inherited from class org.apache.openjpa.kernel.exps.AbstractExpressionBuilder
addAccessPath, assertUnboundVariablesValid, bind, convertTypes, convertTypesQuotedNumbers, createVariable, getAccessPath, getMetaData, getMetaData, isBound, isNumeric, parseException, setImplicitContainsTypes, setImplicitType, setImplicitTypes, traversePath, traversePath, traverseStaticField, traverseXPath
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JPQLExpressionBuilder

public JPQLExpressionBuilder(ExpressionFactory factory,
                             ExpressionStoreQuery query,
                             Object parsedQuery)
Constructor.

Parameters:
factory - the expression factory to use
query - used to resolve variables, parameters, and class names used in the query
parsedQuery - the parsed query
Method Detail

getLocalizer

protected Localizer getLocalizer()
Description copied from class: AbstractExpressionBuilder
Used for obtaining the Localizer to use for translating error messages.

Specified by:
getLocalizer in class AbstractExpressionBuilder

getClassLoader

protected ClassLoader getClassLoader()
Description copied from class: AbstractExpressionBuilder
Returns the class loader that should be used for resolving class names (in addition to the resolver in the query).

Specified by:
getClassLoader in class AbstractExpressionBuilder

getParsedQuery

protected JPQLExpressionBuilder.ParsedJPQL getParsedQuery()

getParsedQuery

protected JPQLExpressionBuilder.ParsedJPQL getParsedQuery(String jpql)

resolveClassMetaData

protected ClassMetaData resolveClassMetaData(JPQLExpressionBuilder.JPQLNode node)

getCandidateMetaData

protected ClassMetaData getCandidateMetaData(JPQLExpressionBuilder.JPQLNode node)

currentQuery

protected String currentQuery()
Description copied from class: AbstractExpressionBuilder
Returns the current string being parsed; used for error messages.

Specified by:
currentQuery in class AbstractExpressionBuilder

evalFetchJoins

protected Expression evalFetchJoins(QueryExpressions exps)

evalSetClause

protected void evalSetClause(QueryExpressions exps)

isDeclaredVariable

protected boolean isDeclaredVariable(String name)
Description copied from class: AbstractExpressionBuilder
Returns whether the specified variable name has been explicitly declared. Note all query languages necessarily support declaring variables.

Specified by:
isDeclaredVariable in class AbstractExpressionBuilder
Parameters:
name - the variable to check
Returns:
true if the variabe has been explicitely declared

getVariable

protected Value getVariable(String id,
                            boolean bind)
Identification variables in JPQL are case insensitive, so lower-case all variables we are going to bind.

Overrides:
getVariable in class AbstractExpressionBuilder

getDefinedVariable

protected Value getDefinedVariable(String id)

isSeenVariable

protected boolean isSeenVariable(String var)
Description copied from class: AbstractExpressionBuilder
Return whether the given id has been used as a variable.

Overrides:
isSeenVariable in class AbstractExpressionBuilder

checkEmbeddable

public static void checkEmbeddable(Value val,
                                   String currentQuery)

convertSubstringArguments

public static Value convertSubstringArguments(ExpressionFactory factory,
                                              Value val1,
                                              Value val2,
                                              Value val3)
Converts JPQL substring() function to OpenJPA ExpressionFactory substring() arguments. The semantics of the JPQL substring() function are that arg2 is the 1-based start index, and arg3 is the length of the string to be return. This is different than the semantics of the ExpressionFactory's substring(), which matches the Java language (0-based start index, arg2 is the end index): we perform the translation by adding one to the first argument, and then adding the first argument to the second argument to get the endIndex.

Parameters:
val1 - the original String
val2 - the 1-based start index as per JPQL substring() semantics
val3 - the length of the returned string as per JPQL semantics

setImplicitTypes

public void setImplicitTypes(Value val1,
                             Value val2,
                             Class<?> expected)
Description copied from class: AbstractExpressionBuilder
Set the implicit types of the given values based on the fact that they're used together, and based on the operator type.

Overrides:
setImplicitTypes in class AbstractExpressionBuilder

setImplicitTypes

public static void setImplicitTypes(Value val1,
                                    Value val2,
                                    Class<?> expected,
                                    Resolver resolver,
                                    OrderedMap<Object,Class<?>> parameterTypes,
                                    String currentQuery)

getDeclaredVariableType

protected Class<?> getDeclaredVariableType(String name)
Description copied from class: AbstractExpressionBuilder
Returns the type of the named variable if it has been declared.

Specified by:
getDeclaredVariableType in class AbstractExpressionBuilder

addSchemaToContext

protected void addSchemaToContext(String id,
                                  ClassMetaData meta)
Description copied from class: AbstractExpressionBuilder
Register the schema alias to the current JPQL query context.

Specified by:
addSchemaToContext in class AbstractExpressionBuilder

addVariableToContext

protected void addVariableToContext(String id,
                                    Value var)
Description copied from class: AbstractExpressionBuilder
Register the variable associated with the schema alias (id) to the current JPQL query context.

Specified by:
addVariableToContext in class AbstractExpressionBuilder

getVariable

protected Value getVariable(String var)
Description copied from class: AbstractExpressionBuilder
Returns the variable associated with the schema alias (id).

Specified by:
getVariable in class AbstractExpressionBuilder
Returns:


Copyright © 2006-2010 Apache Software Foundation. All Rights Reserved.