1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.directory.modules.multiview.business.record;
35
36 import java.util.ArrayList;
37 import java.util.Iterator;
38 import java.util.List;
39
40 import org.apache.commons.collections.CollectionUtils;
41 import org.apache.commons.lang3.StringUtils;
42
43 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.IRecordColumnQueryPart;
44 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.RecordColumnQueryBuilder;
45 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.RecordFilterQueryConstants;
46 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.IRecordFilterQueryPart;
47 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.querypart.IRecordPanelInitializerQueryPart;
48 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.querypart.RecordPanelInitializerQueryBuilder;
49
50
51
52
53 public final class QueryBuilder
54 {
55
56
57
58 private QueryBuilder( )
59 {
60
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74 public static String buildQuery( List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart,
75 List<IRecordColumnQueryPart> listRecordColumnQueryPart, List<IRecordFilterQueryPart> listRecordFilterQueryPart )
76 {
77 StringBuilder stringBuilderGlobalQuery = new StringBuilder( );
78
79 if ( !CollectionUtils.isEmpty( listRecordPanelInitializerQueryPart ) && !CollectionUtils.isEmpty( listRecordColumnQueryPart ) )
80 {
81
82 buildSelectQueryPart( stringBuilderGlobalQuery, listRecordPanelInitializerQueryPart, listRecordColumnQueryPart );
83 stringBuilderGlobalQuery.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
84
85
86 buildFromQueryPart( stringBuilderGlobalQuery, listRecordPanelInitializerQueryPart, listRecordColumnQueryPart );
87 stringBuilderGlobalQuery.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
88
89
90 buildJoinQueryPart( stringBuilderGlobalQuery, listRecordPanelInitializerQueryPart, listRecordColumnQueryPart );
91 stringBuilderGlobalQuery.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
92
93
94 buildWhereQueryPart( stringBuilderGlobalQuery, listRecordFilterQueryPart );
95
96
97 buildGroupByQueryPart( stringBuilderGlobalQuery );
98 }
99
100 return stringBuilderGlobalQuery.toString( );
101 }
102
103
104
105
106
107
108
109
110
111
112
113 private static void buildSelectQueryPart( StringBuilder stringBuilderGlobalQuery,
114 List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart, List<IRecordColumnQueryPart> listRecordColumnQueryPart )
115 {
116 List<String> listSelectQueryParts = new ArrayList<>( );
117
118
119 List<String> listRecordPanelInitializerSelectQueryParts = RecordPanelInitializerQueryBuilder
120 .buildPanelInitializerSelectQueryParts( listRecordPanelInitializerQueryPart );
121 if ( !CollectionUtils.isEmpty( listRecordPanelInitializerSelectQueryParts ) )
122 {
123 listSelectQueryParts.addAll( listRecordPanelInitializerSelectQueryParts );
124 }
125
126
127 List<String> listRecordColumnSelectQueryParts = RecordColumnQueryBuilder.buildRecordColumnSelectQueryPart( listRecordColumnQueryPart );
128 if ( !CollectionUtils.isEmpty( listRecordColumnSelectQueryParts ) )
129 {
130 listSelectQueryParts.addAll( listRecordColumnSelectQueryParts );
131 }
132
133 stringBuilderGlobalQuery.append( buildQueryPart( listSelectQueryParts, RecordFilterQueryConstants.SELECT_KEYWORD ) );
134 }
135
136
137
138
139
140
141
142
143
144
145
146 private static void buildFromQueryPart( StringBuilder stringBuilderGlobalQuery, List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart,
147 List<IRecordColumnQueryPart> listRecordColumnQueryPart )
148 {
149 List<String> listFromQueryParts = new ArrayList<>( );
150
151
152 List<String> listRecordPanelInitializerFromQueryPart = RecordPanelInitializerQueryBuilder
153 .buildPanelInitializerFromQueryParts( listRecordPanelInitializerQueryPart );
154 if ( !CollectionUtils.isEmpty( listRecordPanelInitializerFromQueryPart ) )
155 {
156 listFromQueryParts.addAll( listRecordPanelInitializerFromQueryPart );
157 }
158
159
160 List<String> listRecordColumnFromQueryParts = RecordColumnQueryBuilder.buildRecordColumnFromQueryParts( listRecordColumnQueryPart );
161 if ( !CollectionUtils.isEmpty( listRecordColumnFromQueryParts ) )
162 {
163 listFromQueryParts.addAll( listRecordColumnFromQueryParts );
164 }
165
166 stringBuilderGlobalQuery.append( buildQueryPart( listFromQueryParts, RecordFilterQueryConstants.FROM_KEYWORD ) );
167 }
168
169
170
171
172
173
174
175
176
177
178
179 private static void buildJoinQueryPart( StringBuilder stringBuilderGlobalQuery, List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart,
180 List<IRecordColumnQueryPart> listRecordColumnQueryPart )
181 {
182 StringBuilder stringBuilderJoinQueryPart = new StringBuilder( );
183
184
185 if ( !CollectionUtils.isEmpty( listRecordPanelInitializerQueryPart ) )
186 {
187 RecordPanelInitializerQueryBuilder.buildRecordPanelInitializerJoinQueryParts( stringBuilderJoinQueryPart, listRecordPanelInitializerQueryPart );
188 }
189
190
191 if ( listRecordColumnQueryPart != null && !listRecordColumnQueryPart.isEmpty( ) )
192 {
193 RecordColumnQueryBuilder.buildRecordColumnJoinQueryParts( stringBuilderJoinQueryPart, listRecordColumnQueryPart );
194 }
195
196 stringBuilderGlobalQuery.append( stringBuilderJoinQueryPart.toString( ) );
197 }
198
199
200
201
202
203
204
205
206
207 private static void buildWhereQueryPart( StringBuilder stringBuilderGlobalQuery, List<IRecordFilterQueryPart> listRecordFilterQueryPart )
208 {
209 if ( listRecordFilterQueryPart != null && !listRecordFilterQueryPart.isEmpty( ) )
210 {
211 stringBuilderGlobalQuery.append( RecordFilterQueryConstants.WHERE_BASE_KEYWORD ).append( RecordFilterQueryConstants.SPACE_SEPARATOR );
212 manageFilterWhereQueryParts( stringBuilderGlobalQuery, listRecordFilterQueryPart );
213 }
214 }
215
216
217
218
219
220
221
222
223 private static void buildGroupByQueryPart( StringBuilder stringBuilderGlobalQuery )
224 {
225 stringBuilderGlobalQuery.append( RecordFilterQueryConstants.GROUP_BY_RECORD_ID_CLAUSE );
226 }
227
228
229
230
231
232
233
234
235
236
237 private static String buildQueryPart( List<String> listQueryPart, String strKeyWord )
238 {
239 StringBuilder stringBuilderFromQuery = new StringBuilder( strKeyWord );
240 stringBuilderFromQuery.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
241
242 Iterator<String> iteratorQueryPart = listQueryPart.iterator( );
243 while ( iteratorQueryPart.hasNext( ) )
244 {
245 stringBuilderFromQuery.append( iteratorQueryPart.next( ) );
246
247 if ( iteratorQueryPart.hasNext( ) )
248 {
249 stringBuilderFromQuery.append( RecordFilterQueryConstants.COMMA_SEPARATOR );
250 stringBuilderFromQuery.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
251 }
252 }
253
254 return stringBuilderFromQuery.toString( );
255 }
256
257
258
259
260
261
262
263
264
265 private static void manageFilterWhereQueryParts( StringBuilder stringBuilderWhereQueryPart, List<IRecordFilterQueryPart> listRecordFilterQueryPart )
266 {
267 Iterator<IRecordFilterQueryPart> iteratorRecordFilterQueryPart = listRecordFilterQueryPart.iterator( );
268 while ( iteratorRecordFilterQueryPart.hasNext( ) )
269 {
270 IRecordFilterQueryPart recordFilterQueryPart = iteratorRecordFilterQueryPart.next( );
271 addAndQueryClause( stringBuilderWhereQueryPart, recordFilterQueryPart.getRecordFilterQuery( ) );
272
273 if ( iteratorRecordFilterQueryPart.hasNext( ) )
274 {
275 stringBuilderWhereQueryPart.append( RecordFilterQueryConstants.SPACE_SEPARATOR );
276 }
277 }
278 }
279
280
281
282
283
284
285
286
287
288 private static void addAndQueryClause( StringBuilder stringBuilderQuery, String strQueryPart )
289 {
290 if ( stringBuilderQuery != null && StringUtils.isNotBlank( strQueryPart ) )
291 {
292 stringBuilderQuery.append( RecordFilterQueryConstants.AND_KEYWORD );
293 stringBuilderQuery.append( RecordFilterQueryConstants.AND_OPEN_CLAUSE );
294 stringBuilderQuery.append( strQueryPart );
295 stringBuilderQuery.append( RecordFilterQueryConstants.AND_CLOSE_CLAUSE );
296 }
297 }
298 }