View Javadoc
1   /*
2    * Copyright (c) 2002-2018, Mairie de Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
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   * Test cases for the QueryBuilder methods
72   */
73  public class QueryBuilderTest extends LuteceTestCase
74  {
75      // Variables
76      List<IRecordPanelInitializerQueryPart> _listRecordPanelInitializerQueryPart;
77      List<IRecordColumnQueryPart> _listRecordColumnQueryPart;
78      List<IRecordFilterQueryPart> _listRecordFilterQueryPart;
79  
80      /**
81       * {@inheritDoc}
82       */
83      @Override
84      public void setUp( ) throws Exception
85      {
86          super.setUp( );
87  
88          // Reset the list in session
89          _listRecordPanelInitializerQueryPart = new ArrayList<>( );
90          _listRecordColumnQueryPart = new ArrayList<>( );
91          _listRecordFilterQueryPart = new ArrayList<>( );
92      }
93  
94      /**
95       * {@inheritDoc}
96       */
97      @Override
98      public void tearDown( ) throws Exception
99      {
100         super.tearDown( );
101     }
102 
103     /**
104      * Test for the {@link QueryBuilder#buildQuery(List, List)} method with only the RecordPanel. Without column the query built must be empty
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the columnDirectory without PanelInitializer
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and the columnDirectory
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and the columnDirectory without the RecordPanelRecordsInitializer
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and three columns: the Directory, WorkflowState and
158      * RecordDateCreation columns
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and the ColumnDirectory and its filter with the good name for the
178      * item
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and two columns and two filters
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and the ColumnDirectory and its filter with the item has no value.
253      * In this case the condition is not added to the global query
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and one ColumnEntryRecordField
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and three ColumnEntryRecordField
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      * Test the for {@link QueryBuilder#buildQuery(List, List)} method with the RecordPanel and two ColumnEntryRecordField and a Filter on one
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      * Build the query from the list of RecordColumnQueryPart and the list of RecordFilterQueryPart and make the test with the built query and the given
378      * expected query
379      * 
380      * @param strQueryToFind
381      *            The query to find
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      * Remove all the unnecessary spaces of a query
392      * 
393      * @param strQuery
394      *            The query to remove the spaces
395      * @return the given query without all unnecessary spaces
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 }