Project

General

Profile

1 44742 katerina.i
package eu.dnetlib.data.search.utils.cql;
2 43931 katerina.i
3 46175 katerina.i
import org.apache.log4j.Logger;
4
5
import java.util.ArrayList;
6 43931 katerina.i
import java.util.List;
7 46175 katerina.i
import java.util.regex.Matcher;
8
import java.util.regex.Pattern;
9 43931 katerina.i
10
/**
11
 * Created by kiatrop on 28/9/2016.
12
 */
13 44742 katerina.i
public class CQLQueryBuilder {
14 43931 katerina.i
15 46175 katerina.i
    private final static Logger logger = Logger.getLogger(CQLQueryBuilder.class);
16
17 43931 katerina.i
    public enum Operator {
18
        AND("and"),
19
        OR("or"),
20
        NOT("not"),
21 44742 katerina.i
        EQUAL("="),
22
        EXACT("exact"),
23 46175 katerina.i
        NOTEQUAL("<>"),
24
        NONE("");
25 43931 katerina.i
26
        private String value;
27
        Operator(String value) {
28
            this.value = value;
29
        }
30
        private String getValue() {
31
            return value;
32
        }
33
34
        @Override
35
        public String toString() {
36
            return this.getValue();
37
        }
38
    }
39
40 46175 katerina.i
    public static void appendQuery(StringBuilder stringBuilder, String query) {
41
        if (query != null && !query.trim().isEmpty()) {
42
            appendSimpleTerm(stringBuilder, Operator.AND, query);
43
        }
44
    }
45 44663 katerina.i
    public static void appendKeywords(StringBuilder stringBuilder, String keywords) {
46
        if (keywords != null && !keywords.trim().isEmpty()) {
47 46175 katerina.i
            List<String> matchList = new ArrayList<String>();
48
49
            Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
50
            Matcher regexMatcher = regex.matcher(keywords);
51
            while (regexMatcher.find()) {
52
                matchList.add(regexMatcher.group());
53
            }
54
55
            for (String keyword : matchList) {
56
                if (keyword.endsWith("\"") && keyword.startsWith("\"")) {
57
                    appendSimpleQuotedTerm(stringBuilder, Operator.AND, keyword);
58
59
                } else {
60
                    appendSimpleTerm(stringBuilder, CQLQueryBuilder.Operator.AND, keyword.replaceAll("\"",""));
61
                }
62
            }
63 44663 katerina.i
        }
64
    }
65
66 44742 katerina.i
    public static void appendSimpleTerm(StringBuilder stringBuilder, Operator queryOperator, String value) {
67 46175 katerina.i
        if (!stringBuilder.toString().isEmpty()) {
68
            stringBuilder.append(' ').append(queryOperator).append(" (").append(value).append(')');
69
        } else {
70
            stringBuilder.append("(").append(value).append(')');
71
        }
72 43931 katerina.i
    }
73
74 44742 katerina.i
    public static void appendSimpleQuotedTerm(StringBuilder stringBuilder, Operator queryOperator, String value) {
75 46175 katerina.i
        if (!stringBuilder.toString().isEmpty()) {
76
            stringBuilder.append(' ').append(queryOperator).append(" (__all exact ").append(value).append(")");
77
        } else {
78
            stringBuilder.append(" (__all exact ").append(value).append(")");
79
        }
80 43931 katerina.i
    }
81
82 44742 katerina.i
    public static void appendFieldTerm(StringBuilder stringBuilder, Operator queryOperator, String indexFieldName, Operator termOperator, String fieldValue) {
83
            stringBuilder.append(' ').append(queryOperator).
84
                    append(" (").append(indexFieldName).append(' ').append(termOperator).append(' ').append(fieldValue).append(")");
85 43931 katerina.i
    }
86
87 44742 katerina.i
    public static void appendFieldQuotedTerm(StringBuilder stringBuilder, Operator queryOperator, String indexFieldName, Operator termOperator, String fieldValue) {
88
            stringBuilder.append(' ').append(queryOperator).
89 58050 katerina.i
                    append(" (").append(indexFieldName).append(' ').append(Operator.EXACT).append(" \"").append(fieldValue).append("\")");
90 44742 katerina.i
    }
91
92
    public static void appendFieldTerms(StringBuilder stringBuilder, Operator queryOperator, String indexFieldName, Operator termOperator, List<String> fieldValues) {
93
        for (String fieldValue: fieldValues) {
94
            appendFieldTerm(stringBuilder, queryOperator, indexFieldName, termOperator, fieldValue);
95 43931 katerina.i
        }
96
    }
97 44742 katerina.i
98
    public static void appendFieldQuotedTerms(StringBuilder stringBuilder, Operator queryOperator, String indexFieldName, Operator termOperator, List<String> fieldValues) {
99
        for (String fieldValue: fieldValues) {
100
            appendFieldQuotedTerm(stringBuilder, queryOperator, indexFieldName, termOperator, fieldValue);
101
        }
102
    }
103 46175 katerina.i
104
    public static void appendEnhancedKeywords(StringBuilder stringBuilder, String keywords) {
105
        if (keywords != null && !keywords.trim().isEmpty()) {
106
            appendSimpleTerm(stringBuilder, CQLQueryBuilder.Operator.AND, keywords);
107
        }
108
    }
109
110 43931 katerina.i
}