Project

General

Profile

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

    
3
import org.apache.log4j.Logger;
4

    
5
import java.util.ArrayList;
6
import java.util.List;
7
import java.util.regex.Matcher;
8
import java.util.regex.Pattern;
9

    
10
/**
11
 * Created by kiatrop on 28/9/2016.
12
 */
13
public class CQLQueryBuilder {
14

    
15
    private final static Logger logger = Logger.getLogger(CQLQueryBuilder.class);
16

    
17
    public enum Operator {
18
        AND("and"),
19
        OR("or"),
20
        NOT("not"),
21
        EQUAL("="),
22
        EXACT("exact"),
23
        NOTEQUAL("<>"),
24
        NONE("");
25

    
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
    public static void appendQuery(StringBuilder stringBuilder, String query) {
41
        if (query != null && !query.trim().isEmpty()) {
42
            appendSimpleTerm(stringBuilder, Operator.AND, query);
43
        }
44
    }
45
    public static void appendKeywords(StringBuilder stringBuilder, String keywords) {
46
        if (keywords != null && !keywords.trim().isEmpty()) {
47
            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
        }
64
    }
65

    
66
    public static void appendSimpleTerm(StringBuilder stringBuilder, Operator queryOperator, String value) {
67
        if (!stringBuilder.toString().isEmpty()) {
68
            stringBuilder.append(' ').append(queryOperator).append(" (").append(value).append(')');
69
        } else {
70
            stringBuilder.append("(").append(value).append(')');
71
        }
72
    }
73

    
74
    public static void appendSimpleQuotedTerm(StringBuilder stringBuilder, Operator queryOperator, String value) {
75
        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
    }
81

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

    
87
    public static void appendFieldQuotedTerm(StringBuilder stringBuilder, Operator queryOperator, String indexFieldName, Operator termOperator, String fieldValue) {
88
            stringBuilder.append(' ').append(queryOperator).
89
                    append(" (").append(indexFieldName).append(' ').append(Operator.EXACT).append(" \"").append(fieldValue).append("\")");
90
    }
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
        }
96
    }
97

    
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

    
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
}
(1-1/2)