MtasCQLQParser.java
5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package mtas.solr.search;
import java.io.BufferedReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import mtas.parser.cql.MtasCQLParser;
import mtas.search.spans.util.MtasSpanQuery;
import org.apache.lucene.search.Query;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.QParser;
import org.apache.solr.search.SyntaxError;
/**
* The Class MtasCQLQParser.
*/
public class MtasCQLQParser extends QParser {
/** The Constant MTAS_CQL_QPARSER_FIELD. */
public static final String MTAS_CQL_QPARSER_FIELD = "field";
/** The Constant MTAS_CQL_QPARSER_QUERY. */
public static final String MTAS_CQL_QPARSER_QUERY = "query";
/** The Constant MTAS_CQL_QPARSER_IGNORE. */
public static final String MTAS_CQL_QPARSER_IGNORE = "ignore";
/** The Constant MTAS_CQL_QPARSER_MAXIMUM_IGNORE_LENGTH. */
public static final String MTAS_CQL_QPARSER_MAXIMUM_IGNORE_LENGTH = "maximumIgnoreLength";
/** The Constant MTAS_CQL_QPARSER_PREFIX. */
public static final String MTAS_CQL_QPARSER_PREFIX = "prefix";
/** The field. */
String field = null;
/** The cql. */
String cql = null;
/** The ignore query. */
String ignoreQuery = null;
/** The maximum ignore length. */
Integer maximumIgnoreLength = null;
/** The default prefix. */
String defaultPrefix = null;
/** The variables. */
HashMap<String, String[]> variables = null;
/**
* Instantiates a new mtas CQLQ parser.
*
* @param qstr the qstr
* @param localParams the local params
* @param params the params
* @param req the req
*/
public MtasCQLQParser(String qstr, SolrParams localParams, SolrParams params,
SolrQueryRequest req) {
super(qstr, localParams, params, req);
if ((localParams.getParams(MTAS_CQL_QPARSER_FIELD) != null)
&& (localParams.getParams(MTAS_CQL_QPARSER_FIELD).length == 1)) {
field = localParams.getParams(MTAS_CQL_QPARSER_FIELD)[0];
}
if ((localParams.getParams(MTAS_CQL_QPARSER_QUERY) != null)
&& (localParams.getParams(MTAS_CQL_QPARSER_QUERY).length == 1)) {
cql = localParams.getParams(MTAS_CQL_QPARSER_QUERY)[0];
}
if ((localParams.getParams(MTAS_CQL_QPARSER_IGNORE) != null)
&& (localParams.getParams(MTAS_CQL_QPARSER_IGNORE).length == 1)) {
ignoreQuery = localParams.getParams(MTAS_CQL_QPARSER_IGNORE)[0];
}
if ((localParams.getParams(MTAS_CQL_QPARSER_MAXIMUM_IGNORE_LENGTH) != null)
&& (localParams
.getParams(MTAS_CQL_QPARSER_MAXIMUM_IGNORE_LENGTH).length == 1)) {
try {
maximumIgnoreLength = Integer.parseInt(
localParams.getParams(MTAS_CQL_QPARSER_MAXIMUM_IGNORE_LENGTH)[0]);
} catch (NumberFormatException e) {
maximumIgnoreLength = null;
}
}
if ((localParams.getParams(MTAS_CQL_QPARSER_PREFIX) != null)
&& (localParams.getParams(MTAS_CQL_QPARSER_PREFIX).length == 1)) {
defaultPrefix = localParams.getParams(MTAS_CQL_QPARSER_PREFIX)[0];
}
variables = new HashMap<>();
Iterator<String> it = localParams.getParameterNamesIterator();
while (it.hasNext()) {
String item = it.next();
if (item.startsWith("variable_")) {
if (localParams.getParams(item).length == 0
|| (localParams.getParams(item).length == 1
&& localParams.getParams(item)[0].isEmpty())) {
variables.put(item.substring(9), new String[0]);
} else {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < localParams.getParams(item).length; i++) {
String[] subList = localParams.getParams(item)[i]
.split("(?<!\\\\),");
for (int j = 0; j < subList.length; j++) {
list.add(subList[j].replace("\\,", ",").replace("\\\\", "\\"));
}
}
variables.put(item.substring(9),
list.toArray(new String[list.size()]));
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.apache.solr.search.QParser#parse()
*/
@Override
public Query parse() throws SyntaxError {
if (field == null) {
throw new SyntaxError("no " + MTAS_CQL_QPARSER_FIELD);
} else if (cql == null) {
throw new SyntaxError("no " + MTAS_CQL_QPARSER_QUERY);
} else {
MtasSpanQuery q = null;
MtasSpanQuery iq = null;
if (ignoreQuery != null) {
Reader ignoreReader = new BufferedReader(new StringReader(ignoreQuery));
MtasCQLParser ignoreParser = new MtasCQLParser(ignoreReader);
try {
iq = ignoreParser.parse(field, null, null, null, null);
} catch (mtas.parser.cql.TokenMgrError
| mtas.parser.cql.ParseException e) {
throw new SyntaxError(e);
}
}
Reader queryReader = new BufferedReader(new StringReader(cql));
MtasCQLParser queryParser = new MtasCQLParser(queryReader);
try {
q = queryParser.parse(field, defaultPrefix, variables, iq,
maximumIgnoreLength);
} catch (mtas.parser.cql.TokenMgrError
| mtas.parser.cql.ParseException e) {
throw new SyntaxError(e);
}
return q;
}
}
}