1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.entity;
17
18 import static org.codelibs.core.stream.StreamUtil.stream;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.function.Consumer;
28
29 import org.codelibs.core.lang.StringUtil;
30 import org.codelibs.fess.Constants;
31 import org.codelibs.fess.util.ComponentUtil;
32 import org.lastaflute.web.util.LaRequestUtil;
33 import org.opensearch.index.query.BoolQueryBuilder;
34 import org.opensearch.index.query.MatchAllQueryBuilder;
35 import org.opensearch.index.query.QueryBuilder;
36 import org.opensearch.index.query.QueryBuilders;
37 import org.opensearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
38 import org.opensearch.search.sort.SortBuilder;
39
40
41
42
43
44 public class QueryContext {
45
46
47 protected static final String ALLINURL_FIELD_PREFIX = "allinurl:";
48
49
50 protected static final String ALLINTITLE_FIELD_PREFIX = "allintitle:";
51
52
53 protected QueryBuilder queryBuilder;
54
55
56 protected final List<SortBuilder<?>> sortBuilderList = new ArrayList<>();
57
58
59 protected String queryString;
60
61
62 protected Set<String> highlightedQuerySet = null;
63
64
65 protected Map<String, List<String>> fieldLogMap = null;
66
67
68 protected boolean disableRoleQuery = false;
69
70
71 protected String defaultField = null;
72
73
74
75
76
77
78
79
80 @SuppressWarnings("unchecked")
81 public QueryContext(final String queryString, final boolean isQuery) {
82 if (queryString != null) {
83 if (queryString.startsWith(ALLINURL_FIELD_PREFIX)) {
84 defaultField = ComponentUtil.getFessConfig().getIndexFieldUrl();
85 this.queryString = queryString.substring(ALLINURL_FIELD_PREFIX.length());
86 } else if (queryString.startsWith(ALLINTITLE_FIELD_PREFIX)) {
87 defaultField = ComponentUtil.getFessConfig().getIndexFieldTitle();
88 this.queryString = queryString.substring(ALLINTITLE_FIELD_PREFIX.length());
89 } else {
90 this.queryString = queryString;
91 }
92 } else {
93 this.queryString = queryString;
94 }
95 if (StringUtil.isBlank(this.queryString)) {
96 this.queryString = "*";
97 }
98 if (isQuery) {
99 LaRequestUtil.getOptionalRequest().ifPresent(request -> {
100 highlightedQuerySet = new HashSet<>();
101 request.setAttribute(Constants.HIGHLIGHT_QUERIES, highlightedQuerySet);
102 fieldLogMap = (Map<String, List<String>>) request.getAttribute(Constants.FIELD_LOGS);
103 if (fieldLogMap == null) {
104 fieldLogMap = new HashMap<>();
105 request.setAttribute(Constants.FIELD_LOGS, fieldLogMap);
106 }
107 });
108 }
109 }
110
111
112
113
114
115 public void addFunctionScore(final Consumer<List<FilterFunctionBuilder>> functionScoreQuery) {
116 final List<FilterFunctionBuilder> list = new ArrayList<>();
117 functionScoreQuery.accept(list);
118 queryBuilder = QueryBuilders.functionScoreQuery(queryBuilder, list.toArray(new FilterFunctionBuilder[list.size()]));
119 }
120
121
122
123
124
125 public void addQuery(final Consumer<BoolQueryBuilder> boolQuery) {
126 BoolQueryBuilder builder;
127 if (queryBuilder instanceof MatchAllQueryBuilder) {
128 builder = QueryBuilders.boolQuery();
129 } else {
130 builder = QueryBuilders.boolQuery().must(queryBuilder);
131 }
132 boolQuery.accept(builder);
133 if (builder.hasClauses()) {
134 queryBuilder = builder;
135 }
136 }
137
138
139
140
141
142 public void setQueryBuilder(final QueryBuilder queryBuilder) {
143 this.queryBuilder = queryBuilder;
144 }
145
146
147
148
149
150 public void addSorts(final SortBuilder<?>... sortBuilders) {
151 stream(sortBuilders).of(stream -> stream.forEach(sortBuilder -> sortBuilderList.add(sortBuilder)));
152 }
153
154
155
156
157
158 public boolean hasSorts() {
159 return !sortBuilderList.isEmpty();
160 }
161
162
163
164
165
166 public List<SortBuilder<?>> sortBuilders() {
167 return sortBuilderList;
168 }
169
170
171
172
173
174 public QueryBuilder getQueryBuilder() {
175 return queryBuilder;
176 }
177
178
179
180
181
182
183 public void addFieldLog(final String field, final String text) {
184 if (fieldLogMap == null) {
185 return;
186 }
187
188 List<String> list = fieldLogMap.get(field);
189 if (list == null) {
190 list = new ArrayList<>();
191 fieldLogMap.put(field, list);
192 }
193 list.add(text);
194 }
195
196
197
198
199
200 public List<String> getDefaultKeyword() {
201 if (fieldLogMap != null) {
202 return fieldLogMap.getOrDefault(Constants.DEFAULT_FIELD, Collections.emptyList());
203 }
204 return Collections.emptyList();
205 }
206
207
208
209
210
211 public void addHighlightedQuery(final String text) {
212 if (highlightedQuerySet != null) {
213 highlightedQuerySet.add(text);
214 }
215 }
216
217
218
219
220
221 public String getQueryString() {
222 return queryString;
223 }
224
225
226
227
228
229 public boolean roleQueryEnabled() {
230 return !disableRoleQuery;
231 }
232
233
234
235
236 public void skipRoleQuery() {
237 disableRoleQuery = true;
238 }
239
240
241
242
243
244 public String getDefaultField() {
245 return defaultField;
246 }
247
248
249
250
251
252 public void setDefaultField(final String defaultField) {
253 this.defaultField = defaultField;
254 }
255
256
257
258
259
260 public Set<String> getHighlightedQuerySet() {
261 return highlightedQuerySet != null ? highlightedQuerySet : new HashSet<>();
262 }
263
264
265
266
267
268 public Map<String, List<String>> getFieldLogMap() {
269 return fieldLogMap != null ? fieldLogMap : new HashMap<>();
270 }
271 }