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
|
}
|