public class DeclarationResolver extends Resolver
Resolver
is responsible to visit the current query (which is either the top-level
query or a subquery) and gathers the information from the declaration clause. For a SELECT
or DELETE clause, the information will be retrieved from the FROM clause. For an
UDPATE
clause, it will be retrieved from the unique identification range variable
declaration.Modifier and Type | Class and Description |
---|---|
protected class |
DeclarationResolver.DeclarationVisitor |
protected class |
DeclarationResolver.QualifyRangeDeclarationVisitor |
protected class |
DeclarationResolver.RootObjectExpressionVisitor
This visitor takes care to support a subquery defined as a "root" object.
|
Constructor and Description |
---|
DeclarationResolver(DeclarationResolver parent,
JPQLQueryContext queryContext)
Creates a new
DeclarationResolver . |
Modifier and Type | Method and Description |
---|---|
protected void |
addDeclaration(Declaration declaration)
Adds the given
Declaration at the end of the list. |
void |
addRangeVariableDeclaration(java.lang.String entityName,
java.lang.String variableName)
Registers a range variable declaration that will be used when a JPQL fragment is parsed.
|
protected DeclarationResolver.DeclarationVisitor |
buildDeclarationVisitor() |
protected DeclarationResolver.RootObjectExpressionVisitor |
buildRootObjectExpressionVisitor() |
protected IType |
buildType()
|
protected ITypeDeclaration |
buildTypeDeclaration()
Resolves the
ITypeDeclaration of the property handled by this Resolver . |
protected void |
checkParent(Resolver parent) |
void |
convertUnqualifiedDeclaration(Declaration declaration,
java.lang.String outerVariableName)
Converts the given
Declaration from being set as a range variable declaration to
a path expression declaration. |
void |
dispose()
Disposes the internal data.
|
Declaration |
getDeclaration(java.lang.String variableName)
Retrieves the
Declaration for which the given variable name is used to navigate to the
"root" object. |
java.util.List<Declaration> |
getDeclarations()
Returns the ordered list of
Declarations . |
protected DeclarationResolver.DeclarationVisitor |
getDeclarationVisitor() |
DeclarationResolver |
getParent()
Returns the parent of this
Resolver . |
IQuery |
getQuery()
Returns the external form representing the JPQL query.
|
protected JPQLQueryContext |
getQueryContext()
Returns the
JPQLQueryContext that is used by this visitor. |
Resolver |
getResolver(java.lang.String variableName)
Retrieves the
Resolver mapped with the given identification variable. |
protected Resolver |
getResolverImp(java.lang.String variableName)
Retrieves the
Resolver mapped with the given identification variable. |
java.util.Set<java.lang.String> |
getResultVariables()
Returns the variables that got defined in the select expression.
|
java.util.Map<IdentificationVariable,java.lang.String> |
getResultVariablesMap()
Returns the map of result variables that got used to define a select expression.
|
protected DeclarationResolver.RootObjectExpressionVisitor |
getRootObjectExpressionVisitor() |
boolean |
hasJoins()
Determines whether the JPQL expression has JOIN expressions.
|
protected void |
initialize(JPQLQueryContext queryContext)
Initializes this
DeclarationResolver . |
boolean |
isCollectionIdentificationVariable(java.lang.String variableName)
Determines whether the given identification variable is defining a JOIN expression or
in a
IN expressions for a collection-valued field. |
protected boolean |
isCollectionIdentificationVariableImp(java.lang.String variableName)
Determines whether the given identification variable is defining a JOIN expression or
in a
IN expressions for a collection-valued field. |
boolean |
isRangeIdentificationVariable(java.lang.String variableName)
Determines whether the given variable name is an identification variable name mapping an
entity.
|
protected boolean |
isRangeIdentificationVariableImp(java.lang.String variableName)
Determines whether the given variable name is an identification variable name mapping an
entity.
|
boolean |
isResultVariable(java.lang.String variable)
Determines if the given variable is a result variable.
|
void |
populate(Expression expression)
Visits the current query (which is either the top-level query or a subquery) and gathers the
information from the declaration clause.
|
protected DeclarationResolver.QualifyRangeDeclarationVisitor |
qualifyRangeDeclarationVisitor() |
protected Resolver |
resolveRootObject(Expression expression)
Resolves the "root" object represented by the given
Expression . |
protected java.lang.String |
visitDeclaration(Expression expression,
Expression identificationVariable) |
addChild, getChild, getManagedType, getMapping, getParentManagedType, getParentMapping, getParentType, getParentTypeDeclaration, getProvider, getType, getType, getType, getTypeDeclaration, getTypeHelper, getTypeRepository, isNullAllowed, setNullAllowed
public DeclarationResolver(DeclarationResolver parent, JPQLQueryContext queryContext)
DeclarationResolver
.parent
- The parent resolver if this is used for a subquery or null if it's used for the
top-level queryqueryContext
- The context used to query information about the queryprotected final void addDeclaration(Declaration declaration)
Declaration
at the end of the list.declaration
- The Declaration
representing a single variable declarationpublic void addRangeVariableDeclaration(java.lang.String entityName, java.lang.String variableName)
entityName
- The name of the entity to be accessible with the given variable namevariableName
- The identification variable used to navigate to the entityprotected DeclarationResolver.DeclarationVisitor buildDeclarationVisitor()
protected DeclarationResolver.RootObjectExpressionVisitor buildRootObjectExpressionVisitor()
protected IType buildType()
protected ITypeDeclaration buildTypeDeclaration()
ITypeDeclaration
of the property handled by this Resolver
.buildTypeDeclaration
in class Resolver
ITypeDeclaration
that was resolved by this Resolver
or the
ITypeDeclaration
for IType.UNRESOLVABLE_TYPE
if it could not be resolvedprotected void checkParent(Resolver parent)
checkParent
in class Resolver
public void convertUnqualifiedDeclaration(Declaration declaration, java.lang.String outerVariableName)
Declaration
from being set as a range variable declaration to
a path expression declaration.
In this query "UPDATE Employee SET firstName = 'MODIFIED' WHERE (SELECT COUNT(m) FROM
managedEmployees m) > 0
" managedEmployees is an unqualified
collection-valued path expression (employee.managedEmployees
).
declaration
- The Declaration
that was parsed to range over an abstract schema
name but is actually ranging over a path expressionouterVariableName
- The identification variable coming from the parent identification
variable declarationpublic void dispose()
public Declaration getDeclaration(java.lang.String variableName)
Declaration
for which the given variable name is used to navigate to the
"root" object.variableName
- The name of the identification variable that is used to navigate a "root" objectDeclaration
containing the information about the identification variable declarationpublic java.util.List<Declaration> getDeclarations()
Declarations
.Declarations
of the current query that was parsedprotected DeclarationResolver.DeclarationVisitor getDeclarationVisitor()
public DeclarationResolver getParent()
Resolver
.public IQuery getQuery()
protected JPQLQueryContext getQueryContext()
JPQLQueryContext
that is used by this visitor.JPQLQueryContext
holding onto the JPQL query and the cached informationpublic Resolver getResolver(java.lang.String variableName)
Resolver
mapped with the given identification variable. If the
identification is not defined in the declaration traversed by this resolver, than the search
will traverse the parent hierarchy.protected Resolver getResolverImp(java.lang.String variableName)
Resolver
mapped with the given identification variable. The search does
not traverse the parent hierarchy.public java.util.Set<java.lang.String> getResultVariables()
public java.util.Map<IdentificationVariable,java.lang.String> getResultVariablesMap()
protected DeclarationResolver.RootObjectExpressionVisitor getRootObjectExpressionVisitor()
public boolean hasJoins()
true
if the query or subquery being traversed contains JOIN
expressions; false
otherwiseprotected void initialize(JPQLQueryContext queryContext)
DeclarationResolver
.queryContext
- The context used to query information about the querypublic boolean isCollectionIdentificationVariable(java.lang.String variableName)
IN
expressions for a collection-valued field. If the search didn't find the
identification in this resolver, then it will traverse the parent hierarchy.variableName
- The identification variable to check for what it mapstrue
if the given identification variable maps a collection-valued field
defined in a JOIN
or IN
expression; false
otherwiseprotected boolean isCollectionIdentificationVariableImp(java.lang.String variableName)
IN
expressions for a collection-valued field. The search does not traverse
the parent hierarchy.variableName
- The identification variable to check for what it mapstrue
if the given identification variable maps a collection-valued field
defined in a JOIN
or IN
expression; false
otherwisepublic boolean isRangeIdentificationVariable(java.lang.String variableName)
variableName
- The name of the variable to verify if it's defined in a range variable
declaration in the current query or any parent querytrue
if the variable name is mapping an abstract schema name; false
if it's defined in a collection member declarationprotected boolean isRangeIdentificationVariableImp(java.lang.String variableName)
variableName
- The name of the variable to verify if it's defined in a range variable
declaration in the current query or any parent querytrue
if the variable name is mapping an abstract schema name; false
if it's defined in a collection member declarationpublic boolean isResultVariable(java.lang.String variable)
variable
- The variable to check if it's a result variabletrue
if the given variable is defined as a result variable; false
otherwisepublic void populate(Expression expression)
expression
- The Expression
to visit in order to retrieve the information
contained in the given query's declarationprotected DeclarationResolver.QualifyRangeDeclarationVisitor qualifyRangeDeclarationVisitor()
protected Resolver resolveRootObject(Expression expression)
Expression
. This will also handle
using a subquery in the FROM
clause. This is only supported by EclipseLink.expression
- The Expression
to visit, which represents the "root" object of a
declarationResolver
for the given Expression
protected java.lang.String visitDeclaration(Expression expression, Expression identificationVariable)