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 static org.hamcrest.CoreMatchers.is;
37 import static org.hamcrest.CoreMatchers.not;
38 import static org.hamcrest.CoreMatchers.nullValue;
39 import static org.junit.Assert.assertThat;
40
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.LinkedHashMap;
44 import java.util.List;
45 import java.util.Map;
46
47 import org.apache.commons.lang3.StringUtils;
48 import org.apache.commons.lang3.math.NumberUtils;
49
50 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.IRecordColumn;
51 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.impl.RecordColumnEntry;
52 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.IRecordColumnQueryPart;
53 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.impl.RecordColumnEntryQueryPart;
54 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.RecordColumnDirectoryQueryPartMock;
55 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.RecordColumnRecordDateCreationQueryPartMock;
56 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.RecordColumnWorkflowStateQueryPartMock;
57 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.RecordPanelDirectoryInitializerQueryPartMock;
58 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.mock.RecordPanelRecordsInitializerQueryPartMock;
59 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.IRecordFilterQueryPart;
60 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.RecordFilterDirectoryQueryPartMock;
61 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.RecordFilterWorkflowStateQueryPartMock;
62 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.impl.RecordFilterDirectoryQueryPart;
63 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.impl.RecordFilterEntryQueryPart;
64 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.impl.RecordFilterWorkflowStateQueryPart;
65 import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.querypart.IRecordPanelInitializerQueryPart;
66 import fr.paris.lutece.plugins.directory.modules.multiview.util.RecordDirectoryNameConstants;
67 import fr.paris.lutece.plugins.directory.modules.multiview.util.RecordWorkflowStateNameConstants;
68 import fr.paris.lutece.test.LuteceTestCase;
69
70
71
72
73 public class QueryBuilderTest extends LuteceTestCase
74 {
75
76 List<IRecordPanelInitializerQueryPart> _listRecordPanelInitializerQueryPart;
77 List<IRecordColumnQueryPart> _listRecordColumnQueryPart;
78 List<IRecordFilterQueryPart> _listRecordFilterQueryPart;
79
80
81
82
83 @Override
84 public void setUp( ) throws Exception
85 {
86 super.setUp( );
87
88
89 _listRecordPanelInitializerQueryPart = new ArrayList<>( );
90 _listRecordColumnQueryPart = new ArrayList<>( );
91 _listRecordFilterQueryPart = new ArrayList<>( );
92 }
93
94
95
96
97 @Override
98 public void tearDown( ) throws Exception
99 {
100 super.tearDown( );
101 }
102
103
104
105
106 public void testBuildQueryWithRecordPanelWithoutColumn( )
107 {
108 String strBasicQueryToFind = StringUtils.EMPTY;
109
110 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
111
112 checkQueryToBuilt( strBasicQueryToFind );
113 }
114
115
116
117
118 public void testBuildQueryWithColumnWithoutRecordPanelInitializer( )
119 {
120 String strBasicQueryToFind = StringUtils.EMPTY;
121
122 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
123
124 checkQueryToBuilt( strBasicQueryToFind );
125 }
126
127
128
129
130 public void testBuildQueryWithColumnDirectory( )
131 {
132 String strBasicQueryToFind = "SELECT id_directory, id_record, id_directory, title "
133 + "FROM directory_directory AS directory INNER JOIN directory_record AS record ON record.id_directory = " + "directory.id_directory";
134
135 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
136
137 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
138
139 checkQueryToBuilt( strBasicQueryToFind );
140 }
141
142
143
144
145 public void testBuildQueryWithColumnDirectoryWithoutDirectoryInitializer( )
146 {
147 String strBasicQueryToFind = "SELECT id_directory, title FROM";
148
149 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
150
151 _listRecordPanelInitializerQueryPart.add( new RecordPanelRecordsInitializerQueryPartMock( ) );
152
153 checkQueryToBuilt( strBasicQueryToFind );
154 }
155
156
157
158
159
160 public void testBuildQueryWithColumnDirectoryWorkflowStateDate( )
161 {
162 String strQueryToFind = "SELECT id_directory, id_record, id_directory, title, " + "workflow_state_name, record_date_creation FROM directory_directory "
163 + "AS directory INNER JOIN directory_record AS record ON record.id_directory = directory.id_directory LEFT JOIN "
164 + "workflow_resource_workflow AS wf_resource_workflow ON wf_resource_workflow.id_resource = record.id_record LEFT JOIN "
165 + "workflow_state AS ws_workflow_state ON ws_workflow_state.id_state = wf_resource_workflow.id_state";
166
167 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
168 _listRecordColumnQueryPart.add( new RecordColumnWorkflowStateQueryPartMock( ) );
169 _listRecordColumnQueryPart.add( new RecordColumnRecordDateCreationQueryPartMock( ) );
170
171 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
172
173 checkQueryToBuilt( strQueryToFind );
174 }
175
176
177
178
179
180 public void testBuildQueryWithDirectoryColumnWithFilter( )
181 {
182 String strQueryToFind = "SELECT id_directory, id_record, id_directory, title "
183 + "FROM directory_directory AS directory INNER JOIN directory_record AS record ON record.id_directory = directory.id_directory "
184 + "WHERE 1=1 AND ( directory.id_directory = ? )";
185
186 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
187
188 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
189
190 RecordParameters recordFilterItemDirectory = new RecordParameters( );
191 Map<String, Object> mapFilterNameValues = new LinkedHashMap<>( );
192 mapFilterNameValues.put( RecordDirectoryNameConstants.FILTER_ID_DIRECTORY, 4 );
193 recordFilterItemDirectory.setRecordParametersMap( mapFilterNameValues );
194
195 RecordFilterDirectoryQueryPart recordFilterDirectoryQueryPart = new RecordFilterDirectoryQueryPartMock( );
196 recordFilterDirectoryQueryPart.buildRecordFilterQuery( recordFilterItemDirectory );
197 _listRecordFilterQueryPart.add( recordFilterDirectoryQueryPart );
198
199 checkQueryToBuilt( strQueryToFind );
200
201 List<String> listParametersValue = recordFilterItemDirectory.getListUsedParametersValue( );
202 assertThat( listParametersValue.size( ), is( NumberUtils.INTEGER_ONE ) );
203 assertThat( listParametersValue.get( NumberUtils.INTEGER_ZERO ), is( "4" ) );
204 }
205
206
207
208
209 public void testBuildQueryWithTwoColumnsAndTwoFilters( )
210 {
211 String strQueryToFind = "SELECT id_directory, id_record, id_directory, title, workflow_state_name FROM directory_directory AS "
212 + "directory INNER JOIN directory_record AS record ON record.id_directory = "
213 + "directory.id_directory LEFT JOIN workflow_resource_workflow AS wf_resource_workflow ON wf_resource_workflow.id_resource = record.id_record "
214 + "LEFT JOIN workflow_state AS ws_workflow_state ON ws_workflow_state.id_state = wf_resource_workflow.id_state WHERE 1=1 AND "
215 + "( directory.id_directory = ? ) AND ( ws_workflow_state.id_state = ? )";
216
217 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
218 _listRecordColumnQueryPart.add( new RecordColumnWorkflowStateQueryPartMock( ) );
219
220 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
221
222 RecordParameters recordFilterItemDirectory = new RecordParameters( );
223 Map<String, Object> mapFilterNameValuesDirectory = new LinkedHashMap<>( );
224 mapFilterNameValuesDirectory.put( RecordDirectoryNameConstants.FILTER_ID_DIRECTORY, 4 );
225 recordFilterItemDirectory.setRecordParametersMap( mapFilterNameValuesDirectory );
226
227 RecordFilterDirectoryQueryPart recordFilterDirectoryQueryPart = new RecordFilterDirectoryQueryPartMock( );
228 recordFilterDirectoryQueryPart.buildRecordFilterQuery( recordFilterItemDirectory );
229 _listRecordFilterQueryPart.add( recordFilterDirectoryQueryPart );
230
231 RecordParameters recordFilterItemWorkflowState = new RecordParameters( );
232 Map<String, Object> mapFilterNameValuesWorkflowState = new LinkedHashMap<>( );
233 mapFilterNameValuesWorkflowState.put( RecordWorkflowStateNameConstants.FILTER_ID_WORKFLOW_STATE, 12 );
234 recordFilterItemWorkflowState.setRecordParametersMap( mapFilterNameValuesWorkflowState );
235
236 RecordFilterWorkflowStateQueryPart recordFilterWorkflowStateQueryPart = new RecordFilterWorkflowStateQueryPartMock( );
237 recordFilterWorkflowStateQueryPart.buildRecordFilterQuery( recordFilterItemWorkflowState );
238 _listRecordFilterQueryPart.add( recordFilterWorkflowStateQueryPart );
239
240 checkQueryToBuilt( strQueryToFind );
241
242 List<String> listUsedParametersDirectoryValue = recordFilterItemDirectory.getListUsedParametersValue( );
243 assertThat( listUsedParametersDirectoryValue.size( ), is( NumberUtils.INTEGER_ONE ) );
244 assertThat( listUsedParametersDirectoryValue.get( NumberUtils.INTEGER_ZERO ), is( "4" ) );
245
246 List<String> listUsedParametersWorkflowValue = recordFilterItemWorkflowState.getListUsedParametersValue( );
247 assertThat( listUsedParametersWorkflowValue.size( ), is( NumberUtils.INTEGER_ONE ) );
248 assertThat( listUsedParametersWorkflowValue.get( NumberUtils.INTEGER_ZERO ), is( "12" ) );
249 }
250
251
252
253
254
255 public void testBuildQueryWithDirectoryColumnWithFilterWithoutName( )
256 {
257 String strQueryToFind = "SELECT id_directory, id_record, id_directory, title "
258 + "FROM directory_directory AS directory INNER JOIN directory_record AS record ON record.id_directory = directory.id_directory " + "WHERE 1=1";
259
260 _listRecordColumnQueryPart.add( new RecordColumnDirectoryQueryPartMock( ) );
261
262 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
263
264 RecordFilterDirectoryQueryPart recordFilterDirectoryQueryPart = new RecordFilterDirectoryQueryPartMock( );
265 recordFilterDirectoryQueryPart.buildRecordFilterQuery( new RecordParameters( ) );
266 _listRecordFilterQueryPart.add( recordFilterDirectoryQueryPart );
267
268 checkQueryToBuilt( strQueryToFind );
269 }
270
271
272
273
274 public void testBuildQueryWithOneColumnEntryRecordField( )
275 {
276 String strQueryToFind = "SELECT id_directory, id_record, column_3.column_3_value FROM directory_directory AS "
277 + "directory INNER JOIN directory_record AS record ON record.id_directory = directory.id_directory LEFT JOIN ( SELECT "
278 + "record_3.id_record AS id_record_3, record_field_3.record_field_value AS column_3_value FROM directory_record_field AS "
279 + "record_field_3 INNER JOIN directory_record AS record_3 ON record_field_3.id_record = record_3.id_record INNER JOIN "
280 + "directory_entry AS entry_3 ON entry_3.id_entry = record_field_3.id_entry WHERE entry_3.title IN ( 'Nom', 'Prénom' ) ) "
281 + "AS column_3 ON column_3.id_record_3 = record.id_record";
282
283 IRecordColumn recordColumnEntryRecordField = new RecordColumnEntry( 3, "Colonne 3", Arrays.asList( "Nom", "Prénom" ) );
284 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPart = new RecordColumnEntryRecordFieldQueryPartMock( 3 );
285 recordColumnEntryRecordFieldQueryPart.setRecordColumn( recordColumnEntryRecordField );
286 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPart );
287
288 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
289
290 checkQueryToBuilt( strQueryToFind );
291 }
292
293
294
295
296 public void testBuildQueryWithThreeColumnEntryRecordFields( )
297 {
298 String strQueryToFind = "SELECT id_directory, id_record, column_3.column_3_value, column_5.column_5_value, "
299 + "column_7.column_7_value FROM directory_directory AS directory INNER JOIN directory_record AS record ON record.id_directory "
300 + "= directory.id_directory LEFT JOIN ( SELECT record_3.id_record AS id_record_3, record_field_3.record_field_value AS "
301 + "column_3_value FROM directory_record_field AS record_field_3 INNER JOIN directory_record AS record_3 ON record_field_3."
302 + "id_record = record_3.id_record INNER JOIN directory_entry AS entry_3 ON entry_3.id_entry = record_field_3.id_entry WHERE "
303 + "entry_3.title IN ( 'Nom', 'Prénom' ) ) AS column_3 ON column_3.id_record_3 = record.id_record LEFT JOIN ( SELECT record_5."
304 + "id_record AS id_record_5, record_field_5.record_field_value AS column_5_value FROM directory_record_field AS record_field_5 "
305 + "INNER JOIN directory_record AS record_5 ON record_field_5.id_record = record_5.id_record INNER JOIN directory_entry AS entry_5 "
306 + "ON entry_5.id_entry = record_field_5.id_entry WHERE entry_5.title IN ( 'Date de naissance' ) ) AS column_5 ON "
307 + "column_5.id_record_5 = record.id_record LEFT JOIN ( SELECT record_7.id_record AS id_record_7, record_field_7.record_field_value "
308 + "AS column_7_value FROM directory_record_field AS record_field_7 INNER JOIN directory_record AS record_7 ON record_field_7."
309 + "id_record = record_7.id_record INNER JOIN directory_entry AS entry_7 ON entry_7.id_entry = record_field_7.id_entry WHERE "
310 + "entry_7.title IN ( 'Adresse', 'Téléphone' ) ) AS column_7 ON column_7.id_record_7 = record.id_record";
311
312 IRecordColumn recordColumnEntryRecordFieldOne = new RecordColumnEntry( 3, "Colonne 3", Arrays.asList( "Nom", "Prénom" ) );
313 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPartOne = new RecordColumnEntryRecordFieldQueryPartMock( 3 );
314 recordColumnEntryRecordFieldQueryPartOne.setRecordColumn( recordColumnEntryRecordFieldOne );
315 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPartOne );
316
317 IRecordColumn recordColumnEntryRecordFieldTwo = new RecordColumnEntry( 5, "Colonne 5", Arrays.asList( "Date de naissance" ) );
318 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPartTwo = new RecordColumnEntryRecordFieldQueryPartMock( 5 );
319 recordColumnEntryRecordFieldQueryPartTwo.setRecordColumn( recordColumnEntryRecordFieldTwo );
320 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPartTwo );
321
322 IRecordColumn recordColumnEntryRecordFieldThree = new RecordColumnEntry( 7, "Colonne 7", Arrays.asList( "Adresse", "Téléphone" ) );
323 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPartThree = new RecordColumnEntryRecordFieldQueryPartMock( 7 );
324 recordColumnEntryRecordFieldQueryPartThree.setRecordColumn( recordColumnEntryRecordFieldThree );
325 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPartThree );
326
327 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
328
329 checkQueryToBuilt( strQueryToFind );
330 }
331
332
333
334
335 public void testBuildQueryWithColumnEntryRecordFieldsWithFilter( )
336 {
337 String strQueryToFind = "SELECT id_directory, id_record, column_3.column_3_value, column_5.column_5_value FROM "
338 + "directory_directory AS directory INNER JOIN directory_record AS record ON record.id_directory = directory.id_directory "
339 + "LEFT JOIN ( SELECT record_3.id_record AS id_record_3, record_field_3.record_field_value AS column_3_value FROM "
340 + "directory_record_field AS record_field_3 INNER JOIN directory_record AS record_3 ON record_field_3.id_record = "
341 + "record_3.id_record INNER JOIN directory_entry AS entry_3 ON entry_3.id_entry = record_field_3.id_entry WHERE entry_3.title "
342 + "IN ( 'Nom', 'Prénom' ) ) AS column_3 ON column_3.id_record_3 = record.id_record LEFT JOIN ( SELECT record_5.id_record "
343 + "AS id_record_5, record_field_5.record_field_value AS column_5_value FROM directory_record_field AS record_field_5 INNER "
344 + "JOIN directory_record AS record_5 ON record_field_5.id_record = record_5.id_record INNER JOIN directory_entry AS entry_5 "
345 + "ON entry_5.id_entry = record_field_5.id_entry WHERE entry_5.title IN ( 'Date de naissance' ) ) AS column_5 ON "
346 + "column_5.id_record_5 = record.id_record WHERE 1=1 AND ( column_5.column_5_value = ? )";
347
348 IRecordColumn recordColumnEntryRecordFieldOne = new RecordColumnEntry( 3, "Colonne 3", Arrays.asList( "Nom", "Prénom" ) );
349 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPartOne = new RecordColumnEntryRecordFieldQueryPartMock( 3 );
350 recordColumnEntryRecordFieldQueryPartOne.setRecordColumn( recordColumnEntryRecordFieldOne );
351 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPartOne );
352
353 IRecordColumn recordColumnEntryRecordFieldTwo = new RecordColumnEntry( 5, "Colonne 5", Arrays.asList( "Date de naissance" ) );
354 RecordColumnEntryQueryPart recordColumnEntryRecordFieldQueryPartTwo = new RecordColumnEntryRecordFieldQueryPartMock( 5 );
355 recordColumnEntryRecordFieldQueryPartTwo.setRecordColumn( recordColumnEntryRecordFieldTwo );
356 _listRecordColumnQueryPart.add( recordColumnEntryRecordFieldQueryPartTwo );
357
358 _listRecordPanelInitializerQueryPart.add( new RecordPanelDirectoryInitializerQueryPartMock( ) );
359
360 RecordParameters recordFilterItemEntryRecordField = new RecordParameters( );
361 Map<String, Object> mapFilterNameValues = new LinkedHashMap<>( );
362 mapFilterNameValues.put( "column_5", "test colonne 5" );
363 recordFilterItemEntryRecordField.setRecordParametersMap( mapFilterNameValues );
364
365 IRecordFilterQueryPart recordFilterEntryRecordFieldQueryPart = new RecordFilterEntryQueryPart( );
366 recordFilterEntryRecordFieldQueryPart.buildRecordFilterQuery( recordFilterItemEntryRecordField );
367 _listRecordFilterQueryPart.add( recordFilterEntryRecordFieldQueryPart );
368
369 checkQueryToBuilt( strQueryToFind );
370
371 List<String> listUsedParametersValue = recordFilterItemEntryRecordField.getListUsedParametersValue( );
372 assertThat( listUsedParametersValue.size( ), is( NumberUtils.INTEGER_ONE ) );
373 assertThat( listUsedParametersValue.get( NumberUtils.INTEGER_ZERO ), is( "test colonne 5" ) );
374 }
375
376
377
378
379
380
381
382
383 private void checkQueryToBuilt( String strQueryToFind )
384 {
385 String strQueryBuilt = QueryBuilder.buildQuery( _listRecordPanelInitializerQueryPart, _listRecordColumnQueryPart, _listRecordFilterQueryPart );
386 assertThat( strQueryBuilt, is( not( nullValue( ) ) ) );
387 assertThat( removeQuerySpaces( strQueryBuilt ), is( strQueryToFind ) );
388 }
389
390
391
392
393
394
395
396
397 private String removeQuerySpaces( String strQuery )
398 {
399 String strQueryResult = StringUtils.EMPTY;
400
401 if ( StringUtils.isNotBlank( strQuery ) )
402 {
403 strQueryResult = strQuery.trim( ).replaceAll( " +", " " );
404 strQueryResult = strQueryResult.replaceAll( " +,", "," );
405 }
406
407 return strQueryResult;
408 }
409 }