Project

General

Profile

1
package eu.dnetlib.data.search.utils.cql;
2

    
3
import eu.dnetlib.data.search.utils.vocabulary.VocabularyManager;
4
import eu.dnetlib.domain.enabling.Vocabulary;
5
import org.apache.log4j.Logger;
6

    
7
import javax.servlet.http.HttpServletRequest;
8
import java.text.ParseException;
9
import java.text.SimpleDateFormat;
10
import java.util.Date;
11
import java.util.Locale;
12

    
13
/**
14
 * Created by kiatrop on 10/7/2014.
15
 */
16
public class ParameterQueryEnhancer {
17

    
18
    private static final Logger logger = Logger.getLogger(ParameterQueryEnhancer.class);
19

    
20
    /**
21
     * Enhance the given CQL query with FP7 specific index fields
22
     */
23
    public static void enhanceQueryWithFundingLevelParams(StringBuilder queryBuilder, HttpServletRequest request, VocabularyManager vocabularyManager, boolean isModelSygma) {
24
        logger.debug("enhance funding " + isModelSygma);
25
        
26
        String funder = request.getParameter("funder");
27
        String fundingStream = request.getParameter("fundingStream");
28
        String FP7scientificArea = request.getParameter("FP7scientificArea");
29

    
30
        if(isModelSygma) {
31
            if (funder != null) {
32
                if(!funder.equalsIgnoreCase("WT")) {
33
                    Vocabulary sygmaFundersVocabulary = vocabularyManager.getVocabulary("sygma_funders", Locale.ROOT);
34
                    addExactQueryTerm("relfundinglevel0_id", devocabularizedTerm(funder.toUpperCase(), sygmaFundersVocabulary), queryBuilder);
35
                } else {
36
                    Vocabulary funderVocabulary = vocabularyManager.getVocabulary("funders_simple", Locale.ROOT);
37
                    addExactQueryTerm("relfunderid", devocabularizedTerm(funder.toUpperCase(), funderVocabulary), queryBuilder);
38
                }
39
            }
40

    
41
            if (fundingStream != null && !fundingStream.trim().isEmpty()) {
42
                Vocabulary relfundinglevel1Vocabulary = vocabularyManager.getVocabulary("programmes_simple", Locale.ROOT);
43
                addVocabularizedQueryTerm("relfundinglevel1_id", fundingStream.toUpperCase(), relfundinglevel1Vocabulary, queryBuilder);
44
            }
45

    
46
            if (FP7scientificArea != null && !FP7scientificArea.trim().isEmpty()) {
47
                Vocabulary relfundinglevel2Vocabulary = vocabularyManager.getVocabulary("areas", Locale.ROOT);
48
                addVocabularizedQueryTerm("relfundinglevel2_id", FP7scientificArea, relfundinglevel2Vocabulary, queryBuilder);
49
            }
50

    
51
        } else {
52

    
53
            if (funder != null) {
54
                //Vocabulary funderVocabulary = vocabularyManager.getVocabulary("funders_simple", Locale.ROOT);
55
                addExactQueryTerm("relfundershortname", funder.toUpperCase(), queryBuilder);
56
            }
57

    
58
            if (fundingStream != null && !fundingStream.trim().isEmpty()) {
59
                if(fundingStream.equalsIgnoreCase("FP7") || fundingStream.equalsIgnoreCase("H2020")) {
60
                    addORQueryTermExact(new String[]{"relfundinglevel0_name", "relfundinglevel1_name", "relfundinglevel2_name"}, "\"" + fundingStream.toUpperCase() + "\"", queryBuilder);
61
                } else {
62
                    addORQueryTermExact(new String[]{"relfundinglevel0_name", "relfundinglevel1_name", "relfundinglevel2_name"}, "\"" + fundingStream + "\"", queryBuilder);
63
                }
64
            }
65

    
66
            if (FP7scientificArea != null && !FP7scientificArea.trim().isEmpty()) {
67
                //Vocabulary relfundinglevel2Vocabulary = vocabularyManager.getVocabulary("areas", Locale.ROOT);
68
                queryBuilder.append(" and (relfundershortname exact \"EC\")").append(" and (relfundinglevel2_name exact \"").append(FP7scientificArea).append("\")");
69
            }
70
        }
71

    
72
    }
73

    
74
    public static void enhanceProjectQueryWithFundingLevelParams(StringBuilder queryBuilder, HttpServletRequest request, VocabularyManager vocabularyManager) {
75
        String funder = request.getParameter("funder");
76
        String fundingStream = request.getParameter("fundingStream");
77
        String FP7scientificArea = request.getParameter("FP7scientificArea");
78

    
79
        if (funder != null) {
80
            //addExactQueryTerm("fundinglevel0_name", funder.toUpperCase(), queryBuilder);
81
            //Vocabulary funderVocabulary = vocabularyManager.getVocabulary("funders_simple", Locale.ROOT);
82
            addExactQueryTerm("fundershortname", funder.toUpperCase(), queryBuilder);
83
        }
84

    
85
        if (fundingStream != null && !fundingStream.trim().isEmpty()) {
86
            //addExactQueryTerm("fundinglevel1_name", fundingStream.toUpperCase(), queryBuilder);
87
            if(fundingStream.equalsIgnoreCase("FP7") || fundingStream.equalsIgnoreCase("H2020")) {
88
                addORQueryTermExact(new String[]{"fundinglevel0_name", "fundinglevel1_name", "fundinglevel2_name"}, "\"" + fundingStream.toUpperCase() + "\"", queryBuilder);
89
            } else {
90
                addORQueryTermExact(new String[]{"fundinglevel0_name", "fundinglevel1_name", "fundinglevel2_name"}, "\"" + fundingStream + "\"", queryBuilder);
91
            }
92
        }
93

    
94
        if (FP7scientificArea != null && !FP7scientificArea.trim().isEmpty()) {
95
            //Vocabulary relfundinglevel2Vocabulary = vocabularyManager.getVocabulary("areas", Locale.ROOT);
96
            queryBuilder.append("and (fundershortname exact \"EC\")").append(" and (fundinglevel2_name exact \"").append(FP7scientificArea).append("\")");
97
        }
98
    }
99

    
100
    public static void enhanceQueryWithFundingParams(StringBuilder queryBuilder, HttpServletRequest request) {
101
        String hasECFunding = request.getParameter("hasECFunding");
102
        String hasWTFunding = request.getParameter("hasWTFunding");
103

    
104
        addBooleanQueryTerm("contextid", hasECFunding, "EC", queryBuilder);
105
        addBooleanQueryTerm("contextid", hasWTFunding, "WT", queryBuilder);
106
    }
107

    
108
    public static void enhanceQueryWithProjectFundingParams(StringBuilder queryBuilder, HttpServletRequest request) {
109
        String hasECFunding = request.getParameter("hasECFunding");
110
        String hasWTFunding = request.getParameter("hasWTFunding");
111

    
112
        addBooleanQueryTerm("funderid", hasECFunding, "ec__________::EC", queryBuilder);
113
        addBooleanQueryTerm("funderid", hasWTFunding, "wt__________::WT", queryBuilder);
114

    
115
    }
116

    
117
    public static void enhanceQueryWithRelProjectParams(StringBuilder queryBuilder, HttpServletRequest request) {
118
        String hasProject = request.getParameter("hasProject");
119
        String projectID = request.getParameter("projectID");
120
        String FP7ProjectID = request.getParameter("FP7ProjectID");
121

    
122
        if (hasProject != null && !hasProject.isEmpty()) {
123
            if (hasProject.equals("true")) {
124
                addEqualQueryTerm("relprojectid", "*", queryBuilder);
125
            } else {
126
                addNotEqualQueryTerm("relprojectid", "*", queryBuilder);
127
            }
128
        }
129

    
130
        if (FP7ProjectID != null && !FP7ProjectID.trim().isEmpty()) {
131
            addExactQueryTerm("relprojectcode", FP7ProjectID, queryBuilder);
132
            addExactQueryTerm(" relfundinglevel0_id", "ec__________::EC::FP7", queryBuilder);
133
        }
134

    
135
        if (projectID != null && !projectID.trim().isEmpty()) {
136
            queryBuilder.append(" and (relprojectcode exact \"").append(projectID).append("\")");
137
        }
138
    }
139

    
140
    public static void enhanceQueryWithAccessRights(StringBuilder queryBuilder, HttpServletRequest request) {
141
        String oa = request.getParameter("OA");
142
        addBooleanQueryTerm("resultbestlicense", oa, "Open Access", queryBuilder);
143
    }
144

    
145
    public static void enhanceQueryWithDate(StringBuilder queryBuilder, HttpServletRequest request) throws IllegalArgumentException{
146
        String fromDateAccepted = request.getParameter("fromDateAccepted");
147
        String toDateAccepted = request.getParameter("toDateAccepted");
148
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
149
        simpleDateFormat.setLenient(false);
150

    
151
        if (toDateAccepted != null && !toDateAccepted.isEmpty() && (fromDateAccepted == null || fromDateAccepted.isEmpty()) ) {
152
            if(!checkDate(toDateAccepted, simpleDateFormat)){
153
                //logger.debug("Format is " + !checkDate(toDateAccepted, simpleDateFormat));
154
                throw new IllegalArgumentException("toDateAccepted date must be formatted as YYYY-MM-DD");
155
            }
156
            fromDateAccepted = "*";
157
        }
158

    
159
        if (fromDateAccepted != null && !fromDateAccepted.isEmpty() && (toDateAccepted == null || toDateAccepted.isEmpty()) ) {
160
            if (!checkDate(fromDateAccepted, simpleDateFormat)){
161
                //logger.debug("Format from is " + fromDateAccepted != null && !fromDateAccepted.isEmpty());
162
                throw new IllegalArgumentException("fromDateAccepted date must be formatted as YYYY-MM-DD");
163
            }
164
            toDateAccepted = simpleDateFormat.format(new Date());
165
        }
166

    
167
        if (toDateAccepted != null && !toDateAccepted.isEmpty() && fromDateAccepted != null && !fromDateAccepted.isEmpty()) {
168
            queryBuilder.append(" and (resultdateofacceptance within \"").append(fromDateAccepted).append(" ").append(toDateAccepted).append("\")");
169
        }
170
    }
171

    
172

    
173
    public static void enhanceQueryWithYearParams(StringBuilder queryBuilder, HttpServletRequest request) {
174
        String startYear = request.getParameter("startYear");
175
        String endYear = request.getParameter("endYear");
176

    
177
        int sYear = -1;
178
        if (startYear != null && !startYear.isEmpty()) {
179
            try {
180
                sYear = Integer.parseInt(startYear);
181

    
182
            } catch(NumberFormatException e) {
183
                throw new IllegalArgumentException("startYear parameter must be a numeric value.", e);
184
            }
185
        }
186

    
187
        int eYear = -1;
188
        if (endYear !=null && !endYear.isEmpty()) {
189
            try {
190
                eYear = Integer.parseInt(endYear);
191

    
192
            } catch(NumberFormatException e) {
193
                throw new IllegalArgumentException("endYear parameter must be a numeric value.",e);
194
            }
195
        }
196

    
197
        if (eYear != -1 && sYear != -1 && eYear < sYear) {
198
            throw new IllegalArgumentException("endYear must be greater than startYear.");
199
        }
200

    
201
        addExactQueryTerm("projectstartyear", startYear, queryBuilder);
202
        addExactQueryTerm("projectendyear", endYear, queryBuilder);
203
    }
204

    
205
    public static void enhanceQueryWithResultsSortParameters(StringBuilder queryBuilder, HttpServletRequest request) {
206
        String sortByParameter = request.getParameter("sortBy");
207

    
208
        if (sortByParameter != null) {
209
            String[] sortParams = sortByParameter.split(",");
210

    
211
            if (sortParams.length != 2) {
212
                throw new IllegalArgumentException("Invalid sort paremeter. 'sortBy' parameter format is <fieldName>[,ascending|,descending].");
213
            }
214

    
215
            String sortByField = sortParams[0];
216
            String order = sortParams[1];
217

    
218
            if (!checkPublicationSortParameterFields(sortByField)){
219
                throw new IllegalArgumentException("'" + sortByField + "' is not a sortable field.");
220
            }
221

    
222
            if (!checkOrder(order)) {
223
                throw new IllegalArgumentException("'" + order + "' is not a valid ordering. Please use one of {ascending, descending}");
224
            }
225

    
226
            addSortParameter(sortByField, order, queryBuilder);
227
        }
228
    }
229

    
230
    public static void enhanceQueryWithProjectSortParameters(StringBuilder queryBuilder, HttpServletRequest request) {
231
        String sortByParameter = request.getParameter("sortBy");
232

    
233
        if (sortByParameter != null) {
234
            String[] sortParams = sortByParameter.split(",");
235

    
236
            if (sortParams.length != 2) {
237
                throw new IllegalArgumentException("Invalid sort paremeter. 'sortBy' parameter format is <fieldName>[,ascending|,descending].");
238
            }
239

    
240
            String sortByField = sortParams[0];
241
            String order = sortParams[1];
242

    
243
            if (!checkProjectSortParameterFields(sortByField)){
244
                throw new IllegalArgumentException("'" + sortByField + "' is not a sortable field.");
245
            }
246

    
247
            if (!checkOrder(order)) {
248
                throw new IllegalArgumentException("'" + order + "' is not a valid ordering. Please use one of {ascending, descending}");
249
            }
250

    
251
            addSortParameter(sortByField, order, queryBuilder);
252
        }
253
    }
254

    
255
    private static boolean checkPublicationSortParameterFields(String sortField) {
256
        if ((sortField != null) && (!sortField.isEmpty()) &&
257
                sortField.matches("dateofcollection|resultstoragedate|resultembargoenddate|resultembargoendyear|" +
258
                "resulttypeid|resulttypename|resultlanguageid|resultlanguagename|resultbestlicense|" +
259
                "resultbestlicenseid|resultdateofacceptance|resultacceptanceyear")) {
260
            return true;
261
        }
262
        return false;
263
    }
264

    
265
    private static boolean checkProjectSortParameterFields(String sortField) {
266
        if ((sortField != null) && (!sortField.isEmpty()) &&
267
                sortField.matches("dateofcollection|projectstartdate|projectstartyear|" +
268
                        "projectenddate|projectendyear|projectcallidentifier|projectduration|" +
269
                        "projectecsc39|projectcontracttypeid|projectcontracttypename")) {
270
            return true;
271
        }
272
        return false;
273
    }
274

    
275
    private static boolean checkOrder(String order) {
276
        if (order.matches("ascending|descending")) {
277
            return true;
278
        }
279
        return false;
280
    }
281

    
282
    public static boolean checkDate(String date, SimpleDateFormat simpleDateFormat) {
283
        try {
284
            simpleDateFormat.parse(date);
285

    
286
        } catch (ParseException pe) {
287
            logger.warn("Wrong date format.", pe);
288
            return false;
289
        }
290

    
291
        return true;
292
    }
293

    
294
    /**
295
     * Enhance the given CQL query with OpenAIRE specific ids
296
     * @param queryBuilder The string builder of the query
297
     * @param request the HTTP request
298
     */
299
    public static void enhanceQueryWithOpenAIREIds(StringBuilder queryBuilder, HttpServletRequest request) {
300
        String[] openairePublicationIDs = request.getParameterValues("openairePublicationID");
301
        String[] openaireDatasetIDs = request.getParameterValues("openaireDatasetID");
302
        String[] openaireSoftwareIDs = request.getParameterValues("openaireSoftwareID");
303
        String[] openaireAuthorIDs = request.getParameterValues("openaireAuthorID");
304
        String[] openaireProviderIDs  = request.getParameterValues("openaireProviderID");
305
        String[] openaireProjectIDs  = request.getParameterValues("openaireProjectID");
306

    
307
        enhanceQueryWithIds("objidentifier", openairePublicationIDs, queryBuilder);
308
        enhanceQueryWithIds("objidentifier", openaireDatasetIDs, queryBuilder);
309
        enhanceQueryWithIds("objidentifier", openaireSoftwareIDs, queryBuilder);
310
        enhanceQueryWithIds("relpersonid", openaireAuthorIDs, queryBuilder);
311
        enhanceQueryWithIds("resulthostingdatasourceid", openaireProviderIDs, queryBuilder);
312
        enhanceQueryWithIds("relprojectid", openaireProjectIDs, queryBuilder);
313
    }
314

    
315
    public static void enhanceQueryWithMetadataKeywords(StringBuilder queryBuilder, HttpServletRequest request) {
316
        String keywords = request.getParameter("keywords");
317
        String title = request.getParameter("title");
318
        String author = request.getParameter("author");
319

    
320
        addMetadataQueryTerm(null, keywords, queryBuilder);
321
        addMetadataQueryTerm("resulttitle", title, queryBuilder);
322
        addMetadataQueryTerm("relperson", author, queryBuilder);
323
    }
324

    
325
    public static void enhanceQueryWithProjectMetadataKeywords(StringBuilder queryBuilder, HttpServletRequest request) {
326
        String keywords = request.getParameter("keywords");
327
        String acronym = request.getParameter("acronym");
328
        String name = request.getParameter("name");
329
        String grantID = request.getParameter("grantID");
330
        String callID = request.getParameter("callID");
331

    
332
        addMetadataQueryTerm(null, keywords, queryBuilder);
333
        addMetadataQueryTerm("projectacronym", acronym, queryBuilder);
334
        addEqualQueryTerm("projecttitle", name, queryBuilder);
335
        addExactQueryTerm("projectcode", grantID, queryBuilder);
336
        addExactQueryTerm("projectcallidentifier", callID, queryBuilder);
337
    }
338

    
339
    public static void enhanceQueryWithParticipantsInfoParams(StringBuilder queryBuilder, HttpServletRequest request) {
340
        String[] participantCountries = request.getParameterValues("participantCountries");
341
        String participantAcronyms = request.getParameter("participantAcronyms");
342
        String openaireParticipantID = request.getParameter("openaireParticipantID");
343

    
344

    
345
        if(participantCountries != null) {
346
            enhanceQueryWithCommaSeparatedValues("relorganizationcountryid", participantCountries, queryBuilder);
347
        }
348

    
349
        addORQueryTerm("relorganizationname", "relorganizationshortname", participantAcronyms, queryBuilder);
350

    
351
        if(openaireParticipantID != null) {
352
            addEqualQueryTerm("relorganizationid", openaireParticipantID, queryBuilder);
353
        }
354

    
355
    }
356

    
357
    public static void enhanceQueryWithSC39Params(StringBuilder queryBuilder, HttpServletRequest request) {
358
        String sc39 = request.getParameter("sc39");
359
        addBooleanQueryTerm("projectecsc39", sc39, queryBuilder);
360
    }
361

    
362

    
363

    
364

    
365
    public static void enhanceQueryWithDoi(StringBuilder queryBuilder, HttpServletRequest request) {
366
        String[] dois = request.getParameterValues("doi");
367

    
368
        if (dois != null && !(dois.length==0)) {
369
            queryBuilder.append(" and ");
370
            for (int i = 0; i < dois.length; i++) {
371
                String[] commaSeparated = dois[i].split(",");
372
                for (int j = 0; j < commaSeparated.length; j++) {
373
                    queryBuilder.append("(pidclassid exact \"doi\" and pid exact \"").append(commaSeparated[j]).append("\")");
374
                    if (i < dois.length-1 || j < commaSeparated.length-1 ) {
375
                        queryBuilder.append(" or ");
376
                    }
377
                }
378
            }
379
        }
380
    }
381

    
382
    public static void enhanceProjectQueryWithOpenAIREIds(StringBuilder queryBuilder, HttpServletRequest request) {
383
        String openaireProjectID  = request.getParameter("openaireProjectID");
384

    
385
        if (openaireProjectID != null) {
386
            addExactQueryTerm("objIdentifier", openaireProjectID, queryBuilder);
387
        }
388
    }
389

    
390
    public static void enhanceQueryWithIds(String idIndexFieldName, String[] ids, StringBuilder queryBuilder) {
391
        if (ids != null && !(ids.length==0)) {
392
            queryBuilder.append(" and ");
393
            for (int i = 0; i < ids.length; i++) {
394
                String[] commaSeparated = ids[i].split(",");
395
                for (int j = 0; j < commaSeparated.length; j++) {
396
                    queryBuilder.append("(" + idIndexFieldName + " exact \"").append(commaSeparated[j]).append("\")");
397
                    if (i < ids.length-1 || j < commaSeparated.length-1 ) {
398
                        queryBuilder.append(" or ");
399
                    }
400
                }
401
            }
402
        }
403
    }
404

    
405
    public static void enhanceQueryWithCommaSeparatedValues(String indexFieldName, String[] fieldValues, StringBuilder queryBuilder) {
406
        if (fieldValues != null && !(fieldValues.length==0)) {
407
            queryBuilder.append(" and ");
408
            for (int i = 0; i < fieldValues.length; i++) {
409
                String[] commaSeparated = fieldValues[i].split(",");
410
                for (int j = 0; j < commaSeparated.length; j++) {
411
                    queryBuilder.append("(").append(indexFieldName).append(" exact \"").append(commaSeparated[j].toUpperCase()).append("\")");
412
                    if (i < fieldValues.length-1 || j < commaSeparated.length-1 ) {
413
                        queryBuilder.append(" and ");
414
                    }
415
                }
416
            }
417
        }
418
    }
419

    
420
    public static void addMetadataQueryTerm(String indexFieldName, String fieldValue, StringBuilder queryBuilder) {
421
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
422
            if(indexFieldName != null) {
423
                for (String term: fieldValue.trim().split(" ")){
424
                    addEqualQueryTerm(indexFieldName, term, queryBuilder);
425
                }
426
            } else {
427
                queryBuilder.append(" and ( " );
428
                String[] keywords = fieldValue.trim().split(" ");
429
                for (int i = 0; i < keywords.length; i++) {
430
                    if (i == keywords.length -1) {
431
                        queryBuilder.append(keywords[i]);
432
                    } else {
433
                        queryBuilder.append(keywords[i]).append(" and ");
434
                    }
435
                }
436
                queryBuilder.append(")" );
437
            }
438
        }
439
    }
440

    
441
    public static void addORQueryTerm(String indexFieldName1, String indexFieldName2, String fieldValue, StringBuilder queryBuilder) {
442
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
443
            for (String term: fieldValue.trim().split(" ")) {
444
                queryBuilder.append(" and (" + indexFieldName1 + " = " + term + " or  " + indexFieldName2 + " = " + term + ")");
445
            }
446
        }
447
    }
448

    
449
    public static void addORQueryTerm(String[] indexFields, String fieldValue, StringBuilder queryBuilder) {
450
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
451
            queryBuilder.append(" and ( ");
452
            for (int i = 0; i < indexFields.length; i++) {
453
                for (String term : fieldValue.trim().split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1)) {
454
                    //logger.info("term: " + term);
455
                    queryBuilder.append(" (" + indexFields[i] + " = " + term + ")");
456
                }
457

    
458
                if (i == indexFields.length-1) {
459
                    queryBuilder.append(")");
460

    
461
                } else {
462
                    queryBuilder.append(" or ");
463
                }
464

    
465
            }
466
        }
467
    }
468

    
469
    public static void addORQueryTermExact(String[] indexFields, String fieldValue, StringBuilder queryBuilder) {
470
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
471
            queryBuilder.append(" and ( ");
472
            for (int i = 0; i < indexFields.length; i++) {
473
                for (String term : fieldValue.trim().split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1)) {
474
                    //logger.info("term: " + term);
475
                    queryBuilder.append(" (" + indexFields[i] + " exact " + term + ")");
476
                }
477

    
478
                if (i == indexFields.length-1) {
479
                    queryBuilder.append(")");
480

    
481
                } else {
482
                    queryBuilder.append(" or ");
483
                }
484

    
485
            }
486
        }
487
    }
488

    
489
    private static void addBooleanQueryTerm(String indexFieldName, String requestValue, StringBuilder queryBuilder) {
490
        if (requestValue != null && !requestValue.trim().isEmpty()) {
491
            addExactQueryTerm(indexFieldName, requestValue, queryBuilder);
492
        }
493
    }
494

    
495
    public static void addBooleanQueryTerm(String indexFieldName, String requestValue, String fieldValue, StringBuilder queryBuilder){
496
        if (requestValue != null && !requestValue.trim().isEmpty()) {
497
            if (requestValue.trim().equals("true")) {
498
                addExactQueryTerm(indexFieldName, fieldValue, queryBuilder);
499
            } else {
500
                addDifferentQueryTerm(indexFieldName, fieldValue, queryBuilder);
501
            }
502
        }
503
    }
504

    
505
    public static void addExactQueryTerm(String indexFieldName, String fieldValue, StringBuilder queryBuilder){
506
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
507
            CQLQueryBuilder.appendFieldQuotedTerm(queryBuilder, CQLQueryBuilder.Operator.AND, indexFieldName, CQLQueryBuilder.Operator.EXACT, fieldValue);
508
        }
509
    }
510

    
511
    public static void addEqualQueryTerm(String indexFieldName, String fieldValue, StringBuilder queryBuilder){
512
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
513
            if (fieldValue.startsWith("\"") && fieldValue.endsWith("\"")) {
514
                CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.AND, indexFieldName, CQLQueryBuilder.Operator.EQUAL, fieldValue);
515
            } else {
516
                CQLQueryBuilder.appendFieldQuotedTerm(queryBuilder, CQLQueryBuilder.Operator.AND, indexFieldName, CQLQueryBuilder.Operator.EQUAL, fieldValue);
517
            }
518
        }
519

    
520

    
521

    
522

    
523
    }
524

    
525
    public static void addNotEqualQueryTerm(String indexFieldName, String fieldValue, StringBuilder queryBuilder){
526
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
527
            CQLQueryBuilder.appendFieldQuotedTerm(queryBuilder, CQLQueryBuilder.Operator.NOT, indexFieldName, CQLQueryBuilder.Operator.EQUAL, fieldValue);
528
        }
529
    }
530

    
531
    public static void addDifferentQueryTerm(String indexFieldName, String fieldValue, StringBuilder queryBuilder){
532
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
533
            CQLQueryBuilder.appendFieldQuotedTerm(queryBuilder, CQLQueryBuilder.Operator.AND, indexFieldName, CQLQueryBuilder.Operator.NOTEQUAL, fieldValue);
534
        }
535
    }
536

    
537
    public static void addVocabularizedQueryTerm(String indexFieldName, String fieldValue, Vocabulary vocabulary, StringBuilder queryBuilder){
538
        if (fieldValue != null && !fieldValue.trim().isEmpty()) {
539
            addExactQueryTerm(indexFieldName, devocabularizedTerm(fieldValue, vocabulary), queryBuilder);
540
        }
541
    }
542

    
543
    private static void addSortParameter(String indexField, String order, StringBuilder queryBuilder) {
544
        queryBuilder.append(" sortBy " + indexField + "/sort." + order);
545
    }
546

    
547
    /**
548
     * Returns the encoding of the given value. If the encoding does not exist
549
     * in the given vocabulary the method returns the original value.|
550
     * @param value the value to be encoded
551
     * @param vocabulary the vocabulary containing the encoding - value mapping
552
     * @return the encoding of the given value taken from the given vocabulary
553
     */
554
    public static String devocabularizedTerm(String value, Vocabulary vocabulary) {
555
        if (vocabulary != null) {
556
            String term = vocabulary.getEncoding(value);
557
            if (term == null) {
558
                return value;
559
            }
560
            return term;
561
        }
562
        return value;
563
    }
564
}
(2-2/2)