Class JPQLQueryContext
- java.lang.Object
-
- org.eclipse.persistence.jpa.jpql.tools.JPQLQueryContext
-
- Direct Known Subclasses:
DefaultJPQLQueryContext,EclipseLinkJPQLQueryContext
public abstract class JPQLQueryContext extends java.lang.ObjectThis context is used to store information related to the JPQL query.
If the JPQL query is already parsed, then the context can use it and it needs to be set before setting theIQueryexternalQuery = ...; JPQLQueryContext context = new JPQLQueryContext(DefaultJPQLGrammar.instance()); context.setQuery(query);IQuery:JPQLExpressionjpqlExpression = ...; JPQLQueryContext context = new JPQLQueryContext(DefaultJPQLGrammar.instance()); context.setJPQLExpression(jpqlExpression); context.setQuery(query);Provisional API: This interface is part of an interim API that is still under development and expected to change significantly before reaching stability. It is available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
- Version:
- 2.5
- Author:
- Pascal Filion
- Since:
- 2.3
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected classJPQLQueryContext.InputParameterVisitorThis visitor is responsible to find theInputParameterswith a certain parameter name.protected static classJPQLQueryContext.QueryExpressionVisitorThis visitor is responsible to retrieve theExpressionthat is the beginning of a query.
-
Field Summary
Fields Modifier and Type Field Description protected JPQLQueryContextcurrentContextThe currentJPQLQueryContextis the context used for the current query or subquery.protected JPQLQueryContextparentWhen this context is a sub-context used for a subquery, then this is the context for the parent query.
-
Constructor Summary
Constructors Modifier Constructor Description JPQLQueryContext(JPQLGrammar jpqlGrammar)Creates a newJPQLQueryContext.protectedJPQLQueryContext(JPQLQueryContext parent, Expression currentQuery)Creates a new sub-JPQLQueryContext.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected DeclarationResolverbuildDeclarationResolver()protected DeclarationResolverbuildDeclarationResolver(DeclarationResolver parent)protected JPQLQueryContext.InputParameterVisitorbuildInputParameter()protected abstract JPQLQueryContextbuildJPQLQueryContext(JPQLQueryContext currentContext, Expression currentQuery)protected abstract LiteralVisitorbuildLiteralVisitor()protected abstract ParameterTypeVisitorbuildParameterTypeVisitor()protected JPQLQueryContext.QueryExpressionVisitorbuildQueryExpressionVisitor()protected abstract ResolverBuilderbuildResolverBuilder()voidconvertUnqualifiedDeclaration(Declaration declaration)Converts the givenDeclarationfrom being set as a range variable declaration to a path expression declaration.voiddispose()Disposes the internal data.voiddisposeSubqueryContext()Disposes this context, which is the current context being used by a subquery.java.util.Collection<InputParameter>findInputParameters(java.lang.String parameterName)Retrieves all theInputParameterswith the given parameter name.ExpressiongetActualCurrentQuery()Returns the currentExpressionbeing manipulated, which is either the top-level query or a subquery.DeclarationResolvergetActualDeclarationResolver()Returns theDeclarationResolverof this context and not from the current query's declaration.JPQLQueryContextgetCurrentContext()Returns the currentJPQLQueryContext, i.e. the context of the query being manipulated, which can either be the top-level query or a subquery.ExpressiongetCurrentQuery()Returns the currentExpressionbeing manipulated, which is either the top-level query or a subquery.DeclarationgetDeclaration(java.lang.String variableName)Retrieves theDeclarationfor which the given variable name is used to navigate to the "root" object.DeclarationResolvergetDeclarationResolver()Returns theDeclarationResolverof the current query's declaration.DeclarationResolvergetDeclarationResolver(Expression expression)Returns theDeclarationResolverof the current query's declaration.protected DeclarationResolvergetDeclarationResolverImp()Returns theDeclarationResolverof the current query's declaration.java.util.List<Declaration>getDeclarations()Returns the ordered list ofDeclarations.ITypegetEnumType(java.lang.String enumTypeName)Returns theITyperepresenting the possible given enum type.ExpressionRegistrygetExpressionRegistry()Returns the registry containing theJPQLQueryBNFsand theExpressionFactoriesthat are used to properly parse a JPQL query.JPQLGrammargetGrammar()Returns the JPQL grammar that will be used to define how to parse a JPQL query.protected JPQLQueryContext.InputParameterVisitorgetInputParameterVisitor()JPAVersiongetJPAVersion()Returns the version of the Java Persistence to support, which dictates which version of the JPQL grammar to support.JPQLExpressiongetJPQLExpression()Returns the parsed tree representation of the JPQL query.java.lang.StringgetJPQLQuery()Returns the string representation of the JPQL query.protected LiteralVisitorgetLiteralVisitor()IMappinggetMapping(Expression expression)Returns theIMappingfor the field represented by the givenExpression.ITypegetParameterType(InputParameter inputParameter)Retrieves, if it can be determined, the type of the givenInputParameter.protected ParameterTypeVisitorgetParameterTypeVisitor()JPQLQueryContextgetParent()Returns the parent context if the current context is not the root context.IManagedTypeProvidergetProvider()Retrieves the provider of managed types.java.lang.StringgetProviderVersion()Returns the version of the persistence provider.IQuerygetQuery()Returns the external form of the JPQL query.ExpressiongetQueryExpression(Expression expression)Retrieves theExpressionrepresenting the query statement (either the top-level queryJPQLExpressionor the subquerySimpleSelectStatement) owning the givenExpression.protected JPQLQueryContext.QueryExpressionVisitorgetQueryExpressionVisitor()ResolvergetResolver(java.lang.String variableName)Retrieves theResolvermapped with the given identification variable.ResolvergetResolver(Expression expression)Creates or retrieved the cachedResolverfor the givenExpression.protected ResolverBuildergetResolverBuilder()java.util.Set<java.lang.String>getResultVariables()Returns the variables that got defined in the select expression.ITypegetType(java.lang.Class<?> type)Retrieves the external type for the given Java type.ITypegetType(java.lang.String typeName)Retrieves the external class with the given fully qualified class name.ITypegetType(Expression expression)Returns theITypeof the givenExpression.ITypeDeclarationgetTypeDeclaration(Expression expression)Returns theITypeDeclarationof the field handled by thisResolver.TypeHelpergetTypeHelper()Returns a helper that gives access to the most commontypes.ITypeRepositorygetTypeRepository()Returns the type repository for the application.booleanhasJoins()Determines whether the JPQL expression has JOIN expressions.protected voidinitialize(JPQLGrammar jpqlGrammar)Initializes thisJPQLQueryContext.protected voidinitializeRoot()Initializes the parsed tree representation of the JPQL query if it has not been set before setting theIQuery.booleanisCollectionIdentificationVariable(java.lang.String variableName)Determines whether the given identification variable is defining a join or a collection member declaration expressions.booleanisRangeIdentificationVariable(java.lang.String variableName)Determines whether the given variable name is an identification variable name used to define an abstract schema name.booleanisResultVariable(java.lang.String variable)Determines if the given variable is a result variable.booleanisSubquery()Determines whether thisJPQLQueryContextcurrently holds the information of a subquery or for the top-level query.booleanisTolerant()Determines if the parser is in tolerant mode or is in fast mode.java.lang.Stringliteral(Expression expression, LiteralType type)Retrieves the "literal" from the givenExpression.voidnewSubqueryContext(Expression currentQuery)Changes the state of this context to use the given subquery.voidsetJPQLExpression(JPQLExpression jpqlExpression)Sets the parsed tree representation of the JPQL query.voidsetQuery(IQuery query)Sets the external form of the JPQL query, which will be parsed and information will be extracted for later access.voidsetTolerant(boolean tolerant)Sets whether the parser is in tolerant mode or is in fast mode.protected voidstore(JPQLQueryContext parent, Expression currentQuery)Stores the information contained in the given parent into this one.java.lang.StringtoString()
-
-
-
Field Detail
-
currentContext
protected JPQLQueryContext currentContext
The currentJPQLQueryContextis the context used for the current query or subquery. If the current context is not the global context, then its parent is nonnull.
-
parent
protected JPQLQueryContext parent
When this context is a sub-context used for a subquery, then this is the context for the parent query.
-
-
Constructor Detail
-
JPQLQueryContext
public JPQLQueryContext(JPQLGrammar jpqlGrammar)
Creates a newJPQLQueryContext.- Parameters:
jpqlGrammar- TheJPQLGrammardefines how to parse a JPQL query
-
JPQLQueryContext
protected JPQLQueryContext(JPQLQueryContext parent, Expression currentQuery)
Creates a new sub-JPQLQueryContext.- Parameters:
parent- The parent contextcurrentQuery- The parsed tree representation of the subquery
-
-
Method Detail
-
buildDeclarationResolver
protected DeclarationResolver buildDeclarationResolver()
-
buildDeclarationResolver
protected DeclarationResolver buildDeclarationResolver(DeclarationResolver parent)
-
buildInputParameter
protected JPQLQueryContext.InputParameterVisitor buildInputParameter()
-
buildJPQLQueryContext
protected abstract JPQLQueryContext buildJPQLQueryContext(JPQLQueryContext currentContext, Expression currentQuery)
-
buildLiteralVisitor
protected abstract LiteralVisitor buildLiteralVisitor()
-
buildParameterTypeVisitor
protected abstract ParameterTypeVisitor buildParameterTypeVisitor()
-
buildQueryExpressionVisitor
protected JPQLQueryContext.QueryExpressionVisitor buildQueryExpressionVisitor()
-
buildResolverBuilder
protected abstract ResolverBuilder buildResolverBuilder()
-
convertUnqualifiedDeclaration
public void convertUnqualifiedDeclaration(Declaration declaration)
Converts the givenDeclarationfrom 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).- Parameters:
declaration- TheDeclarationthat was parsed to range over an abstract schema name but is actually ranging over a path expression
-
dispose
public void dispose()
Disposes the internal data.
-
disposeSubqueryContext
public void disposeSubqueryContext()
Disposes this context, which is the current context being used by a subquery. Once it is disposed, any information retrieved will be for the subquery's parent query.
-
findInputParameters
public java.util.Collection<InputParameter> findInputParameters(java.lang.String parameterName)
Retrieves all theInputParameterswith the given parameter name.- Parameters:
parameterName- The parameter used to find theInputParameterswith the same value- Returns:
- Either the
InputParametersthat has the given parameter or an empty collection
-
getActualCurrentQuery
public Expression getActualCurrentQuery()
Returns the currentExpressionbeing manipulated, which is either the top-level query or a subquery.- Returns:
- Either the top-level query or a subquery
-
getActualDeclarationResolver
public DeclarationResolver getActualDeclarationResolver()
Returns theDeclarationResolverof this context and not from the current query's declaration.- Returns:
- The
DeclarationResolverfor this context
-
getCurrentContext
public JPQLQueryContext getCurrentContext()
Returns the currentJPQLQueryContext, i.e. the context of the query being manipulated, which can either be the top-level query or a subquery.- Returns:
- The active context
-
getCurrentQuery
public Expression getCurrentQuery()
Returns the currentExpressionbeing manipulated, which is either the top-level query or a subquery.- Returns:
- Either the top-level query or a subquery
-
getDeclaration
public Declaration getDeclaration(java.lang.String variableName)
Retrieves theDeclarationfor which the given variable name is used to navigate to the "root" object. This does not go up the hierarchy when looking for theDeclaration.- Parameters:
variableName- The name of the identification variable that is used to navigate a "root" object- Returns:
- The
Declarationcontaining the information about the identification variable declaration - Since:
- 2.5
-
getDeclarationResolver
public DeclarationResolver getDeclarationResolver()
Returns theDeclarationResolverof the current query's declaration. For a SELECT query, it contains the information defined in the FROM clause. For DELETE and UPDATE queries, it contains a single range declaration variable. If the current query is a subquery, then it contains the information defined in theFROMclause.- Returns:
- The
DeclarationResolverfor the current query being visited
-
getDeclarationResolver
public DeclarationResolver getDeclarationResolver(Expression expression)
Returns theDeclarationResolverof the current query's declaration. For a SELECT query, it contains the information defined in the FROM clause. For DELETE and UPDATE queries, it contains a single range variable declaration. If the current query is a subquery, then it contains the information defined in the subqueryFROMclause.- Parameters:
expression- TheExpressionthat will be used to retrieve its query expression, i.e. eitherJPQLExpressionorSimpleSelectStatement- Returns:
- The
DeclarationResolverfor the current query being visited
-
getDeclarationResolverImp
protected DeclarationResolver getDeclarationResolverImp()
Returns theDeclarationResolverof the current query's declaration.- Returns:
- The
DeclarationResolverfor the current query being visited
-
getDeclarations
public java.util.List<Declaration> getDeclarations()
Returns the ordered list ofDeclarations.- Returns:
- The
Declarationsof the current query that was parsed
-
getEnumType
public IType getEnumType(java.lang.String enumTypeName)
Returns theITyperepresenting the possible given enum type. If the type name- Parameters:
enumTypeName- The fully qualified enum type with the constant- Returns:
- The external form for the given Enum type
-
getExpressionRegistry
public ExpressionRegistry getExpressionRegistry()
Returns the registry containing theJPQLQueryBNFsand theExpressionFactoriesthat are used to properly parse a JPQL query.- Returns:
- The registry containing the information related to the JPQL grammar
-
getGrammar
public JPQLGrammar getGrammar()
Returns the JPQL grammar that will be used to define how to parse a JPQL query.- Returns:
- The grammar that was used to parse this
Expression
-
getInputParameterVisitor
protected JPQLQueryContext.InputParameterVisitor getInputParameterVisitor()
-
getJPAVersion
public JPAVersion getJPAVersion()
Returns the version of the Java Persistence to support, which dictates which version of the JPQL grammar to support.- Returns:
- The version of the supported Java Persistence functional specification
-
getJPQLExpression
public JPQLExpression getJPQLExpression()
Returns the parsed tree representation of the JPQL query.- Returns:
- The parsed tree representation of the JPQL query
-
getJPQLQuery
public java.lang.String getJPQLQuery()
Returns the string representation of the JPQL query.- Returns:
- The string representation of the JPQL query
-
getLiteralVisitor
protected LiteralVisitor getLiteralVisitor()
-
getMapping
public IMapping getMapping(Expression expression)
Returns theIMappingfor the field represented by the givenExpression.- Parameters:
expression- TheExpressionrepresenting a state field path expression or a collection-valued path expression- Returns:
- Either the
IMappingornullif none exists
-
getParameterType
public IType getParameterType(InputParameter inputParameter)
Retrieves, if it can be determined, the type of the givenInputParameter. The type will be guessed based on its location within expression.Note: Both named and positional input parameter can be used.
- Parameters:
inputParameter- TheInputParameterto retrieve its type- Returns:
- Either the closest type of the input parameter or
nullif the type could not be determined
-
getParameterTypeVisitor
protected ParameterTypeVisitor getParameterTypeVisitor()
-
getParent
public JPQLQueryContext getParent()
Returns the parent context if the current context is not the root context.- Returns:
- The parent context or
nullif the current context is the root
-
getProvider
public IManagedTypeProvider getProvider()
Retrieves the provider of managed types.- Returns:
- The object that has access to the application's managed types.
-
getProviderVersion
public java.lang.String getProviderVersion()
Returns the version of the persistence provider.- Returns:
- The version of the persistence provider, if one is extending the default JPQL grammar defined in the Java Persistence specification, otherwise returns an empty string
- Since:
- 2.5
-
getQuery
public IQuery getQuery()
Returns the external form of the JPQL query.- Returns:
- The external form of the JPQL query
-
getQueryExpression
public Expression getQueryExpression(Expression expression)
Retrieves theExpressionrepresenting the query statement (either the top-level queryJPQLExpressionor the subquerySimpleSelectStatement) owning the givenExpression.- Parameters:
expression- A child of the "root"Expressionto retrieve- Returns:
- The query statement that is the "root" parent of the given
Expression
-
getQueryExpressionVisitor
protected JPQLQueryContext.QueryExpressionVisitor getQueryExpressionVisitor()
-
getResolver
public Resolver getResolver(Expression expression)
Creates or retrieved the cachedResolverfor the givenExpression. TheResolvercan return theITypeandITypeDeclarationof theExpressionand either theIManagedTypeor theIMapping.- Parameters:
expression- TheExpressionfor which itsResolverwill be retrieved- Returns:
Resolverfor the givenExpression
-
getResolver
public Resolver getResolver(java.lang.String variableName)
Retrieves theResolvermapped 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.
-
getResolverBuilder
protected ResolverBuilder getResolverBuilder()
-
getResultVariables
public java.util.Set<java.lang.String> getResultVariables()
Returns the variables that got defined in the select expression. This only applies to JPQL queries built for JPA 2.0.- Returns:
- The variables identifying the select expressions, if any was defined or an empty set if none were defined
-
getType
public IType getType(java.lang.Class<?> type)
Retrieves the external type for the given Java type.- Parameters:
type- The Java type to wrap with an external form- Returns:
- The external form of the given type
-
getType
public IType getType(Expression expression)
Returns theITypeof the givenExpression.- Parameters:
expression- TheExpressionfor which its type will be calculated- Returns:
- Either the
ITypethat was resolved by thisResolveror theITypeforIType.UNRESOLVABLE_TYPEif it could not be resolved
-
getType
public IType getType(java.lang.String typeName)
Retrieves the external class with the given fully qualified class name.- Parameters:
typeName- The fully qualified class name of the class to retrieve- Returns:
- The external form of the class to retrieve
-
getTypeDeclaration
public ITypeDeclaration getTypeDeclaration(Expression expression)
Returns theITypeDeclarationof the field handled by thisResolver.- Parameters:
expression- TheExpressionfor which its type declaration will be calculated- Returns:
- Either the
ITypeDeclarationthat was resolved by thisResolveror theITypeDeclarationforIType.UNRESOLVABLE_TYPEif it could not be resolved
-
getTypeHelper
public TypeHelper getTypeHelper()
Returns a helper that gives access to the most commontypes.- Returns:
- A helper containing a collection of methods related to
IType
-
getTypeRepository
public ITypeRepository getTypeRepository()
Returns the type repository for the application.- Returns:
- The repository of
ITypes
-
hasJoins
public boolean hasJoins()
Determines whether the JPQL expression has JOIN expressions.- Returns:
trueif the query or subquery being traversed contains JOIN expressions;falseotherwise
-
initialize
protected void initialize(JPQLGrammar jpqlGrammar)
Initializes thisJPQLQueryContext.- Parameters:
jpqlGrammar- The grammar that defines how to parse a JPQL query
-
initializeRoot
protected void initializeRoot()
Initializes the parsed tree representation of the JPQL query if it has not been set before setting theIQuery.
-
isCollectionIdentificationVariable
public boolean isCollectionIdentificationVariable(java.lang.String variableName)
Determines whether the given identification variable is defining a join or a collection member declaration expressions.- Parameters:
variableName- The identification variable to check for what it maps- Returns:
trueif the given identification variable maps a collection-valued field defined in aJOINorINexpression;falseif it's not defined or it's mapping an abstract schema name
-
isRangeIdentificationVariable
public boolean isRangeIdentificationVariable(java.lang.String variableName)
Determines whether the given variable name is an identification variable name used to define an abstract schema name.- Parameters:
variableName- The name of the variable to verify if it's defined in a range variable declaration in the current query or any parent query- Returns:
trueif the variable name is mapping an abstract schema name;falseif it's defined in a collection member declaration
-
isResultVariable
public boolean isResultVariable(java.lang.String variable)
Determines if the given variable is a result variable.- Parameters:
variable- The variable to check if it's a result variable- Returns:
trueif the given variable is defined as a result variable;falseotherwise
-
isSubquery
public boolean isSubquery()
Determines whether thisJPQLQueryContextcurrently holds the information of a subquery or for the top-level query.- Returns:
trueif the current context is for a subquery;falsefor the top-level query- Since:
- 2.5
-
isTolerant
public boolean isTolerant()
Determines if the parser is in tolerant mode or is in fast mode. When the tolerant is turned on, it means the parser will attempt to parse incomplete or invalid queries.- Returns:
trueif the parsing system should parse invalid or incomplete queries;falsewhen the query is well-formed and valid- Since:
- 2.5
-
literal
public java.lang.String literal(Expression expression, LiteralType type)
Retrieves the "literal" from the givenExpression. The literal to retrieve depends on the giventype. The literal is basically a string value like an identification variable name, an input parameter, a path expression, an abstract schema name, etc.- Parameters:
expression- TheExpressionto visittype- TheLiteralTypehelps to determine what to retrieve from the visitedExpression- Returns:
- A value from the given
Expressionor an empty string if the givenExpressionand theLiteralTypedo not match
-
newSubqueryContext
public void newSubqueryContext(Expression currentQuery)
Changes the state of this context to use the given subquery.- Parameters:
currentQuery- The parsed tree representation of the subquery that will become the current query- See Also:
disposeSubqueryContext()
-
setJPQLExpression
public void setJPQLExpression(JPQLExpression jpqlExpression)
Sets the parsed tree representation of the JPQL query. If the expression was parsed outside of the scope of this context, then this method has to be invoked beforesetQuery(IQuery)because the JPQL query is automatically parsed by that method.- Parameters:
jpqlExpression- The parsed representation of the JPQL query to manipulate- See Also:
setQuery(IQuery)
-
setQuery
public void setQuery(IQuery query)
Sets the external form of the JPQL query, which will be parsed and information will be extracted for later access.- Parameters:
query- The external form of the JPQL query- See Also:
setJPQLExpression(JPQLExpression)
-
setTolerant
public void setTolerant(boolean tolerant)
Sets whether the parser is in tolerant mode or is in fast mode. When the tolerant is turned on, it means the parser will attempt to parse incomplete or invalid queries.Note: This needs to be set before
setQuery(IQuery)orsetJPQLExpression(JPQLExpression)is invoked.- Parameters:
tolerant- Determines if the parsing system should be tolerant, meaning if it should try to parse invalid or incomplete queries- Since:
- 2.5
-
store
protected void store(JPQLQueryContext parent, Expression currentQuery)
Stores the information contained in the given parent into this one.- Parameters:
parent- The parent context, which is the context of the parent querycurrentQuery- The subquery becoming the current query
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
-