17
17
18
18
import java .util .List ;
19
19
import java .util .function .Supplier ;
20
+ import java .util .stream .Collectors ;
21
+
22
+ import org .antlr .v4 .runtime .Token ;
23
+ import org .antlr .v4 .runtime .tree .TerminalNode ;
20
24
21
25
/**
22
26
* A value type used to represent a JPA query token. NOTE: Sometimes the token's value is based upon a value found later
27
31
*/
28
32
class QueryParsingToken {
29
33
34
+ /**
35
+ * Commonly use tokens.
36
+ */
37
+ public static final QueryParsingToken TOKEN_COMMA = new QueryParsingToken ("," );
38
+ public static final QueryParsingToken TOKEN_DOT = new QueryParsingToken ("." , false );
39
+ public static final QueryParsingToken TOKEN_EQUALS = new QueryParsingToken ("=" );
40
+ public static final QueryParsingToken TOKEN_OPEN_PAREN = new QueryParsingToken ("(" , false );
41
+ public static final QueryParsingToken TOKEN_CLOSE_PAREN = new QueryParsingToken (")" );
42
+ public static final QueryParsingToken TOKEN_ORDER_BY = new QueryParsingToken ("order by" );
43
+ public static final QueryParsingToken TOKEN_LOWER_FUNC = new QueryParsingToken ("lower(" , false );
44
+ public static final QueryParsingToken TOKEN_SELECT_COUNT = new QueryParsingToken ("select count(" , false );
45
+ public static final QueryParsingToken TOKEN_PERCENT = new QueryParsingToken ("%" );
46
+ public static final QueryParsingToken TOKEN_COUNT_FUNC = new QueryParsingToken ("count(" , false );
47
+ public static final QueryParsingToken TOKEN_DOUBLE_PIPE = new QueryParsingToken ("||" );
48
+ public static final QueryParsingToken TOKEN_OPEN_SQUARE_BRACKET = new QueryParsingToken ("[" , false );
49
+ public static final QueryParsingToken TOKEN_CLOSE_SQUARE_BRACKET = new QueryParsingToken ("]" );
50
+ public static final QueryParsingToken TOKEN_COLON = new QueryParsingToken (":" , false );
51
+ public static final QueryParsingToken TOKEN_QUESTION_MARK = new QueryParsingToken ("?" , false );
52
+ public static final QueryParsingToken TOKEN_CLOSE_BRACE = new QueryParsingToken ("}" );
53
+ public static final QueryParsingToken TOKEN_CLOSE_SQUARE_BRACKET_BRACE = new QueryParsingToken ("]}" );
54
+ public static final QueryParsingToken TOKEN_CLOSE_PAREN_BRACE = new QueryParsingToken (")}" );
55
+
56
+ public static final QueryParsingToken TOKEN_DESC = new QueryParsingToken ("desc" , false );
57
+
58
+ public static final QueryParsingToken TOKEN_ASC = new QueryParsingToken ("asc" , false );
30
59
/**
31
60
* The text value of the token.
32
61
*/
@@ -35,7 +64,7 @@ class QueryParsingToken {
35
64
/**
36
65
* Space|NoSpace after token is rendered?
37
66
*/
38
- private boolean space ;
67
+ private final boolean space ;
39
68
40
69
QueryParsingToken (Supplier <String > token , boolean space ) {
41
70
@@ -55,6 +84,18 @@ class QueryParsingToken {
55
84
this (() -> token , true );
56
85
}
57
86
87
+ QueryParsingToken (TerminalNode node , boolean space ) {
88
+ this (node .getText (), space );
89
+ }
90
+
91
+ QueryParsingToken (TerminalNode node ) {
92
+ this (node .getText ());
93
+ }
94
+
95
+ QueryParsingToken (Token token ) {
96
+ this (token .getText ());
97
+ }
98
+
58
99
/**
59
100
* Extract the token's value from it's {@link Supplier}.
60
101
*/
@@ -69,17 +110,18 @@ boolean getSpace() {
69
110
return this .space ;
70
111
}
71
112
72
- void setSpace (boolean space ) {
73
- this .space = space ;
74
- }
75
-
76
113
/**
77
114
* Switch the last {@link QueryParsingToken}'s spacing to {@literal true}.
78
115
*/
79
116
static void SPACE (List <QueryParsingToken > tokens ) {
80
117
81
118
if (!tokens .isEmpty ()) {
82
- tokens .get (tokens .size () - 1 ).setSpace (true );
119
+
120
+ int index = tokens .size () - 1 ;
121
+
122
+ QueryParsingToken lastTokenWithSpacing = new QueryParsingToken (tokens .get (index ).token );
123
+ tokens .remove (index );
124
+ tokens .add (lastTokenWithSpacing );
83
125
}
84
126
}
85
127
@@ -89,10 +131,43 @@ static void SPACE(List<QueryParsingToken> tokens) {
89
131
static void NOSPACE (List <QueryParsingToken > tokens ) {
90
132
91
133
if (!tokens .isEmpty ()) {
92
- tokens .get (tokens .size () - 1 ).setSpace (false );
134
+
135
+ int index = tokens .size () - 1 ;
136
+
137
+ QueryParsingToken lastTokenWithNoSpacing = new QueryParsingToken (tokens .get (index ).token , false );
138
+ tokens .remove (index );
139
+ tokens .add (lastTokenWithNoSpacing );
93
140
}
94
141
}
95
142
143
+ /**
144
+ * Take a list of {@link QueryParsingToken}s and convert them ALL to {@code space = false} (except possibly the last
145
+ * one).
146
+ *
147
+ * @param tokens
148
+ * @param spacelastElement
149
+ */
150
+ static List <QueryParsingToken > NOSPACE_ALL_BUT_LAST_ELEMENT (List <QueryParsingToken > tokens ,
151
+ boolean spacelastElement ) {
152
+
153
+ List <QueryParsingToken > respacedTokens = tokens .stream () //
154
+ .map (queryParsingToken -> {
155
+
156
+ if (queryParsingToken .space == true ) {
157
+ return new QueryParsingToken (queryParsingToken .token , false );
158
+ } else {
159
+ return queryParsingToken ;
160
+ }
161
+ }) //
162
+ .collect (Collectors .toList ());
163
+
164
+ if (spacelastElement ) {
165
+ SPACE (respacedTokens );
166
+ }
167
+
168
+ return respacedTokens ;
169
+ }
170
+
96
171
/**
97
172
* Drop the last entry from the list of {@link QueryParsingToken}s.
98
173
*/
0 commit comments