diff --git a/pom.xml b/pom.xml
index 91916af9b9..e03ef258bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
pom
Spring Data JPA Parent
diff --git a/spring-data-envers/pom.xml b/spring-data-envers/pom.xml
index 0c3d16ef85..33afb1dd95 100755
--- a/spring-data-envers/pom.xml
+++ b/spring-data-envers/pom.xml
@@ -5,12 +5,12 @@
org.springframework.data
spring-data-envers
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
org.springframework.data
spring-data-jpa-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa-distribution/pom.xml b/spring-data-jpa-distribution/pom.xml
index 991cd8cbf0..2e22138c8b 100644
--- a/spring-data-jpa-distribution/pom.xml
+++ b/spring-data-jpa-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml
index 7145881fb0..7df9600b1d 100644
--- a/spring-data-jpa/pom.xml
+++ b/spring-data-jpa/pom.xml
@@ -6,7 +6,7 @@
org.springframework.data
spring-data-jpa
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
Spring Data JPA
Spring Data module for JPA repositories.
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.2.0-SNAPSHOT
+ 3.2.0-official-hql-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4
deleted file mode 100644
index 1ca0c466b4..0000000000
--- a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4
+++ /dev/null
@@ -1,1061 +0,0 @@
-/*
- * Copyright 2011-2023 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-grammar Hql;
-
-@header {
-/**
- * HQL per https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#query-language
- *
- * This is a mixture of Hibernate's BNF and missing bits of grammar. There are gaps and inconsistencies in the
- * BNF itself, explained by other fragments of their spec. Additionally, alternate labels are used to provide easier
- * management of complex rules in the generated Visitor. Finally, there are labels applied to rule elements (op=('+'|'-')
- * to simplify the processing.
- *
- * @author Greg Turnquist
- * @since 3.1
- */
-}
-
-/*
- Parser rules
- */
-
-start
- : ql_statement EOF
- ;
-
-ql_statement
- : selectStatement
- | updateStatement
- | deleteStatement
- | insertStatement
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-select
-selectStatement
- : queryExpression
- ;
-
-queryExpression
- : withClause? orderedQuery (setOperator orderedQuery)*
- ;
-
-withClause
- : WITH cte (',' cte)*
- ;
-
-cte
- : identifier AS (NOT? MATERIALIZED)? '(' queryExpression ')' searchClause? cycleClause?
- ;
-
-searchClause
- : SEARCH (BREADTH | DEPTH) FIRST BY searchSpecifications SET identifier
- ;
-
-searchSpecifications
- : searchSpecification (',' searchSpecification)*
- ;
-
-searchSpecification
- : identifier sortDirection? nullsPrecedence?
- ;
-
-cycleClause
- : CYCLE cteAttributes SET identifier (TO literal DEFAULT literal)? (USING identifier)?
- ;
-
-cteAttributes
- : identifier (',' identifier)*
- ;
-
-orderedQuery
- : (query | '(' queryExpression ')') queryOrder?
- ;
-
-query
- : selectClause fromClause? whereClause? (groupByClause havingClause?)? # SelectQuery
- | fromClause whereClause? (groupByClause havingClause?)? selectClause? # FromQuery
- ;
-
-queryOrder
- : orderByClause limitClause? offsetClause? fetchClause?
- ;
-
-fromClause
- : FROM entityWithJoins (',' entityWithJoins)*
- ;
-
-entityWithJoins
- : fromRoot (joinSpecifier)*
- ;
-
-joinSpecifier
- : join
- | crossJoin
- | jpaCollectionJoin
- ;
-
-fromRoot
- : entityName variable?
- | LATERAL? '(' subquery ')' variable?
- ;
-
-join
- : joinType JOIN FETCH? joinTarget joinRestriction? // Spec BNF says joinType isn't optional, but text says that it is.
- ;
-
-joinTarget
- : path variable? # JoinPath
- | LATERAL? '(' subquery ')' variable? # JoinSubquery
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-update
-updateStatement
- : UPDATE VERSIONED? targetEntity setClause whereClause?
- ;
-
-targetEntity
- : entityName variable?
- ;
-
-setClause
- : SET assignment (',' assignment)*
- ;
-
-assignment
- : simplePath '=' expressionOrPredicate
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-delete
-deleteStatement
- : DELETE FROM? targetEntity whereClause?
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-insert
-insertStatement
- : INSERT INTO? targetEntity targetFields (queryExpression | valuesList)
- ;
-
-// Already defined underneath updateStatement
-//targetEntity
-// : entityName variable?
-// ;
-
-targetFields
- : '(' simplePath (',' simplePath)* ')'
- ;
-
-valuesList
- : VALUES values (',' values)*
- ;
-
-values
- : '(' expression (',' expression)* ')'
- ;
-
-instantiation
- : NEW instantiationTarget '(' instantiationArguments ')'
- ;
-
-alias
- : AS? identifier // spec says IDENTIFIER but clearly does NOT mean a reserved word
- ;
-
-groupedItem
- : identifier
- | INTEGER_LITERAL
- | expression
- ;
-
-sortedItem
- : sortExpression sortDirection? nullsPrecedence?
- ;
-
-sortExpression
- : identifier
- | INTEGER_LITERAL
- | expression
- ;
-
-sortDirection
- : ASC
- | DESC
- ;
-
-nullsPrecedence
- : NULLS (FIRST | LAST)
- ;
-
-limitClause
- : LIMIT parameterOrIntegerLiteral
- ;
-
-offsetClause
- : OFFSET parameterOrIntegerLiteral (ROW | ROWS)?
- ;
-
-fetchClause
- : FETCH (FIRST | NEXT) (parameterOrIntegerLiteral | parameterOrNumberLiteral '%') (ROW | ROWS) (ONLY | WITH TIES)
- ;
-
-/*******************
- Gaps in the spec.
- *******************/
-
-subquery
- : queryExpression
- ;
-
-selectClause
- : SELECT DISTINCT? selectionList
- ;
-
-selectionList
- : selection (',' selection)*
- ;
-
-selection
- : selectExpression variable?
- ;
-
-selectExpression
- : instantiation
- | mapEntrySelection
- | jpaSelectObjectSyntax
- | expressionOrPredicate
- ;
-
-mapEntrySelection
- : ENTRY '(' path ')'
- ;
-
-/**
- * Deprecated syntax dating back to EJB-QL prior to EJB 3, required by JPA, never documented in Hibernate
- */
-jpaSelectObjectSyntax
- : OBJECT '(' identifier ')'
- ;
-
-whereClause
- : WHERE predicate (',' predicate)*
- ;
-
-joinType
- : INNER?
- | (LEFT | RIGHT | FULL)? OUTER?
- | CROSS
- ;
-
-crossJoin
- : CROSS JOIN entityName variable?
- ;
-
-joinRestriction
- : (ON | WITH) predicate
- ;
-
-// Deprecated syntax dating back to EJB-QL prior to EJB 3, required by JPA, never documented in Hibernate
-jpaCollectionJoin
- : ',' IN '(' path ')' variable?
- ;
-
-groupByClause
- : GROUP BY groupedItem (',' groupedItem)*
- ;
-
-orderByClause
- : ORDER BY sortedItem (',' sortedItem)*
- ;
-
-havingClause
- : HAVING predicate (',' predicate)*
- ;
-
-setOperator
- : UNION ALL?
- | INTERSECT ALL?
- | EXCEPT ALL?
- ;
-
-// Literals
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-literals
-literal
- : NULL
- | booleanLiteral
- | stringLiteral
- | numericLiteral
- | dateTimeLiteral
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-boolean-literals
-booleanLiteral
- : TRUE
- | FALSE
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-string-literals
-stringLiteral
- : STRINGLITERAL
- | JAVASTRINGLITERAL
- | CHARACTER
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-numeric-literals
-numericLiteral
- : INTEGER_LITERAL
- | FLOAT_LITERAL
- | HEXLITERAL
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-datetime-literals
-dateTimeLiteral
- : LOCAL_DATE
- | LOCAL_TIME
- | LOCAL_DATETIME
- | CURRENT_DATE
- | CURRENT_TIME
- | CURRENT_TIMESTAMP
- | OFFSET_DATETIME
- | (LOCAL | CURRENT) DATE
- | (LOCAL | CURRENT) TIME
- | (LOCAL | CURRENT | OFFSET) DATETIME
- | INSTANT
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-duration-literals
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-binary-literals
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-enum-literals
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-java-constants
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-entity-name-literals
-// TBD
-
-// Expressions
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-expressions
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-concatenation
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-numeric-arithmetic
-expression
- : '(' expression ')' # GroupedExpression
- | '(' expressionOrPredicate (',' expressionOrPredicate)+ ')' # TupleExpression
- | '(' subquery ')' # SubqueryExpression
- | primaryExpression # PlainPrimaryExpression
- | op=('+' | '-') numericLiteral # SignedNumericLiteral
- | op=('+' | '-') expression # SignedExpression
- | expression op=('*' | '/') expression # MultiplicationExpression
- | expression op=('+' | '-') expression # AdditionExpression
- | expression '||' expression # HqlConcatenationExpression
- ;
-
-primaryExpression
- : caseList # CaseExpression
- | literal # LiteralExpression
- | parameter # ParameterExpression
- | function # FunctionExpression
- | generalPathFragment # GeneralPathExpression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-Datetime-arithmetic
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-path-expressions
-identificationVariable
- : identifier
- | simplePath
- ;
-
-path
- : treatedPath pathContinutation?
- | generalPathFragment
- ;
-
-generalPathFragment
- : simplePath indexedPathAccessFragment?
- ;
-
-indexedPathAccessFragment
- : '[' expression ']' ('.' generalPathFragment)?
- ;
-
-simplePath
- : identifier simplePathElement*
- ;
-
-simplePathElement
- : '.' identifier
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-case-expressions
-caseList
- : simpleCaseExpression
- | searchedCaseExpression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-simple-case-expressions
-simpleCaseExpression
- : CASE expressionOrPredicate caseWhenExpressionClause+ (ELSE expressionOrPredicate)? END
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-searched-case-expressions
-searchedCaseExpression
- : CASE caseWhenPredicateClause+ (ELSE expressionOrPredicate)? END
- ;
-
-caseWhenExpressionClause
- : WHEN expression THEN expressionOrPredicate
- ;
-
-caseWhenPredicateClause
- : WHEN predicate THEN expressionOrPredicate
- ;
-
-// Functions
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-exp-functions
-function
- : functionName '(' (functionArguments | ASTERISK)? ')' pathContinutation? filterClause? withinGroup? overClause? # GenericFunction
- | functionName '(' subquery ')' # FunctionWithSubquery
- | castFunction # CastFunctionInvocation
- | extractFunction # ExtractFunctionInvocation
- | trimFunction # TrimFunctionInvocation
- | everyFunction # EveryFunctionInvocation
- | anyFunction # AnyFunctionInvocation
- | treatedPath # TreatedPathInvocation
- ;
-
-functionArguments
- : DISTINCT? expressionOrPredicate (',' expressionOrPredicate)*
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-aggregate-functions-filter
-filterClause
- : FILTER '(' whereClause ')'
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-aggregate-functions-orderedset
-withinGroup
- : WITHIN GROUP '(' orderByClause ')'
- ;
-
-overClause
- : OVER '(' partitionClause? orderByClause? frameClause? ')'
- ;
-
-partitionClause
- : PARTITION BY expression (',' expression)*
- ;
-
-frameClause
- : (RANGE|ROWS|GROUPS) frameStart frameExclusion?
- | (RANGE|ROWS|GROUPS) BETWEEN frameStart AND frameEnd frameExclusion?
- ;
-
-frameStart
- : UNBOUNDED PRECEDING # UnboundedPrecedingFrameStart
- | expression PRECEDING # ExpressionPrecedingFrameStart
- | CURRENT ROW # CurrentRowFrameStart
- | expression FOLLOWING # ExpressionFollowingFrameStart
- ;
-
-frameExclusion
- : EXCLUDE CURRENT ROW # CurrentRowFrameExclusion
- | EXCLUDE GROUP # GroupFrameExclusion
- | EXCLUDE TIES # TiesFrameExclusion
- | EXCLUDE NO OTHERS # NoOthersFrameExclusion
- ;
-
-frameEnd
- : expression PRECEDING # ExpressionPrecedingFrameEnd
- | CURRENT ROW # CurrentRowFrameEnd
- | expression FOLLOWING # ExpressionFollowingFrameEnd
- | UNBOUNDED FOLLOWING # UnboundedFollowingFrameEnd
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-functions
-castFunction
- : CAST '(' expression AS identifier ')'
- ;
-
-extractFunction
- : EXTRACT '(' expression FROM expression ')'
- | dateTimeFunction '(' expression ')'
- ;
-
-trimFunction
- : TRIM '(' (LEADING | TRAILING | BOTH)? stringLiteral? FROM? expression ')'
- ;
-
-dateTimeFunction
- : d=(YEAR
- | MONTH
- | DAY
- | WEEK
- | QUARTER
- | HOUR
- | MINUTE
- | SECOND
- | NANOSECOND
- | EPOCH)
- ;
-
-everyFunction
- : every=(EVERY | ALL) '(' predicate ')'
- | every=(EVERY | ALL) '(' subquery ')'
- | every=(EVERY | ALL) (ELEMENTS | INDICES) '(' simplePath ')'
- ;
-
-anyFunction
- : any=(ANY | SOME) '(' predicate ')'
- | any=(ANY | SOME) '(' subquery ')'
- | any=(ANY | SOME) (ELEMENTS | INDICES) '(' simplePath ')'
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-treat-type
-treatedPath
- : TREAT '(' path AS simplePath')' pathContinutation?
- ;
-
-pathContinutation
- : '.' simplePath
- ;
-
-// Predicates
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-conditional-expressions
-predicate
- : '(' predicate ')' # GroupedPredicate
- | dealingWithNullExpression # NullExpressionPredicate
- | inExpression # InPredicate
- | betweenExpression # BetweenPredicate
- | relationalExpression # RelationalPredicate
- | stringPatternMatching # LikePredicate
- | existsExpression # ExistsPredicate
- | collectionExpression # CollectionPredicate
- | NOT predicate # NotPredicate
- | predicate AND predicate # AndPredicate
- | predicate OR predicate # OrPredicate
- | expression # ExpressionPredicate
- ;
-
-expressionOrPredicate
- : expression
- | predicate
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-relational-comparisons
-// NOTE: The TIP shows that "!=" is also supported. Hibernate's source code shows that "^=" is another NOT_EQUALS option as well.
-relationalExpression
- : expression op=('=' | '>' | '>=' | '<' | '<=' | '<>' | '!=' | '^=' ) expression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-between-predicate
-betweenExpression
- : expression NOT? BETWEEN expression AND expression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-null-predicate
-dealingWithNullExpression
- : expression IS NOT? NULL
- | expression IS NOT? DISTINCT FROM expression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate
-stringPatternMatching
- : expression NOT? (LIKE | ILIKE) expression (ESCAPE (character|parameter))?
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices
-// TBD
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-in-predicate
-inExpression
- : expression NOT? IN inList
- ;
-
-inList
- : (ELEMENTS | INDICES) '(' simplePath ')'
- | '(' subquery ')'
- | parameter
- | '(' (expressionOrPredicate (',' expressionOrPredicate)*)? ')'
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-exists-predicate
-// TBD
-existsExpression
- : EXISTS (ELEMENTS | INDICES) '(' simplePath ')'
- | EXISTS expression
- ;
-
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-collection-operators
-collectionExpression
- : expression IS NOT? EMPTY
- | expression NOT? MEMBER OF path
- ;
-
-// Projection
-// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-select-new
-instantiationTarget
- : LIST
- | MAP
- | simplePath
- ;
-
-instantiationArguments
- : instantiationArgument (',' instantiationArgument)*
- ;
-
-instantiationArgument
- : (expressionOrPredicate | instantiation) variable?
- ;
-
-// Low level parsing rules
-
-parameterOrIntegerLiteral
- : parameter
- | INTEGER_LITERAL
- ;
-
-parameterOrNumberLiteral
- : parameter
- | numericLiteral
- ;
-
-variable
- : AS identifier
- | reservedWord
- ;
-
-parameter
- : prefix=':' identifier
- | prefix='?' INTEGER_LITERAL?
- ;
-
-entityName
- : identifier ('.' identifier)*
- ;
-
-identifier
- : reservedWord
- ;
-
-character
- : CHARACTER
- ;
-
-functionName
- : reservedWord
- ;
-
-reservedWord
- : IDENTIFICATION_VARIABLE
- | f=(ALL
- | AND
- | ANY
- | AS
- | ASC
- | AVG
- | BETWEEN
- | BOTH
- | BREADTH
- | BY
- | CASE
- | CAST
- | COLLATE
- | COUNT
- | CROSS
- | CUBE
- | CURRENT
- | CURRENT_DATE
- | CURRENT_INSTANT
- | CURRENT_TIME
- | CURRENT_TIMESTAMP
- | CYCLE
- | DATE
- | DATETIME
- | DAY
- | DEFAULT
- | DELETE
- | DEPTH
- | DESC
- | DISTINCT
- | ELEMENT
- | ELEMENTS
- | ELSE
- | EMPTY
- | END
- | ENTRY
- | EPOCH
- | ERROR
- | ESCAPE
- | EVERY
- | EXCEPT
- | EXCLUDE
- | EXISTS
- | EXTRACT
- | FETCH
- | FILTER
- | FIRST
- | FLOOR
- | FOLLOWING
- | FOR
- | FORMAT
- | FROM
- | FULL
- | FUNCTION
- | GROUP
- | GROUPS
- | HAVING
- | HOUR
- | ID
- | IGNORE
- | ILIKE
- | IN
- | INDEX
- | INDICES
- | INNER
- | INSERT
- | INSTANT
- | INTERSECT
- | INTO
- | IS
- | JOIN
- | KEY
- | LAST
- | LEADING
- | LEFT
- | LIKE
- | LIMIT
- | LIST
- | LISTAGG
- | LOCAL
- | LOCAL_DATE
- | LOCAL_DATETIME
- | LOCAL_TIME
- | MAP
- | MATERIALIZED
- | MAX
- | MAXELEMENT
- | MAXINDEX
- | MEMBER
- | MICROSECOND
- | MILLISECOND
- | MIN
- | MINELEMENT
- | MININDEX
- | MINUTE
- | MONTH
- | NANOSECOND
- | NATURALID
- | NEW
- | NEXT
- | NO
- | NOT
- | NULLS
- | OBJECT
- | OF
- | OFFSET
- | OFFSET_DATETIME
- | ON
- | ONLY
- | OR
- | ORDER
- | OTHERS
- | OUTER
- | OVER
- | OVERFLOW
- | OVERLAY
- | PAD
- | PARTITION
- | PERCENT
- | PLACING
- | POSITION
- | PRECEDING
- | QUARTER
- | RANGE
- | RESPECT
- | RIGHT
- | ROLLUP
- | ROW
- | ROWS
- | SEARCH
- | SECOND
- | SELECT
- | SET
- | SIZE
- | SOME
- | SUBSTRING
- | SUM
- | THEN
- | TIES
- | TIME
- | TIMESTAMP
- | TIMEZONE_HOUR
- | TIMEZONE_MINUTE
- | TO
- | TRAILING
- | TREAT
- | TRIM
- | TRUNC
- | TRUNCATE
- | TYPE
- | UNBOUNDED
- | UNION
- | UPDATE
- | USING
- | VALUE
- | VALUES
- | VERSION
- | VERSIONED
- | WEEK
- | WHEN
- | WHERE
- | WITH
- | WITHIN
- | WITHOUT
- | YEAR)
- ;
-
-/*
- Lexer rules
- */
-
-
-WS : [ \t\r\n] -> skip ;
-
-// Build up case-insentive tokens
-
-fragment A: 'a' | 'A';
-fragment B: 'b' | 'B';
-fragment C: 'c' | 'C';
-fragment D: 'd' | 'D';
-fragment E: 'e' | 'E';
-fragment F: 'f' | 'F';
-fragment G: 'g' | 'G';
-fragment H: 'h' | 'H';
-fragment I: 'i' | 'I';
-fragment J: 'j' | 'J';
-fragment K: 'k' | 'K';
-fragment L: 'l' | 'L';
-fragment M: 'm' | 'M';
-fragment N: 'n' | 'N';
-fragment O: 'o' | 'O';
-fragment P: 'p' | 'P';
-fragment Q: 'q' | 'Q';
-fragment R: 'r' | 'R';
-fragment S: 's' | 'S';
-fragment T: 't' | 'T';
-fragment U: 'u' | 'U';
-fragment V: 'v' | 'V';
-fragment W: 'w' | 'W';
-fragment X: 'x' | 'X';
-fragment Y: 'y' | 'Y';
-fragment Z: 'z' | 'Z';
-
-// The following are reserved identifiers:
-
-ALL : A L L;
-AND : A N D;
-ANY : A N Y;
-AS : A S;
-ASC : A S C;
-ASTERISK : '*';
-AVG : A V G;
-BETWEEN : B E T W E E N;
-BOTH : B O T H;
-BREADTH : B R E A D T H;
-BY : B Y;
-CASE : C A S E;
-CAST : C A S T;
-CEILING : C E I L I N G;
-COLLATE : C O L L A T E;
-COUNT : C O U N T;
-CROSS : C R O S S;
-CUBE : C U B E;
-CURRENT : C U R R E N T;
-CURRENT_DATE : C U R R E N T '_' D A T E;
-CURRENT_INSTANT : C U R R E N T '_' I N S T A N T;
-CURRENT_TIME : C U R R E N T '_' T I M E;
-CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P;
-CYCLE : C Y C L E;
-DATE : D A T E;
-DATETIME : D A T E T I M E ;
-DAY : D A Y;
-DEFAULT : D E F A U L T;
-DELETE : D E L E T E;
-DEPTH : D E P T H;
-DESC : D E S C;
-DISTINCT : D I S T I N C T;
-ELEMENT : E L E M E N T;
-ELEMENTS : E L E M E N T S;
-ELSE : E L S E;
-EMPTY : E M P T Y;
-END : E N D;
-ENTRY : E N T R Y;
-EPOCH : E P O C H;
-ERROR : E R R O R;
-ESCAPE : E S C A P E;
-EVERY : E V E R Y;
-EXCEPT : E X C E P T;
-EXCLUDE : E X C L U D E;
-EXISTS : E X I S T S;
-EXP : E X P;
-EXTRACT : E X T R A C T;
-FALSE : F A L S E;
-FETCH : F E T C H;
-FILTER : F I L T E R;
-FIRST : F I R S T;
-FK : F K;
-FLOOR : F L O O R;
-FOLLOWING : F O L L O W I N G;
-FOR : F O R;
-FORMAT : F O R M A T;
-FROM : F R O M;
-FULL : F U L L;
-FUNCTION : F U N C T I O N;
-GROUP : G R O U P;
-GROUPS : G R O U P S;
-HAVING : H A V I N G;
-HOUR : H O U R;
-ID : I D;
-IGNORE : I G N O R E;
-ILIKE : I L I K E;
-IN : I N;
-INDEX : I N D E X;
-INDICES : I N D I C E S;
-INNER : I N N E R;
-INSERT : I N S E R T;
-INSTANT : I N S T A N T;
-INTERSECT : I N T E R S E C T;
-INTO : I N T O;
-IS : I S;
-JOIN : J O I N;
-KEY : K E Y;
-LAST : L A S T;
-LATERAL : L A T E R A L;
-LEADING : L E A D I N G;
-LEFT : L E F T;
-LIKE : L I K E;
-LIMIT : L I M I T;
-LIST : L I S T;
-LISTAGG : L I S T A G G;
-LN : L N;
-LOCAL : L O C A L;
-LOCAL_DATE : L O C A L '_' D A T E ;
-LOCAL_DATETIME : L O C A L '_' D A T E T I M E;
-LOCAL_TIME : L O C A L '_' T I M E;
-MAP : M A P;
-MATERIALIZED : M A T E R I A L I Z E D;
-MAX : M A X;
-MAXELEMENT : M A X E L E M E N T;
-MAXINDEX : M A X I N D E X;
-MEMBER : M E M B E R;
-MICROSECOND : M I C R O S E C O N D;
-MILLISECOND : M I L L I S E C O N D;
-MIN : M I N;
-MINELEMENT : M I N E L E M E N T;
-MININDEX : M I N I N D E X;
-MINUTE : M I N U T E;
-MONTH : M O N T H;
-NANOSECOND : N A N O S E C O N D;
-NATURALID : N A T U R A L I D;
-NEW : N E W;
-NEXT : N E X T;
-NO : N O;
-NOT : N O T;
-NULL : N U L L;
-NULLS : N U L L S;
-OBJECT : O B J E C T;
-OF : O F;
-OFFSET : O F F S E T;
-OFFSET_DATETIME : O F F S E T '_' D A T E T I M E;
-ON : O N;
-ONLY : O N L Y;
-OR : O R;
-ORDER : O R D E R;
-OTHERS : O T H E R S;
-OUTER : O U T E R;
-OVER : O V E R;
-OVERFLOW : O V E R F L O W;
-OVERLAY : O V E R L A Y;
-PAD : P A D;
-PARTITION : P A R T I T I O N;
-PERCENT : P E R C E N T;
-PLACING : P L A C I N G;
-POSITION : P O S I T I O N;
-POWER : P O W E R;
-PRECEDING : P R E C E D I N G;
-QUARTER : Q U A R T E R;
-RANGE : R A N G E;
-RESPECT : R E S P E C T;
-RIGHT : R I G H T;
-ROLLUP : R O L L U P;
-ROW : R O W;
-ROWS : R O W S;
-SEARCH : S E A R C H;
-SECOND : S E C O N D;
-SELECT : S E L E C T;
-SET : S E T;
-SIZE : S I Z E;
-SOME : S O M E;
-SUBSTRING : S U B S T R I N G;
-SUM : S U M;
-THEN : T H E N;
-TIES : T I E S;
-TIME : T I M E;
-TIMESTAMP : T I M E S T A M P;
-TIMEZONE_HOUR : T I M E Z O N E '_' H O U R;
-TIMEZONE_MINUTE : T I M E Z O N E '_' M I N U T E;
-TO : T O;
-TRAILING : T R A I L I N G;
-TREAT : T R E A T;
-TRIM : T R I M;
-TRUE : T R U E;
-TRUNC : T R U N C;
-TRUNCATE : T R U N C A T E;
-TYPE : T Y P E;
-UNBOUNDED : U N B O U N D E D;
-UNION : U N I O N;
-UPDATE : U P D A T E;
-USING : U S I N G;
-VALUE : V A L U E;
-VALUES : V A L U E S;
-VERSION : V E R S I O N;
-VERSIONED : V E R S I O N E D;
-WEEK : W E E K;
-WHEN : W H E N;
-WHERE : W H E R E;
-WITH : W I T H;
-WITHIN : W I T H I N;
-WITHOUT : W I T H O U T;
-YEAR : Y E A R;
-
-fragment INTEGER_NUMBER : ('0' .. '9')+ ;
-fragment FLOAT_NUMBER : INTEGER_NUMBER+ '.'? INTEGER_NUMBER* (E [+-]? INTEGER_NUMBER)? ;
-
-CHARACTER : '\'' (~ ('\'' | '\\' )) '\'' ;
-STRINGLITERAL : '\'' ('\'' '\'' | ~('\'' | '\\'))* '\'' ;
-JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
-INTEGER_LITERAL : INTEGER_NUMBER (L | B I)? ;
-FLOAT_LITERAL : FLOAT_NUMBER (D | F | B D)?;
-HEXLITERAL : '0' X ('0' .. '9' | A | B | C | D | E)+ ;
-
-IDENTIFICATION_VARIABLE : ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '$' | '_') ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '0' .. '9' | '$' | '_')* ;
-
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryParser.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryParser.java
index 8f9cdcaacf..eb567a13c9 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryParser.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryParser.java
@@ -20,12 +20,14 @@
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.hibernate.grammars.hql.HqlLexer;
+import org.hibernate.grammars.hql.HqlParser;
import org.springframework.data.domain.Sort;
import org.springframework.lang.Nullable;
/**
- * Implements the {@code HQL} parsing operations of a {@link JpaQueryParserSupport} using the ANTLR-generated
- * {@link HqlParser} and {@link HqlQueryTransformer}.
+ * Implements the {@code HQL} parsing operations of a {@link JpaQueryParserSupport} using Hibernate's ANTLR-generated
+ * {@link HqlParser} and a custom {@link HqlQueryTransformer}.
*
* @author Greg Turnquist
* @author Mark Paluch
@@ -50,7 +52,7 @@ public static ParserRuleContext parseQuery(String query) {
configureParser(query, lexer, parser);
- return parser.start();
+ return parser.statement();
}
/**
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java
index 17458b20e6..44f5bd80e9 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java
@@ -20,21 +20,19 @@
import java.util.ArrayList;
import java.util.List;
+import org.hibernate.grammars.hql.HqlParser;
+import org.hibernate.grammars.hql.HqlParserBaseVisitor;
+
/**
* An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that renders an HQL query without making any changes.
*
* @author Greg Turnquist
* @since 3.1
*/
-class HqlQueryRenderer extends HqlBaseVisitor> {
-
- @Override
- public List visitStart(HqlParser.StartContext ctx) {
- return visit(ctx.ql_statement());
- }
+class HqlQueryRenderer extends HqlParserBaseVisitor> {
@Override
- public List visitQl_statement(HqlParser.Ql_statementContext ctx) {
+ public List visitStatement(HqlParser.StatementContext ctx) {
if (ctx.selectStatement() != null) {
return visit(ctx.selectStatement());
@@ -55,25 +53,167 @@ public List visitSelectStatement(HqlParser.SelectStatement
}
@Override
- public List visitQueryExpression(HqlParser.QueryExpressionContext ctx) {
+ public List visitSubquery(HqlParser.SubqueryContext ctx) {
+ return visit(ctx.queryExpression());
+ }
+
+ @Override
+ public List visitTargetEntity(HqlParser.TargetEntityContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.withClause() != null) {
- tokens.addAll(visit(ctx.withClause()));
+ tokens.addAll(visit(ctx.entityName()));
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
}
- tokens.addAll(visit(ctx.orderedQuery(0)));
+ return tokens;
+ }
+
+ @Override
+ public List visitDeleteStatement(HqlParser.DeleteStatementContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.DELETE()));
+ if (ctx.FROM() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.FROM()));
+ }
+ tokens.addAll(visit(ctx.targetEntity()));
+ if (ctx.whereClause() != null) {
+ tokens.addAll(visit(ctx.whereClause()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitUpdateStatement(HqlParser.UpdateStatementContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.UPDATE()));
+ if (ctx.VERSIONED() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.VERSIONED()));
+ }
+ tokens.addAll(visit(ctx.targetEntity()));
+ tokens.addAll(visit(ctx.setClause()));
+ if (ctx.whereClause() != null) {
+ tokens.addAll(visit(ctx.whereClause()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitSetClause(HqlParser.SetClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.SET()));
+
+ ctx.assignment().forEach(assignmentContext -> {
+
+ tokens.addAll(visit(assignmentContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+ SPACE(tokens);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitAssignment(HqlParser.AssignmentContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.simplePath()));
+ tokens.add(TOKEN_EQUALS);
+ tokens.addAll(visit(ctx.expressionOrPredicate()));
+
+ return tokens;
+ }
- for (int i = 1; i < ctx.orderedQuery().size(); i++) {
+ @Override
+ public List visitInsertStatement(HqlParser.InsertStatementContext ctx) {
+
+ List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.setOperator(i - 1)));
- tokens.addAll(visit(ctx.orderedQuery(i)));
+ tokens.add(new JpaQueryParsingToken(ctx.INSERT()));
+ if (ctx.INTO() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INTO()));
+ }
+ tokens.addAll(visit(ctx.targetEntity()));
+ tokens.addAll(visit(ctx.targetFields()));
+ if (ctx.queryExpression() != null) {
+ tokens.addAll(visit(ctx.queryExpression()));
+ } else if (ctx.valuesList() != null) {
+ tokens.addAll(visit(ctx.valuesList()));
}
return tokens;
}
+ @Override
+ public List visitTargetFields(HqlParser.TargetFieldsContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+
+ ctx.simplePath().forEach(simplePathContext -> {
+
+ tokens.addAll(visit(simplePathContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitValuesList(HqlParser.ValuesListContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.VALUES()));
+
+ ctx.values().forEach(valuesContext -> {
+
+ tokens.addAll(visit(valuesContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitValues(HqlParser.ValuesContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+
+ ctx.expressionOrPredicate().forEach(expressionOrPredicateContext -> {
+
+ tokens.addAll(visit(expressionOrPredicateContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
@Override
public List visitWithClause(HqlParser.WithClauseContext ctx) {
@@ -106,7 +246,7 @@ public List visitCte(HqlParser.CteContext ctx) {
if (ctx.MATERIALIZED() != null) {
tokens.add(TOKEN_MATERIALIZED);
}
-
+
tokens.add(TOKEN_OPEN_PAREN);
tokens.addAll(visit(ctx.queryExpression()));
tokens.add(TOKEN_CLOSE_PAREN);
@@ -121,6 +261,21 @@ public List visitCte(HqlParser.CteContext ctx) {
return tokens;
}
+ @Override
+ public List visitCteAttributes(HqlParser.CteAttributesContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ ctx.identifier().forEach(identifierContext -> {
+
+ tokens.addAll(visit(identifierContext));
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ return tokens;
+ }
+
@Override
public List visitSearchClause(HqlParser.SearchClauseContext ctx) {
@@ -204,90 +359,84 @@ public List visitCycleClause(HqlParser.CycleClauseContext
}
@Override
- public List visitCteAttributes(HqlParser.CteAttributesContext ctx) {
+ public List visitSimpleQueryGroup(HqlParser.SimpleQueryGroupContext ctx) {
List tokens = new ArrayList<>();
- ctx.identifier().forEach(identifierContext -> {
+ if (ctx.withClause() != null) {
+ tokens.addAll(visit(ctx.withClause()));
+ }
- tokens.addAll(visit(identifierContext));
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
+ tokens.addAll(visit(ctx.orderedQuery()));
return tokens;
}
@Override
- public List visitOrderedQuery(HqlParser.OrderedQueryContext ctx) {
+ public List visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.query() != null) {
- tokens.addAll(visit(ctx.query()));
- } else if (ctx.queryExpression() != null) {
-
- tokens.add(TOKEN_OPEN_PAREN);
- tokens.addAll(visit(ctx.queryExpression()));
- tokens.add(TOKEN_CLOSE_PAREN);
+ if (ctx.withClause() != null) {
+ tokens.addAll(visit(ctx.withClause()));
}
- if (ctx.queryOrder() != null) {
- tokens.addAll(visit(ctx.queryOrder()));
+ tokens.addAll(visit(ctx.orderedQuery(0)));
+
+ for (int i = 0; i < ctx.setOperator().size(); i++) {
+
+ tokens.addAll(visit(ctx.setOperator(i)));
+ tokens.addAll(visit(ctx.orderedQuery(i + 1)));
}
return tokens;
}
@Override
- public List visitSelectQuery(HqlParser.SelectQueryContext ctx) {
+ public List visitQuerySpecExpression(HqlParser.QuerySpecExpressionContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.selectClause() != null) {
- tokens.addAll(visit(ctx.selectClause()));
- }
-
- if (ctx.fromClause() != null) {
- tokens.addAll(visit(ctx.fromClause()));
- }
-
- if (ctx.whereClause() != null) {
- tokens.addAll(visit(ctx.whereClause()));
- }
-
- if (ctx.groupByClause() != null) {
- tokens.addAll(visit(ctx.groupByClause()));
- }
+ tokens.addAll(visit(ctx.query()));
- if (ctx.havingClause() != null) {
- tokens.addAll(visit(ctx.havingClause()));
+ if (ctx.queryOrder() != null) {
+ tokens.addAll(visit(ctx.queryOrder()));
}
return tokens;
}
@Override
- public List visitFromQuery(HqlParser.FromQueryContext ctx) {
+ public List visitNestedQueryExpression(HqlParser.NestedQueryExpressionContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.fromClause()));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.queryExpression()));
+ tokens.add(TOKEN_CLOSE_PAREN);
- if (ctx.whereClause() != null) {
- tokens.addAll(visit(ctx.whereClause()));
+ if (ctx.queryOrder() != null) {
+ tokens.addAll(visit(ctx.queryOrder()));
}
- if (ctx.groupByClause() != null) {
- tokens.addAll(visit(ctx.groupByClause()));
- }
+ return tokens;
+ }
- if (ctx.havingClause() != null) {
- tokens.addAll(visit(ctx.havingClause()));
+ @Override
+ public List visitSetOperator(HqlParser.SetOperatorContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ if (ctx.UNION() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.UNION()));
+ } else if (ctx.INTERSECT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INTERSECT()));
+ } else if (ctx.EXCEPT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.EXCEPT()));
}
- if (ctx.selectClause() != null) {
- tokens.addAll(visit(ctx.selectClause()));
+ if (ctx.ALL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ALL()));
}
return tokens;
@@ -315,127 +464,101 @@ public List visitQueryOrder(HqlParser.QueryOrderContext ct
}
@Override
- public List visitFromClause(HqlParser.FromClauseContext ctx) {
+ public List visitQuery(HqlParser.QueryContext ctx) {
List tokens = new ArrayList<>();
- // TODO: Read up on Framework's LeastRecentlyUsedCache
- tokens.add(new JpaQueryParsingToken(ctx.FROM()));
+ if (ctx.getChild(0) instanceof HqlParser.SelectClauseContext) {
- ctx.entityWithJoins().forEach(entityWithJoinsContext -> {
- tokens.addAll(visit(entityWithJoinsContext));
- NOSPACE(tokens);
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
- SPACE(tokens);
+ tokens.addAll(visit(ctx.selectClause()));
- return tokens;
- }
+ if (ctx.fromClause() != null) {
+ tokens.addAll(visit(ctx.fromClause()));
+ }
+ } else {
+ tokens.addAll(visit(ctx.fromClause()));
+ }
- @Override
- public List visitEntityWithJoins(HqlParser.EntityWithJoinsContext ctx) {
-
- List tokens = new ArrayList<>();
-
- tokens.addAll(visit(ctx.fromRoot()));
- SPACE(tokens);
+ if (ctx.whereClause() != null) {
+ tokens.addAll(visit(ctx.whereClause()));
+ }
- ctx.joinSpecifier().forEach(joinSpecifierContext -> {
- tokens.addAll(visit(joinSpecifierContext));
- });
+ if (ctx.groupByClause() != null) {
+ tokens.addAll(visit(ctx.groupByClause()));
+ }
- return tokens;
- }
+ if (ctx.havingClause() != null) {
+ tokens.addAll(visit(ctx.havingClause()));
+ }
- @Override
- public List visitJoinSpecifier(HqlParser.JoinSpecifierContext ctx) {
+ if (ctx.getChild(0) instanceof HqlParser.FromClauseContext) {
- if (ctx.join() != null) {
- return visit(ctx.join());
- } else if (ctx.crossJoin() != null) {
- return visit(ctx.crossJoin());
- } else if (ctx.jpaCollectionJoin() != null) {
- return visit(ctx.jpaCollectionJoin());
- } else {
- return List.of();
+ if (ctx.selectClause() != null) {
+ tokens.addAll(visit(ctx.selectClause()));
+ }
}
+
+ return tokens;
}
@Override
- public List visitFromRoot(HqlParser.FromRootContext ctx) {
+ public List visitFromClause(HqlParser.FromClauseContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.entityName() != null) {
-
- tokens.addAll(visit(ctx.entityName()));
+ // TODO: Read up on Framework's LeastRecentlyUsedCache
+ tokens.add(new JpaQueryParsingToken(ctx.FROM()));
- if (ctx.variable() != null) {
- tokens.addAll(visit(ctx.variable()));
- }
+ ctx.entityWithJoins().forEach(entityWithJoinsContext -> {
+ tokens.addAll(visit(entityWithJoinsContext));
NOSPACE(tokens);
- } else if (ctx.subquery() != null) {
-
- if (ctx.LATERAL() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.LATERAL()));
- }
- tokens.add(TOKEN_OPEN_PAREN);
- tokens.addAll(visit(ctx.subquery()));
- tokens.add(TOKEN_CLOSE_PAREN);
-
- if (ctx.variable() != null) {
- tokens.addAll(visit(ctx.variable()));
- }
- }
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+ SPACE(tokens);
return tokens;
}
@Override
- public List visitJoin(HqlParser.JoinContext ctx) {
+ public List visitEntityWithJoins(HqlParser.EntityWithJoinsContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.joinType()));
- tokens.add(new JpaQueryParsingToken(ctx.JOIN()));
-
- if (ctx.FETCH() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
- }
-
- tokens.addAll(visit(ctx.joinTarget()));
+ tokens.addAll(visit(ctx.fromRoot()));
+ SPACE(tokens);
- if (ctx.joinRestriction() != null) {
- tokens.addAll(visit(ctx.joinRestriction()));
- }
+ ctx.children.forEach(parseTree -> {
+ if (parseTree instanceof HqlParser.JoinContext //
+ || parseTree instanceof HqlParser.CrossJoinContext //
+ || parseTree instanceof HqlParser.JpaCollectionJoinContext) {
+ tokens.addAll(visit(parseTree));
+ }
+ });
return tokens;
}
@Override
- public List visitJoinPath(HqlParser.JoinPathContext ctx) {
+ public List visitRootEntity(HqlParser.RootEntityContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.path()));
+ tokens.addAll(visit(ctx.entityName()));
if (ctx.variable() != null) {
tokens.addAll(visit(ctx.variable()));
}
+ NOSPACE(tokens);
return tokens;
}
@Override
- public List visitJoinSubquery(HqlParser.JoinSubqueryContext ctx) {
+ public List visitRootSubquery(HqlParser.RootSubqueryContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.LATERAL() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.LATERAL()));
- }
-
tokens.add(TOKEN_OPEN_PAREN);
tokens.addAll(visit(ctx.subquery()));
tokens.add(TOKEN_CLOSE_PAREN);
@@ -443,36 +566,51 @@ public List visitJoinSubquery(HqlParser.JoinSubqueryContex
if (ctx.variable() != null) {
tokens.addAll(visit(ctx.variable()));
}
+ NOSPACE(tokens);
return tokens;
}
@Override
- public List visitUpdateStatement(HqlParser.UpdateStatementContext ctx) {
+ public List visitEntityName(HqlParser.EntityNameContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.UPDATE()));
+ ctx.identifier().forEach(identifierContext -> {
- if (ctx.VERSIONED() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.VERSIONED()));
- }
+ tokens.addAll(visit(identifierContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_DOT);
+ });
+ CLIP(tokens);
+ SPACE(tokens);
- tokens.addAll(visit(ctx.targetEntity()));
- tokens.addAll(visit(ctx.setClause()));
+ return tokens;
+ }
- if (ctx.whereClause() != null) {
- tokens.addAll(visit(ctx.whereClause()));
+ @Override
+ public List visitVariable(HqlParser.VariableContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ if (ctx.identifier() != null) {
+
+ tokens.add(new JpaQueryParsingToken(ctx.AS()));
+ tokens.addAll(visit(ctx.identifier()));
+ } else if (ctx.nakedIdentifier() != null) {
+ tokens.addAll(visit(ctx.nakedIdentifier()));
}
return tokens;
}
@Override
- public List visitTargetEntity(HqlParser.TargetEntityContext ctx) {
+ public List visitCrossJoin(HqlParser.CrossJoinContext ctx) {
List tokens = new ArrayList<>();
+ tokens.add(new JpaQueryParsingToken(ctx.CROSS()));
+ tokens.add(new JpaQueryParsingToken(ctx.JOIN()));
tokens.addAll(visit(ctx.entityName()));
if (ctx.variable() != null) {
@@ -483,995 +621,2270 @@ public List visitTargetEntity(HqlParser.TargetEntityContex
}
@Override
- public List visitSetClause(HqlParser.SetClauseContext ctx) {
+ public List visitJpaCollectionJoin(HqlParser.JpaCollectionJoinContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.SET()));
+ tokens.add(TOKEN_COMMA);
+ tokens.add(new JpaQueryParsingToken(ctx.IN(), false));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.path()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
- ctx.assignment().forEach(assignmentContext -> {
- tokens.addAll(visit(assignmentContext));
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
+ }
return tokens;
}
@Override
- public List visitAssignment(HqlParser.AssignmentContext ctx) {
+ public List visitJoin(HqlParser.JoinContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.simplePath()));
- tokens.add(TOKEN_EQUALS);
- tokens.addAll(visit(ctx.expressionOrPredicate()));
+ tokens.addAll(visit(ctx.joinType()));
+ tokens.add(new JpaQueryParsingToken(ctx.JOIN()));
+
+ if (ctx.FETCH() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
+ }
+
+ tokens.addAll(visit(ctx.joinTarget()));
+
+ if (ctx.joinRestriction() != null) {
+ tokens.addAll(visit(ctx.joinRestriction()));
+ }
return tokens;
}
@Override
- public List visitDeleteStatement(HqlParser.DeleteStatementContext ctx) {
+ public List visitJoinType(HqlParser.JoinTypeContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.DELETE()));
-
- if (ctx.FROM() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.FROM()));
+ if (ctx.INNER() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INNER()));
}
-
- tokens.addAll(visit(ctx.targetEntity()));
-
- if (ctx.whereClause() != null) {
- tokens.addAll(visit(ctx.whereClause()));
+ if (ctx.LEFT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.LEFT()));
+ }
+ if (ctx.RIGHT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.RIGHT()));
+ }
+ if (ctx.FULL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.FULL()));
+ }
+ if (ctx.OUTER() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.OUTER()));
}
return tokens;
}
@Override
- public List visitInsertStatement(HqlParser.InsertStatementContext ctx) {
+ public List visitJoinPath(HqlParser.JoinPathContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.INSERT()));
-
- if (ctx.INTO() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.INTO()));
- }
-
- tokens.addAll(visit(ctx.targetEntity()));
- tokens.addAll(visit(ctx.targetFields()));
+ tokens.addAll(visit(ctx.path()));
- if (ctx.queryExpression() != null) {
- tokens.addAll(visit(ctx.queryExpression()));
- } else if (ctx.valuesList() != null) {
- tokens.addAll(visit(ctx.valuesList()));
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
}
return tokens;
}
@Override
- public List visitTargetFields(HqlParser.TargetFieldsContext ctx) {
+ public List visitJoinSubquery(HqlParser.JoinSubqueryContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(TOKEN_OPEN_PAREN);
-
- ctx.simplePath().forEach(simplePathContext -> {
- tokens.addAll(visit(simplePathContext));
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
+ if (ctx.LATERAL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.LATERAL()));
+ }
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.subquery()));
tokens.add(TOKEN_CLOSE_PAREN);
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
+ }
+
return tokens;
}
@Override
- public List visitValuesList(HqlParser.ValuesListContext ctx) {
+ public List visitJoinRestriction(HqlParser.JoinRestrictionContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.VALUES()));
+ if (ctx.ON() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ON()));
+ } else if (ctx.WITH() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.WITH()));
+ }
- ctx.values().forEach(valuesContext -> {
- tokens.addAll(visit(valuesContext));
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
+ tokens.addAll(visit(ctx.predicate()));
return tokens;
}
@Override
- public List visitValues(HqlParser.ValuesContext ctx) {
+ public List visitSelectClause(HqlParser.SelectClauseContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(TOKEN_OPEN_PAREN);
+ tokens.add(new JpaQueryParsingToken(ctx.SELECT()));
- ctx.expression().forEach(expressionContext -> {
- tokens.addAll(visit(expressionContext));
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
+ if (ctx.DISTINCT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.DISTINCT()));
+ }
- tokens.add(TOKEN_CLOSE_PAREN);
+ tokens.addAll(visit(ctx.selectionList()));
return tokens;
}
@Override
- public List visitInstantiation(HqlParser.InstantiationContext ctx) {
+ public List visitSelectionList(HqlParser.SelectionListContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.NEW()));
- tokens.addAll(visit(ctx.instantiationTarget()));
- tokens.add(TOKEN_OPEN_PAREN);
- tokens.addAll(visit(ctx.instantiationArguments()));
- tokens.add(TOKEN_CLOSE_PAREN);
+ ctx.selection().forEach(selectionContext -> {
+ tokens.addAll(visit(selectionContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+ SPACE(tokens);
return tokens;
}
@Override
- public List visitAlias(HqlParser.AliasContext ctx) {
+ public List visitSelection(HqlParser.SelectionContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.AS() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.AS()));
- }
+ tokens.addAll(visit(ctx.selectExpression()));
- tokens.addAll(visit(ctx.identifier()));
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
+ }
return tokens;
}
@Override
- public List visitGroupedItem(HqlParser.GroupedItemContext ctx) {
+ public List visitSelectExpression(HqlParser.SelectExpressionContext ctx) {
- if (ctx.identifier() != null) {
- return visit(ctx.identifier());
- } else if (ctx.INTEGER_LITERAL() != null) {
- return List.of(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
- } else if (ctx.expression() != null) {
- return visit(ctx.expression());
- } else {
- return List.of();
- }
- }
+ if (ctx.instantiation() != null) {
+ return visit(ctx.instantiation());
+ } else if (ctx.mapEntrySelection() != null) {
+ return visit(ctx.mapEntrySelection());
+ } else if (ctx.jpaSelectObjectSyntax() != null) {
+ return visit(ctx.jpaSelectObjectSyntax());
+ } else if (ctx.expressionOrPredicate() != null) {
+ return visit(ctx.expressionOrPredicate());
+ } else {
+ return List.of();
+ }
+ }
@Override
- public List visitSortedItem(HqlParser.SortedItemContext ctx) {
+ public List visitMapEntrySelection(HqlParser.MapEntrySelectionContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.sortExpression()));
+ tokens.add(new JpaQueryParsingToken(ctx.ENTRY()));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.path()));
+ tokens.add(TOKEN_CLOSE_PAREN);
- if (ctx.sortDirection() != null) {
- tokens.addAll(visit(ctx.sortDirection()));
- }
+ return tokens;
+ }
- if (ctx.nullsPrecedence() != null) {
- tokens.addAll(visit(ctx.nullsPrecedence()));
- }
+ @Override
+ public List visitInstantiation(HqlParser.InstantiationContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.NEW()));
+ tokens.addAll(visit(ctx.instantiationTarget()));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.instantiationArguments()));
+ tokens.add(TOKEN_CLOSE_PAREN);
return tokens;
}
@Override
- public List visitSortExpression(HqlParser.SortExpressionContext ctx) {
+ public List visitInstantiationTarget(HqlParser.InstantiationTargetContext ctx) {
- if (ctx.identifier() != null) {
- return visit(ctx.identifier());
- } else if (ctx.INTEGER_LITERAL() != null) {
- return List.of(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
- } else if (ctx.expression() != null) {
- return visit(ctx.expression());
+ if (ctx.LIST() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.LIST()));
+ } else if (ctx.MAP() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.MAP()));
+ } else if (ctx.simplePath() != null) {
+
+ List tokens = visit(ctx.simplePath());
+ NOSPACE(tokens);
+ return tokens;
} else {
return List.of();
}
}
@Override
- public List visitSortDirection(HqlParser.SortDirectionContext ctx) {
+ public List visitInstantiationArguments(HqlParser.InstantiationArgumentsContext ctx) {
- if (ctx.ASC() != null) {
- return List.of(new JpaQueryParsingToken(ctx.ASC()));
- } else if (ctx.DESC() != null) {
- return List.of(new JpaQueryParsingToken(ctx.DESC()));
- } else {
- return List.of();
- }
+ List tokens = new ArrayList<>();
+
+ ctx.instantiationArgument().forEach(instantiationArgumentContext -> {
+ tokens.addAll(visit(instantiationArgumentContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ return tokens;
}
@Override
- public List visitNullsPrecedence(HqlParser.NullsPrecedenceContext ctx) {
+ public List visitInstantiationArgument(HqlParser.InstantiationArgumentContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.NULLS()));
+ tokens.addAll(visit(ctx.instantiationArgumentExpression()));
- if (ctx.FIRST() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.FIRST()));
- } else if (ctx.LAST() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.LAST()));
+ if (ctx.variable() != null) {
+ tokens.addAll(visit(ctx.variable()));
}
return tokens;
}
@Override
- public List visitLimitClause(HqlParser.LimitClauseContext ctx) {
+ public List visitInstantiationArgumentExpression(
+ HqlParser.InstantiationArgumentExpressionContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.LIMIT()));
- tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
+ if (ctx.expressionOrPredicate() != null) {
+ tokens.addAll(visit(ctx.expressionOrPredicate()));
+ } else if (ctx.instantiation() != null) {
+ tokens.addAll(visit(ctx.instantiation()));
+ }
return tokens;
}
@Override
- public List visitOffsetClause(HqlParser.OffsetClauseContext ctx) {
+ public List visitJpaSelectObjectSyntax(HqlParser.JpaSelectObjectSyntaxContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.OFFSET()));
- tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
+ tokens.add(new JpaQueryParsingToken(ctx.OBJECT(), false));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.identifier()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
- if (ctx.ROW() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.ROW()));
- } else if (ctx.ROWS() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.ROWS()));
- }
+ return tokens;
+ }
+
+ @Override
+ public List visitSimplePath(HqlParser.SimplePathContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.identifier()));
+ NOSPACE(tokens);
+
+ ctx.simplePathElement().forEach(simplePathElementContext -> {
+ tokens.addAll(visit(simplePathElementContext));
+ NOSPACE(tokens);
+ });
+ SPACE(tokens);
return tokens;
}
@Override
- public List visitFetchClause(HqlParser.FetchClauseContext ctx) {
+ public List visitSimplePathElement(HqlParser.SimplePathElementContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
+ tokens.add(TOKEN_DOT);
+ tokens.addAll(visit(ctx.identifier()));
- if (ctx.FIRST() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.FIRST()));
- } else if (ctx.NEXT() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.NEXT()));
- }
+ return tokens;
+ }
- if (ctx.parameterOrIntegerLiteral() != null) {
- tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
- } else if (ctx.parameterOrNumberLiteral() != null) {
+ @Override
+ public List visitPath(HqlParser.PathContext ctx) {
- tokens.addAll(visit(ctx.parameterOrNumberLiteral()));
- tokens.add(TOKEN_PERCENT);
- }
+ List tokens = new ArrayList<>();
- if (ctx.ROW() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.ROW()));
- } else if (ctx.ROWS() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.ROWS()));
- }
+ if (ctx.syntacticDomainPath() != null) {
- if (ctx.ONLY() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.ONLY()));
- } else if (ctx.WITH() != null) {
+ tokens.addAll(visit(ctx.syntacticDomainPath()));
- tokens.add(new JpaQueryParsingToken(ctx.WITH()));
- tokens.add(new JpaQueryParsingToken(ctx.TIES()));
+ if (ctx.pathContinuation() != null) {
+ NOSPACE(tokens);
+ tokens.addAll(visit(ctx.pathContinuation()));
+ }
+ } else if (ctx.generalPathFragment() != null) {
+ tokens.addAll(visit(ctx.generalPathFragment()));
}
return tokens;
}
@Override
- public List visitSubquery(HqlParser.SubqueryContext ctx) {
- return visit(ctx.queryExpression());
+ public List visitPathContinuation(HqlParser.PathContinuationContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_DOT);
+ tokens.addAll(visit(ctx.simplePath()));
+
+ return tokens;
}
@Override
- public List visitSelectClause(HqlParser.SelectClauseContext ctx) {
+ public List visitSyntacticDomainPath(HqlParser.SyntacticDomainPathContext ctx) {
- List tokens = new ArrayList<>();
-
- tokens.add(new JpaQueryParsingToken(ctx.SELECT()));
+ if (ctx.treatedNavigablePath() != null) {
+ return visit(ctx.treatedNavigablePath());
+ } else if (ctx.collectionValueNavigablePath() != null) {
+ return visit(ctx.collectionValueNavigablePath());
+ } else if (ctx.mapKeyNavigablePath() != null) {
+ return visit(ctx.mapKeyNavigablePath());
+ } else if (ctx.simplePath() != null) {
- if (ctx.DISTINCT() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.DISTINCT()));
- }
+ List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.selectionList()));
+ tokens.addAll(visit(ctx.simplePath()));
+ tokens.addAll(visit(ctx.indexedPathAccessFragment()));
- return tokens;
+ return tokens;
+ } else {
+ return List.of();
+ }
}
@Override
- public List visitSelectionList(HqlParser.SelectionListContext ctx) {
+ public List visitGeneralPathFragment(HqlParser.GeneralPathFragmentContext ctx) {
List tokens = new ArrayList<>();
- ctx.selection().forEach(selectionContext -> {
- tokens.addAll(visit(selectionContext));
- NOSPACE(tokens);
- tokens.add(TOKEN_COMMA);
- });
- CLIP(tokens);
- SPACE(tokens);
+ tokens.addAll(visit(ctx.simplePath()));
+
+ if (ctx.indexedPathAccessFragment() != null) {
+ tokens.addAll(visit(ctx.indexedPathAccessFragment()));
+ }
return tokens;
}
@Override
- public List visitSelection(HqlParser.SelectionContext ctx) {
+ public List visitIndexedPathAccessFragment(HqlParser.IndexedPathAccessFragmentContext ctx) {
List tokens = new ArrayList<>();
- tokens.addAll(visit(ctx.selectExpression()));
+ tokens.add(TOKEN_OPEN_SQUARE_BRACKET);
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(TOKEN_CLOSE_SQUARE_BRACKET);
- if (ctx.variable() != null) {
- tokens.addAll(visit(ctx.variable()));
+ if (ctx.generalPathFragment() != null) {
+
+ tokens.add(TOKEN_DOT);
+ tokens.addAll(visit(ctx.generalPathFragment()));
}
return tokens;
}
@Override
- public List visitSelectExpression(HqlParser.SelectExpressionContext ctx) {
+ public List visitTreatedNavigablePath(HqlParser.TreatedNavigablePathContext ctx) {
- if (ctx.instantiation() != null) {
- return visit(ctx.instantiation());
- } else if (ctx.mapEntrySelection() != null) {
- return visit(ctx.mapEntrySelection());
- } else if (ctx.jpaSelectObjectSyntax() != null) {
- return visit(ctx.jpaSelectObjectSyntax());
- } else if (ctx.expressionOrPredicate() != null) {
- return visit(ctx.expressionOrPredicate());
- } else {
- return List.of();
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.TREAT(), false));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.path()));
+ tokens.add(TOKEN_AS);
+ tokens.addAll(visit(ctx.simplePath()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ if (ctx.pathContinuation() != null) {
+
+ NOSPACE(tokens);
+ tokens.addAll(visit(ctx.pathContinuation()));
}
+
+ return tokens;
}
@Override
- public List visitMapEntrySelection(HqlParser.MapEntrySelectionContext ctx) {
+ public List visitCollectionValueNavigablePath(
+ HqlParser.CollectionValueNavigablePathContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.ENTRY()));
+ if (ctx.VALUE() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.VALUE()));
+ } else if (ctx.ELEMENT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ELEMENT()));
+ }
+
+ NOSPACE(tokens);
tokens.add(TOKEN_OPEN_PAREN);
tokens.addAll(visit(ctx.path()));
+ NOSPACE(tokens);
tokens.add(TOKEN_CLOSE_PAREN);
+ if (ctx.pathContinuation() != null) {
+ tokens.addAll(visit(ctx.pathContinuation()));
+ }
+
return tokens;
}
@Override
- public List visitJpaSelectObjectSyntax(HqlParser.JpaSelectObjectSyntaxContext ctx) {
+ public List visitMapKeyNavigablePath(HqlParser.MapKeyNavigablePathContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.OBJECT(), false));
+ if (ctx.KEY() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.KEY(), false));
+ } else if (ctx.INDEX() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INDEX(), false));
+ }
+
tokens.add(TOKEN_OPEN_PAREN);
- tokens.addAll(visit(ctx.identifier()));
+ tokens.addAll(visit(ctx.path()));
NOSPACE(tokens);
tokens.add(TOKEN_CLOSE_PAREN);
+ if (ctx.pathContinuation() != null) {
+
+ NOSPACE(tokens);
+ tokens.addAll(visit(ctx.pathContinuation()));
+ }
+
return tokens;
}
@Override
- public List visitWhereClause(HqlParser.WhereClauseContext ctx) {
+ public List visitGroupByClause(HqlParser.GroupByClauseContext ctx) {
List tokens = new ArrayList<>();
- tokens.add(new JpaQueryParsingToken(ctx.WHERE()));
+ tokens.add(new JpaQueryParsingToken(ctx.GROUP()));
+ tokens.add(new JpaQueryParsingToken(ctx.BY()));
- ctx.predicate().forEach(predicateContext -> {
- tokens.addAll(visit(predicateContext));
+ ctx.groupByExpression().forEach(groupByExpressionContext -> {
+ tokens.addAll(visit(groupByExpressionContext));
+ NOSPACE(tokens);
tokens.add(TOKEN_COMMA);
});
CLIP(tokens);
+ SPACE(tokens);
return tokens;
}
@Override
- public List visitJoinType(HqlParser.JoinTypeContext ctx) {
+ public List visitGroupByExpression(HqlParser.GroupByExpressionContext ctx) {
List tokens = new ArrayList<>();
- if (ctx.INNER() != null) {
- tokens.add(new JpaQueryParsingToken(ctx.INNER()));
+ if (ctx.identifier() != null) {
+ tokens.addAll(visit(ctx.identifier()));
+ } else if (ctx.INTEGER_LITERAL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
+ } else if (ctx.expression() != null) {
+ tokens.addAll(visit(ctx.expression()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitHavingClause(HqlParser.HavingClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.HAVING()));
+ tokens.addAll(visit(ctx.predicate()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitOrderByClause(HqlParser.OrderByClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.ORDER()));
+ tokens.add(new JpaQueryParsingToken(ctx.BY()));
+
+ ctx.sortSpecification().forEach(sortedItemContext -> {
+ tokens.addAll(visit(sortedItemContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitOrderByFragment(HqlParser.OrderByFragmentContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ ctx.sortSpecification().forEach(sortedItemContext -> {
+ tokens.addAll(visit(sortedItemContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitSortSpecification(HqlParser.SortSpecificationContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.sortExpression()));
+
+ if (ctx.sortDirection() != null) {
+ tokens.addAll(visit(ctx.sortDirection()));
+ }
+
+ if (ctx.nullsPrecedence() != null) {
+ tokens.addAll(visit(ctx.nullsPrecedence()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitNullsPrecedence(HqlParser.NullsPrecedenceContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.NULLS()));
+
+ if (ctx.FIRST() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.FIRST()));
+ } else if (ctx.LAST() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.LAST()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitSortExpression(HqlParser.SortExpressionContext ctx) {
+
+ if (ctx.identifier() != null) {
+ return visit(ctx.identifier());
+ } else if (ctx.INTEGER_LITERAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
+ } else if (ctx.expression() != null) {
+ return visit(ctx.expression());
+ } else {
+ return List.of();
+ }
+ }
+
+ @Override
+ public List visitSortDirection(HqlParser.SortDirectionContext ctx) {
+
+ if (ctx.ASC() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.ASC()));
+ } else if (ctx.DESC() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.DESC()));
+ } else {
+ return List.of();
+ }
+ }
+
+ @Override
+ public List visitCollateFunction(HqlParser.CollateFunctionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.COLLATE()));
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(TOKEN_AS);
+ tokens.addAll(visit(ctx.collation()));
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitCollation(HqlParser.CollationContext ctx) {
+ return visit(ctx.simplePath());
+ }
+
+ @Override
+ public List visitLimitClause(HqlParser.LimitClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.LIMIT()));
+ tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitOffsetClause(HqlParser.OffsetClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.OFFSET()));
+ tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
+
+ if (ctx.ROW() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ROW()));
+ } else if (ctx.ROWS() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ROWS()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitFetchClause(HqlParser.FetchClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
+
+ if (ctx.FIRST() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.FIRST()));
+ } else if (ctx.NEXT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.NEXT()));
+ }
+
+ if (ctx.parameterOrIntegerLiteral() != null) {
+ tokens.addAll(visit(ctx.parameterOrIntegerLiteral()));
+ } else if (ctx.parameterOrNumberLiteral() != null) {
+
+ tokens.addAll(visit(ctx.parameterOrNumberLiteral()));
+ tokens.add(TOKEN_PERCENT);
+ }
+
+ if (ctx.ROW() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ROW()));
+ } else if (ctx.ROWS() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ROWS()));
+ }
+
+ if (ctx.ONLY() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ONLY()));
+ } else if (ctx.WITH() != null) {
+
+ tokens.add(new JpaQueryParsingToken(ctx.WITH()));
+ tokens.add(new JpaQueryParsingToken(ctx.TIES()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitParameterOrIntegerLiteral(HqlParser.ParameterOrIntegerLiteralContext ctx) {
+
+ if (ctx.parameter() != null) {
+ return visit(ctx.parameter());
+ } else if (ctx.INTEGER_LITERAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
+ } else {
+ return List.of();
+ }
+ }
+
+ @Override
+ public List visitParameterOrNumberLiteral(HqlParser.ParameterOrNumberLiteralContext ctx) {
+
+ if (ctx.parameter() != null) {
+ return visit(ctx.parameter());
+ } else if (ctx.INTEGER_LITERAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.INTEGER_LITERAL()));
+ } else if (ctx.FLOAT_LITERAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.FLOAT_LITERAL()));
+ } else if (ctx.DOUBLE_LITERAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.DOUBLE_LITERAL()));
+ } else {
+ return List.of();
+ }
+ }
+
+ @Override
+ public List visitWhereClause(HqlParser.WhereClauseContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.WHERE()));
+ tokens.addAll(visit(ctx.predicate()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitBetweenPredicate(HqlParser.BetweenPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.BETWEEN()));
+ tokens.addAll(visit(ctx.expression(1)));
+ tokens.add(new JpaQueryParsingToken(ctx.AND()));
+ tokens.addAll(visit(ctx.expression(2)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitExistsPredicate(HqlParser.ExistsPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.EXISTS()));
+ tokens.addAll(visit(ctx.expression()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitAndPredicate(HqlParser.AndPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.predicate(0)));
+ tokens.add(new JpaQueryParsingToken(ctx.AND()));
+ tokens.addAll(visit(ctx.predicate(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitGroupedPredicate(HqlParser.GroupedPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.predicate()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitLikePredicate(HqlParser.LikePredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ if (ctx.LIKE() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.LIKE()));
+ } else if (ctx.ILIKE() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ILIKE()));
+ }
+ tokens.addAll(visit(ctx.expression(1)));
+
+ if (ctx.likeEscape() != null) {
+ tokens.addAll(visit(ctx.likeEscape()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitInPredicate(HqlParser.InPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.IN()));
+ tokens.addAll(visit(ctx.inList()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitComparisonPredicate(HqlParser.ComparisonPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+ tokens.addAll(visit(ctx.comparisonOperator()));
+ tokens.addAll(visit(ctx.expression(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitExistsCollectionPartPredicate(
+ HqlParser.ExistsCollectionPartPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.EXISTS()));
+ if (ctx.ELEMENTS() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ELEMENTS()));
+ } else if (ctx.INDICES() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INDICES()));
+ }
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.simplePath()));
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitNegatedPredicate(HqlParser.NegatedPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.NOT()));
+ tokens.addAll(visit(ctx.predicate()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitBooleanExpressionPredicate(HqlParser.BooleanExpressionPredicateContext ctx) {
+ return visit(ctx.expression());
+ }
+
+ @Override
+ public List visitOrPredicate(HqlParser.OrPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.predicate(0)));
+ tokens.add(new JpaQueryParsingToken(ctx.OR()));
+ tokens.addAll(visit(ctx.predicate(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitMemberOfPredicate(HqlParser.MemberOfPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.MEMBER()));
+ if (ctx.OF() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.OF()));
+ }
+ tokens.addAll(visit(ctx.path()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitIsEmptyPredicate(HqlParser.IsEmptyPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(new JpaQueryParsingToken(ctx.IS()));
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.EMPTY()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitIsNullPredicate(HqlParser.IsNullPredicateContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(new JpaQueryParsingToken(ctx.IS()));
+ if (ctx.NOT() != null) {
+ tokens.add(TOKEN_NOT);
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.NULL()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitComparisonOperator(HqlParser.ComparisonOperatorContext ctx) {
+
+ if (ctx.EQUAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.EQUAL()));
+ } else if (ctx.NOT_EQUAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.NOT_EQUAL()));
+ } else if (ctx.GREATER() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.GREATER()));
+ } else if (ctx.GREATER_EQUAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.GREATER_EQUAL()));
+ } else if (ctx.LESS() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.LESS()));
+ } else if (ctx.LESS_EQUAL() != null) {
+ return List.of(new JpaQueryParsingToken(ctx.LESS_EQUAL()));
+ } else if (ctx.IS() != null) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.IS()));
+ if (ctx.NOT() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.NOT()));
+ }
+ tokens.add(new JpaQueryParsingToken(ctx.DISTINCT()));
+ tokens.add(new JpaQueryParsingToken(ctx.FROM()));
+
+ return tokens;
+ } else {
+ return List.of();
+ }
+ }
+
+ @Override
+ public List visitPersistentCollectionReferenceInList(
+ HqlParser.PersistentCollectionReferenceInListContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ if (ctx.ELEMENTS() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.ELEMENTS()));
+ } else if (ctx.INDICES() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.INDICES()));
+ }
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.simplePath()));
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitExplicitTupleInList(HqlParser.ExplicitTupleInListContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+
+ ctx.expressionOrPredicate().forEach(expressionOrPredicateContext -> {
+ tokens.addAll(visit(expressionOrPredicateContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitSubqueryInList(HqlParser.SubqueryInListContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.subquery()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitParamInList(HqlParser.ParamInListContext ctx) {
+ return visit(ctx.parameter());
+ }
+
+ @Override
+ public List visitLikeEscape(HqlParser.LikeEscapeContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(new JpaQueryParsingToken(ctx.ESCAPE()));
+ if (ctx.STRING_LITERAL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.STRING_LITERAL()));
+ } else if (ctx.JAVA_STRING_LITERAL() != null) {
+ tokens.add(new JpaQueryParsingToken(ctx.JAVA_STRING_LITERAL()));
+ } else if (ctx.parameter() != null) {
+ tokens.addAll(visit(ctx.parameter()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List visitAdditionExpression(HqlParser.AdditionExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+ tokens.addAll(visit(ctx.additiveOperator()));
+ tokens.addAll(visit(ctx.expression(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitFromDurationExpression(HqlParser.FromDurationExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(new JpaQueryParsingToken(ctx.BY()));
+ tokens.addAll(visit(ctx.datetimeField()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitBarePrimaryExpression(HqlParser.BarePrimaryExpressionContext ctx) {
+ return visit(ctx.primaryExpression());
+ }
+
+ @Override
+ public List visitTupleExpression(HqlParser.TupleExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+
+ ctx.expressionOrPredicate().forEach(expressionOrPredicateContext -> {
+
+ tokens.addAll(visit(expressionOrPredicateContext));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_COMMA);
+ });
+ CLIP(tokens);
+
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitUnaryExpression(HqlParser.UnaryExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.signOperator()));
+ tokens.addAll(visit(ctx.expression()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitGroupedExpression(HqlParser.GroupedExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.expression()));
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitConcatenationExpression(HqlParser.ConcatenationExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+ tokens.add(TOKEN_DOUBLE_PIPE);
+ tokens.addAll(visit(ctx.expression(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitMultiplicationExpression(HqlParser.MultiplicationExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression(0)));
+ NOSPACE(tokens);
+ tokens.addAll(visit(ctx.multiplicativeOperator()));
+ NOSPACE(tokens);
+ tokens.addAll(visit(ctx.expression(1)));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitToDurationExpression(HqlParser.ToDurationExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.expression()));
+ tokens.addAll(visit(ctx.datetimeField()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitSubqueryExpression(HqlParser.SubqueryExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.add(TOKEN_OPEN_PAREN);
+ tokens.addAll(visit(ctx.subquery()));
+ NOSPACE(tokens);
+ tokens.add(TOKEN_CLOSE_PAREN);
+
+ return tokens;
+ }
+
+ @Override
+ public List visitUnaryNumericLiteralExpression(
+ HqlParser.UnaryNumericLiteralExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.signOperator()));
+ tokens.addAll(visit(ctx.numericLiteral()));
+
+ return tokens;
+ }
+
+ @Override
+ public List visitCaseExpression(HqlParser.CaseExpressionContext ctx) {
+ return visit(ctx.caseList());
+ }
+
+ @Override
+ public List visitLiteralExpression(HqlParser.LiteralExpressionContext ctx) {
+ return visit(ctx.literal());
+ }
+
+ @Override
+ public List visitParameterExpression(HqlParser.ParameterExpressionContext ctx) {
+ return visit(ctx.parameter());
+ }
+
+ @Override
+ public List visitEntityTypeExpression(HqlParser.EntityTypeExpressionContext ctx) {
+ return visit(ctx.entityTypeReference());
+ }
+
+ @Override
+ public List visitEntityIdExpression(HqlParser.EntityIdExpressionContext ctx) {
+ return visit(ctx.entityIdReference());
+ }
+
+ @Override
+ public List visitEntityVersionExpression(HqlParser.EntityVersionExpressionContext ctx) {
+ return visit(ctx.entityVersionReference());
+ }
+
+ @Override
+ public List visitEntityNaturalIdExpression(HqlParser.EntityNaturalIdExpressionContext ctx) {
+ return visit(ctx.entityNaturalIdReference());
+ }
+
+ @Override
+ public List visitToOneFkExpression(HqlParser.ToOneFkExpressionContext ctx) {
+ return visit(ctx.toOneFkReference());
+ }
+
+ @Override
+ public List visitSyntacticPathExpression(HqlParser.SyntacticPathExpressionContext ctx) {
+
+ List tokens = new ArrayList<>();
+
+ tokens.addAll(visit(ctx.syntacticDomainPath()));
+ if (ctx.pathContinuation() != null) {
+ tokens.addAll(visit(ctx.pathContinuation()));
+ }
+
+ return tokens;
+ }
+
+ @Override
+ public List