Skip to content

Commit e7fde06

Browse files
committed
Polishing.
Inline select_query into select_statement, simplify set_function resolution. Align JPQL and EQL grammars. Adopt Hibernate version guards in tests. Original Pull Request: #3695
1 parent 8d8d901 commit e7fde06

File tree

15 files changed

+745
-430
lines changed

15 files changed

+745
-430
lines changed

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Eql.g4

+8-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ ql_statement
4343
;
4444

4545
select_statement
46-
: select_clause from_clause (where_clause)? (groupby_clause)? (having_clause)? (orderby_clause)? (setOperator select_statement)*
46+
: select_clause from_clause (where_clause)? (groupby_clause)? (having_clause)? (orderby_clause)? (set_fuction)?
4747
;
4848

4949
setOperator
@@ -52,6 +52,10 @@ setOperator
5252
| EXCEPT ALL?
5353
;
5454

55+
set_fuction
56+
: setOperator select_statement
57+
;
58+
5559
update_statement
5660
: update_clause (where_clause)?
5761
;
@@ -664,6 +668,7 @@ constructor_name
664668

665669
literal
666670
: STRINGLITERAL
671+
| JAVASTRINGLITERAL
667672
| INTLITERAL
668673
| FLOATLITERAL
669674
| LONGLITERAL
@@ -836,9 +841,9 @@ reserved_word
836841
|OR
837842
|ORDER
838843
|OUTER
844+
|POWER
839845
|REPLACE
840846
|RIGHT
841-
|POWER
842847
|ROUND
843848
|SELECT
844849
|SET
@@ -1006,6 +1011,7 @@ NOT_EQUAL : '<>' | '!=' ;
10061011

10071012
CHARACTER : '\'' (~ ('\'' | '\\')) '\'' ;
10081013
IDENTIFICATION_VARIABLE : ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '$' | '_') ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '0' .. '9' | '$' | '_')* ;
1014+
JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
10091015
STRINGLITERAL : '\'' (~ ('\'' | '\\')|'\\')* '\'' ;
10101016
FLOATLITERAL : ('0' .. '9')* '.' ('0' .. '9')+ (E ('0' .. '9')+)* (F|D)?;
10111017
INTLITERAL : ('0' .. '9')+ ;

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4

+20-19
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ ql_statement
4343
;
4444

4545
select_statement
46-
: select_query
47-
;
48-
49-
select_query
5046
: select_clause from_clause (where_clause)? (groupby_clause)? (having_clause)? (orderby_clause)? (set_fuction)?
5147
;
5248

@@ -57,11 +53,7 @@ setOperator
5753
;
5854

5955
set_fuction
60-
: setOperator set_function_select
61-
;
62-
63-
set_function_select
64-
: select_query
56+
: setOperator select_statement
6557
;
6658

6759
update_statement
@@ -95,7 +87,7 @@ join
9587
;
9688

9789
fetch_join
98-
: join_spec FETCH join_association_path_expression
90+
: join_spec FETCH join_association_path_expression AS? identification_variable? join_condition?
9991
;
10092

10193
join_spec
@@ -315,7 +307,7 @@ scalar_expression
315307
| datetime_expression
316308
| boolean_expression
317309
| case_expression
318-
| cast_expression
310+
| cast_function
319311
| entity_type_expression
320312
;
321313

@@ -446,6 +438,7 @@ arithmetic_primary
446438
| functions_returning_numerics
447439
| aggregate_expression
448440
| case_expression
441+
| cast_function
449442
| function_invocation
450443
| '(' subquery ')'
451444
;
@@ -458,7 +451,6 @@ string_expression
458451
| aggregate_expression
459452
| case_expression
460453
| function_invocation
461-
| string_expression op='||' string_expression
462454
| '(' subquery ')'
463455
| string_expression '||' string_expression
464456
;
@@ -544,8 +536,8 @@ functions_returning_strings
544536
| SUBSTRING '(' string_expression ',' arithmetic_expression (',' arithmetic_expression)? ')'
545537
| TRIM '(' ((trim_specification)? (trim_character)? FROM)? string_expression ')'
546538
| LOWER '(' string_expression ')'
547-
| REPLACE '(' string_expression ',' string_expression ',' string_expression ')'
548539
| UPPER '(' string_expression ')'
540+
| REPLACE '(' string_expression ',' string_expression ',' string_expression ')'
549541
| LEFT '(' string_expression ',' arithmetic_expression ')'
550542
| RIGHT '(' string_expression ',' arithmetic_expression ')'
551543
;
@@ -556,6 +548,9 @@ trim_specification
556548
| BOTH
557549
;
558550

551+
cast_function
552+
: CAST '(' single_valued_path_expression (identification_variable)? identification_variable ('(' numeric_literal (',' numeric_literal)* ')')? ')'
553+
;
559554

560555
function_invocation
561556
: FUNCTION '(' function_name (',' function_arg)* ')'
@@ -620,9 +615,6 @@ nullif_expression
620615
: NULLIF '(' scalar_expression ',' scalar_expression ')'
621616
;
622617

623-
cast_expression
624-
: CAST '(' string_expression AS type_literal ')'
625-
;
626618

627619
/*******************
628620
Gaps in the spec.
@@ -636,6 +628,7 @@ trim_character
636628
identification_variable
637629
: IDENTIFICATION_VARIABLE
638630
| f=(COUNT
631+
| AS
639632
| DATE
640633
| FROM
641634
| INNER
@@ -651,6 +644,7 @@ identification_variable
651644
| TIME
652645
| TYPE
653646
| VALUE)
647+
| type_literal
654648
;
655649

656650
constructor_name
@@ -678,6 +672,9 @@ pattern_value
678672

679673
date_time_timestamp_literal
680674
: STRINGLITERAL
675+
| DATELITERAL
676+
| TIMELITERAL
677+
| TIMESTAMPLITERAL
681678
;
682679

683680
entity_type_literal
@@ -974,9 +971,10 @@ ON : O N;
974971
OR : O R;
975972
ORDER : O R D E R;
976973
OUTER : O U T E R;
974+
POWER : P O W E R;
975+
REGEXP : R E G E X P;
977976
REPLACE : R E P L A C E;
978977
RIGHT : R I G H T;
979-
POWER : P O W E R;
980978
ROUND : R O U N D;
981979
SELECT : S E L E C T;
982980
SET : S E T;
@@ -1006,8 +1004,11 @@ NOT_EQUAL : '<>' | '!=' ;
10061004

10071005
CHARACTER : '\'' (~ ('\'' | '\\')) '\'' ;
10081006
IDENTIFICATION_VARIABLE : ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '$' | '_') ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '0' .. '9' | '$' | '_')* ;
1009-
STRINGLITERAL : '\'' (~ ('\'' | '\\'))* '\'' ;
1007+
STRINGLITERAL : '\'' (~ ('\'' | '\\')|'\\')* '\'' ;
10101008
JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
10111009
FLOATLITERAL : ('0' .. '9')* '.' ('0' .. '9')+ (E ('0' .. '9')+)* (F|D)?;
10121010
INTLITERAL : ('0' .. '9')+ ;
1013-
LONGLITERAL : ('0' .. '9')+L ;
1011+
LONGLITERAL : ('0' .. '9')+ L;
1012+
DATELITERAL : '{' D STRINGLITERAL '}';
1013+
TIMELITERAL : '{' T STRINGLITERAL '}';
1014+
TIMESTAMPLITERAL : '{' T S STRINGLITERAL '}';

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EqlCountQueryTransformer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class EqlCountQueryTransformer extends EqlQueryRenderer {
4242
}
4343

4444
@Override
45-
public QueryRendererBuilder visitSelect_statement(EqlParser.Select_statementContext ctx) {
45+
public QueryTokenStream visitSelect_statement(EqlParser.Select_statementContext ctx) {
4646

4747
QueryRendererBuilder builder = QueryRenderer.builder();
4848

@@ -92,7 +92,7 @@ public QueryTokenStream visitSelect_clause(EqlParser.Select_clauseContext ctx) {
9292
return builder;
9393
}
9494

95-
private QueryRendererBuilder getDistinctCountSelection(QueryTokenStream selectionListbuilder) {
95+
private QueryTokenStream getDistinctCountSelection(QueryTokenStream selectionListbuilder) {
9696

9797
QueryRendererBuilder nested = new QueryRendererBuilder();
9898
CountSelectionTokenStream countSelection = CountSelectionTokenStream.create(selectionListbuilder);

0 commit comments

Comments
 (0)