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("resultbestaccessright", 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|resultbestaccessright|" +
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[] openaireProviderIDs  = request.getParameterValues("openaireProviderID");
304
        String[] openaireProjectIDs  = request.getParameterValues("openaireProjectID");
305

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

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

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

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

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

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

    
342

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

    
347
        addORQueryTerm("relorganizationname", "relorganizationshortname", participantAcronyms, queryBuilder);
348

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

    
353
    }
354

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

    
360

    
361

    
362

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

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

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

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

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

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

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

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

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

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

    
459
                } else {
460
                    queryBuilder.append(" or ");
461
                }
462

    
463
            }
464
        }
465
    }
466

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

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

    
479
                } else {
480
                    queryBuilder.append(" or ");
481
                }
482

    
483
            }
484
        }
485
    }
486

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

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

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

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

    
518

    
519

    
520

    
521
    }
522

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

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

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

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

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