Class AbstractEclipseLinkSemanticValidator
- java.lang.Object
-
- org.eclipse.persistence.jpa.jpql.parser.AnonymousExpressionVisitor
-
- org.eclipse.persistence.jpa.jpql.AbstractValidator
-
- org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator
-
- org.eclipse.persistence.jpa.jpql.AbstractEclipseLinkSemanticValidator
-
- All Implemented Interfaces:
EclipseLinkExpressionVisitor,ExpressionVisitor
public class AbstractEclipseLinkSemanticValidator extends AbstractSemanticValidator implements EclipseLinkExpressionVisitor
This validator is responsible to gather the problems found in a JPQL query by validating the content to make sure it is semantically valid for EclipseLink. The grammar is not validated by this visitor.For instance, the function AVG accepts a state field path. The property it represents has to be of numeric type. AVG(e.name) is parsable but is not semantically valid because the type of name is a string (the property signature is: "
private String name").Note: EclipseLink does not validate types, but leaves it to the database. This is because some databases such as Oracle allow different types to different functions and perform implicit type conversion. i.e.
CONCAT('test', 2)returns'test2'. Also the FUNC function has an unknown type, so should be allowed with any function.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.
- Since:
- 2.4
- Version:
- 2.5.1
- Author:
- Pascal Filion
- See Also:
EclipseLinkGrammarValidator
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classAbstractEclipseLinkSemanticValidator.EclipseLinkOwningClauseVisitorThis visitor retrieves the clause owning the visitedExpression.protected static classAbstractEclipseLinkSemanticValidator.SubquerySelectItemCalculatorprotected static classAbstractEclipseLinkSemanticValidator.TableExpressionVisitorprotected static classAbstractEclipseLinkSemanticValidator.TopLevelFirstDeclarationVisitor-
Nested classes/interfaces inherited from class org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator
AbstractSemanticValidator.CollectionValuedPathExpressionVisitor, AbstractSemanticValidator.ComparingEntityTypeLiteralVisitor, AbstractSemanticValidator.ComparisonExpressionVisitor, AbstractSemanticValidator.FirstDeclarationVisitor, AbstractSemanticValidator.InItemsVisitor, AbstractSemanticValidator.PathType, AbstractSemanticValidator.StateFieldPathExpressionVisitor, AbstractSemanticValidator.SubqueryFirstDeclarationVisitor
-
Nested classes/interfaces inherited from class org.eclipse.persistence.jpa.jpql.AbstractValidator
AbstractValidator.BypassChildCollectionExpressionVisitor, AbstractValidator.BypassParentSubExpressionVisitor, AbstractValidator.ChildrenCollectorVisitor, AbstractValidator.JPQLQueryBNFValidator, AbstractValidator.NestedArrayVisitor, AbstractValidator.OwningClauseVisitor, AbstractValidator.OwningStatementVisitor, AbstractValidator.SubqueryVisitor
-
-
Field Summary
-
Fields inherited from class org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator
collectionValuedPathExpressionVisitor, helper, registerIdentificationVariable, stateFieldPathExpressionVisitor, usedIdentificationVariables, virtualIdentificationVariableFinder
-
-
Constructor Summary
Constructors Modifier Constructor Description protectedAbstractEclipseLinkSemanticValidator(SemanticValidatorHelper helper, EclipseLinkSemanticValidatorExtension extension)Creates a newAbstractEclipseLinkSemanticValidator.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected LiteralVisitorbuildLiteralVisitor()Creates the visitor that can retrieve some information about various literal.protected AbstractValidator.OwningClauseVisitorbuildOwningClauseVisitor()Creates the visitor that traverses the parent hierarchy of anyExpressionand stops at the firstExpressionthat is a clause.protected AbstractEclipseLinkSemanticValidator.SubquerySelectItemCalculatorbuildSubquerySelectItemCalculator()protected AbstractEclipseLinkSemanticValidator.TableExpressionVisitorbuildTableExpressionVisitor()protected AbstractEclipseLinkSemanticValidator.TopLevelFirstDeclarationVisitorbuildTopLevelFirstDeclarationVisitor()protected JPQLQueryDeclarationgetDeclaration(String variableName)protected EclipseLinkSemanticValidatorExtensiongetExtension()Returns the extension that gives access to non-JPA metadata artifacts, such as database tables and columns.protected AbstractEclipseLinkSemanticValidator.SubquerySelectItemCalculatorgetSubquerySelectItemCalculator()protected AbstractEclipseLinkSemanticValidator.TableExpressionVisitorgetTableExpressionVisitor()protected booleanisTableExpression(Expression expression)protected AbstractSemanticValidator.PathTypeselectClausePathExpressionPathType()Returns the type of path expression that is allowed in theSELECTclause.protected intsubquerySelectItemCount(Expression subquery)Retrieves the number of select items the given subquery has.protected voidvalidateFunctionExpression(FunctionExpression expression)Validates the givenFunctionExpression.protected voidvalidateInExpression(InExpression expression)Validates the givenInExpression.protected voidvalidateRangeVariableDeclarationRootObject(RangeVariableDeclaration expression)Validates the "root" object of the givenRangeVariableDeclaration.protected BooleanvalidateThirdPartyStateFieldPathExpression(StateFieldPathExpression expression)Validates the givenStateFieldPathExpression, which means the path does not represent a mapping, or an enum constant.protected AbstractSemanticValidator.PathTypevalidPathExpressionTypeForCountFunction()Returns the type of path expression that is valid for a count function; which is the left expression in aCOUNTexpression.protected AbstractSemanticValidator.PathTypevalidPathExpressionTypeForInExpression()Returns the type of path expression that is valid for the expression being tested by anINexpression; which is the left expression.protected AbstractSemanticValidator.PathTypevalidPathExpressionTypeForInItem()Returns the type of path expression that is valid for anINitems; which is the left expression in aINexpression.protected AbstractSemanticValidator.PathTypevalidPathExpressionTypeForStringExpression()Returns the type of path expression that is valid for a string expression; which is the left expression in aLIKEexpression.voidvisit(AsOfClause expression)Visits theAsOfClauseexpression.voidvisit(CastExpression expression)Visits theCastExpressionexpression.voidvisit(ConnectByClause expression)Visits theConnectByClauseexpression.voidvisit(DatabaseType expression)Visits theDatabaseTypeexpression.voidvisit(ExtractExpression expression)Visits theExtractExpressionexpression.voidvisit(HierarchicalQueryClause expression)Visits theHierarchicalQueryClauseexpression.voidvisit(OrderSiblingsByClause expression)Visits theOrderSiblingsByClauseexpression.voidvisit(RegexpExpression expression)Visits theRegexpExpressionexpression.voidvisit(StartWithClause expression)Visits theStartWithClauseexpression.voidvisit(TableExpression expression)Visits theTableExpressionexpression.voidvisit(TableVariableDeclaration expression)Visits theTableVariableDeclarationexpression.voidvisit(UnionClause expression)Visits theUnionClauseexpression.-
Methods inherited from class org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator
buildComparingEntityTypeLiteralVisitor, buildInItemsVisitor, buildSubqueryFirstDeclarationVisitor, dispose, findVirtualIdentificationVariable, getCollectionValuedPathExpression, getCollectionValuedPathExpressionVisitor, getComparingEntityTypeLiteralVisitor, getComparisonExpressionVisitor, getGrammar, getInItemsVisitor, getStateFieldPathExpression, getStateFieldPathExpressionVisitor, getVirtualIdentificationVariableFinder, initialize, isComparingEntityTypeLiteral, isIdentificationVariableDeclaredAfter, isIdentificationVariableValidInComparison, isOrderComparison, isValid, subqueryFirstDeclarationVisitor, topLevelFirstDeclarationVisitor, updateStatus, validateAbsExpression, validateAbstractFromClause, validateAbstractSchemaName, validateAdditionExpression, validateAllOrAnyExpression, validateAndExpression, validateArithmeticExpression, validateArithmeticExpression, validateAvgFunction, validateBetweenExpression, validateCaseExpression, validateCoalesceExpression, validateCollectionMemberDeclaration, validateCollectionMemberExpression, validateCollectionValuedPathExpression, validateComparisonExpression, validateConcatExpression, validateConstructorExpression, validateCountFunction, validateDateTime, validateDeleteClause, validateDeleteStatement, validateDivisionExpression, validateEntityTypeLiteral, validateEntryExpression, validateExistsExpression, validateFirstDeclaration, validateFromClause, validateFunctionPathExpression, validateFunctionPathExpression, validateGroupByClause, validateHavingClause, validateIdentificationVariable, validateIdentificationVariable, validateIdentificationVariableDeclaration, validateIdentificationVariables, validateIndexExpression, validateJoin, validateJoinCollectionValuedPathExpression, validateJoinsIdentificationVariable, validateKeyExpression, validateLengthExpression, validateLikeExpression, validateLocateExpression, validateLowerExpression, validateMaxFunction, validateMinFunction, validateModExpression, validateMultiplicationExpression, validateNotExpression, validateNullComparisonExpression, validateNullIfExpression, validateObjectExpression, validateOnClause, validateOrderByClause, validateOrderByItem, validateOrExpression, validateRangeVariableDeclaration, validateResultVariable, validateSelectClause, validateSelectStatement, validateSimpleFromClause, validateSimpleSelectClause, validateSimpleSelectStatement, validateSizeExpression, validateSqrtExpression, validateStateFieldPathExpression, validateSubstringExpression, validateSubtractionExpression, validateSumFunction, validateTreatExpression, validateTrimExpression, validateTypeExpression, validateUpdateClause, validateUpdateItem, validateUpdateStatement, validateUpperExpression, validateValueExpression, validateWhenClause, validateWhereClause, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit
-
Methods inherited from class org.eclipse.persistence.jpa.jpql.AbstractValidator
addProblem, addProblem, addProblem, addProblem, buildChildrenCollector, buildNestedArrayVisitor, buildOwningStatementVisitor, buildProblem, buildSubqueryVisitor, getBypassChildCollectionExpressionVisitor, getBypassParentSubExpressionVisitor, getChildren, getChildrenCollectorVisitor, getExpressionRegistry, getExpressionValidator, getJPAVersion, getJPQLQueryBNFValidator, getJPQLQueryBNFValidator, getLiteralVisitor, getNestedArrayVisitor, getOwningClauseVisitor, getOwningStatementVisitor, getProvider, getProviderVersion, getQueryBNF, getSubqueryVisitor, isNestedArray, isSubquery, isValid, isValid, isValid, isValidWithChildCollectionBypass, isWithinSubquery, isWithinTopLevelQuery, length, literal, nestedArraySize, position, problemsSize, setProblems, visit
-
Methods inherited from class org.eclipse.persistence.jpa.jpql.parser.AnonymousExpressionVisitor
visit, visit, visit, visit, visit, visit, visit, visit, visit
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.eclipse.persistence.jpa.jpql.parser.ExpressionVisitor
visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit
-
-
-
-
Constructor Detail
-
AbstractEclipseLinkSemanticValidator
protected AbstractEclipseLinkSemanticValidator(SemanticValidatorHelper helper, EclipseLinkSemanticValidatorExtension extension)
Creates a newAbstractEclipseLinkSemanticValidator.- Parameters:
helper- The given helper allows this validator to access the JPA artifacts without using Hermes SPIextension- The following extension can be used to give access to non-JPA metadata artifacts, such as database tables and columns- Throws:
NullPointerException- The givenSemanticValidatorHelpercannot benull
-
-
Method Detail
-
buildLiteralVisitor
protected LiteralVisitor buildLiteralVisitor()
Description copied from class:AbstractValidatorCreates the visitor that can retrieve some information about various literal.- Specified by:
buildLiteralVisitorin classAbstractValidator- Returns:
- A new
LiteralVisitor
-
buildOwningClauseVisitor
protected AbstractValidator.OwningClauseVisitor buildOwningClauseVisitor()
Description copied from class:AbstractValidatorCreates the visitor that traverses the parent hierarchy of anyExpressionand stops at the firstExpressionthat is a clause.- Specified by:
buildOwningClauseVisitorin classAbstractValidator- Returns:
- A new
AbstractValidator.OwningClauseVisitor
-
buildSubquerySelectItemCalculator
protected AbstractEclipseLinkSemanticValidator.SubquerySelectItemCalculator buildSubquerySelectItemCalculator()
-
buildTableExpressionVisitor
protected AbstractEclipseLinkSemanticValidator.TableExpressionVisitor buildTableExpressionVisitor()
-
buildTopLevelFirstDeclarationVisitor
protected AbstractEclipseLinkSemanticValidator.TopLevelFirstDeclarationVisitor buildTopLevelFirstDeclarationVisitor()
- Overrides:
buildTopLevelFirstDeclarationVisitorin classAbstractSemanticValidator
-
getDeclaration
protected JPQLQueryDeclaration getDeclaration(String variableName)
-
getExtension
protected EclipseLinkSemanticValidatorExtension getExtension()
Returns the extension that gives access to non-JPA metadata artifacts, such as database tables and columns.- Returns:
- An extension giving access to non-JPA metadata artifacts or
EclipseLinkSemanticValidatorExtension.NULL_EXTENSIONif no extension was provided
-
getSubquerySelectItemCalculator
protected AbstractEclipseLinkSemanticValidator.SubquerySelectItemCalculator getSubquerySelectItemCalculator()
-
getTableExpressionVisitor
protected AbstractEclipseLinkSemanticValidator.TableExpressionVisitor getTableExpressionVisitor()
-
isTableExpression
protected boolean isTableExpression(Expression expression)
-
selectClausePathExpressionPathType
protected AbstractSemanticValidator.PathType selectClausePathExpressionPathType()
Description copied from class:AbstractSemanticValidatorReturns the type of path expression that is allowed in theSELECTclause.- Specified by:
selectClausePathExpressionPathTypein classAbstractSemanticValidator- Returns:
- The type of path expressions allowed. The spec defines it as basic or object mapping only, i.e. collection-valued path expression is not allowed
-
subquerySelectItemCount
protected int subquerySelectItemCount(Expression subquery)
Retrieves the number of select items the given subquery has.- Parameters:
subquery- TheExpressionto visit, which should represents a subquery- Returns:
- The number of select items or 0 if the subquery is malformed or incomplete
-
validateFunctionExpression
protected void validateFunctionExpression(FunctionExpression expression)
Description copied from class:AbstractSemanticValidatorValidates the givenFunctionExpression.- Overrides:
validateFunctionExpressionin classAbstractSemanticValidator- Parameters:
expression- TheFunctionExpressionto validate
-
validateInExpression
protected void validateInExpression(InExpression expression)
Description copied from class:AbstractSemanticValidatorValidates the givenInExpression. The test to perform is:- If the expression is a path expression, validation makes sure it is an association mapping, a basic field is not allowed.
- Overrides:
validateInExpressionin classAbstractSemanticValidator- Parameters:
expression- TheInExpressionto validate
-
validateRangeVariableDeclarationRootObject
protected void validateRangeVariableDeclarationRootObject(RangeVariableDeclaration expression)
Description copied from class:AbstractSemanticValidatorValidates the "root" object of the givenRangeVariableDeclaration.- Overrides:
validateRangeVariableDeclarationRootObjectin classAbstractSemanticValidator- Parameters:
expression- TheRangeVariableDeclarationthat needs its "root" object to be validated
-
validPathExpressionTypeForCountFunction
protected AbstractSemanticValidator.PathType validPathExpressionTypeForCountFunction()
Description copied from class:AbstractSemanticValidatorReturns the type of path expression that is valid for a count function; which is the left expression in aCOUNTexpression.- Overrides:
validPathExpressionTypeForCountFunctionin classAbstractSemanticValidator- Returns:
- By default, any field are allowed except collection
-
validPathExpressionTypeForInExpression
protected AbstractSemanticValidator.PathType validPathExpressionTypeForInExpression()
Description copied from class:AbstractSemanticValidatorReturns the type of path expression that is valid for the expression being tested by anINexpression; which is the left expression.- Overrides:
validPathExpressionTypeForInExpressionin classAbstractSemanticValidator- Returns:
- By default, any field (without collection) is allowed
-
validPathExpressionTypeForInItem
protected AbstractSemanticValidator.PathType validPathExpressionTypeForInItem()
Description copied from class:AbstractSemanticValidatorReturns the type of path expression that is valid for anINitems; which is the left expression in aINexpression.- Overrides:
validPathExpressionTypeForInItemin classAbstractSemanticValidator- Returns:
- By default, any field are allowed except collection
-
validateThirdPartyStateFieldPathExpression
protected Boolean validateThirdPartyStateFieldPathExpression(StateFieldPathExpression expression)
Description copied from class:AbstractSemanticValidatorValidates the givenStateFieldPathExpression, which means the path does not represent a mapping, or an enum constant.- Overrides:
validateThirdPartyStateFieldPathExpressionin classAbstractSemanticValidator- Parameters:
expression- TheStateFieldPathExpressionthe validate- Returns:
Boolean.TRUEorBoolean.FALSEif the givenStateFieldPathExpressionwas validated by this method;nullif it could not be validated (as being valid or invalid)
-
validPathExpressionTypeForStringExpression
protected AbstractSemanticValidator.PathType validPathExpressionTypeForStringExpression()
Description copied from class:AbstractSemanticValidatorReturns the type of path expression that is valid for a string expression; which is the left expression in aLIKEexpression.- Overrides:
validPathExpressionTypeForStringExpressionin classAbstractSemanticValidator- Returns:
- By default, only basic field are allowed
-
visit
public void visit(AsOfClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theAsOfClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(CastExpression expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theCastExpressionexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(ConnectByClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theConnectByClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheConnectByClauseto visit
-
visit
public void visit(DatabaseType expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theDatabaseTypeexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheDatabaseTypeto visit
-
visit
public void visit(ExtractExpression expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theExtractExpressionexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(HierarchicalQueryClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theHierarchicalQueryClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheHierarchicalQueryClauseto visit
-
visit
public void visit(OrderSiblingsByClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theOrderSiblingsByClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(RegexpExpression expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theRegexpExpressionexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(StartWithClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theStartWithClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheStartWithClauseto visit
-
visit
public void visit(TableExpression expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theTableExpressionexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(TableVariableDeclaration expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theTableVariableDeclarationexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
visit
public void visit(UnionClause expression)
Description copied from interface:EclipseLinkExpressionVisitorVisits theUnionClauseexpression.- Specified by:
visitin interfaceEclipseLinkExpressionVisitor- Parameters:
expression- TheExpressionto visit
-
-