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.fess.Constants;
30 import org.elasticsearch.index.query.BoolQueryBuilder;
31 import org.elasticsearch.index.query.MatchAllQueryBuilder;
32 import org.elasticsearch.index.query.QueryBuilder;
33 import org.elasticsearch.index.query.QueryBuilders;
34 import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
35 import org.elasticsearch.search.sort.SortBuilder;
36 import org.lastaflute.web.util.LaRequestUtil;
37
38 public class QueryContext {
39 private QueryBuilder queryBuilder;
40
41 private final List<SortBuilder> sortBuilderList = new ArrayList<>();
42
43 private final String queryString;
44
45 private Set<String> highlightedQuerySet = null;
46
47 private Map<String, List<String>> fieldLogMap = null;
48
49 private boolean disableRoleQuery = false;
50
51 @SuppressWarnings("unchecked")
52 public QueryContext(final String queryString, final boolean isQuery) {
53 this.queryString = queryString;
54 if (isQuery) {
55 LaRequestUtil.getOptionalRequest().ifPresent(request -> {
56 highlightedQuerySet = new HashSet<>();
57 request.setAttribute(Constants.HIGHLIGHT_QUERIES, highlightedQuerySet);
58 fieldLogMap = (Map<String, List<String>>) request.getAttribute(Constants.FIELD_LOGS);
59 if (fieldLogMap == null) {
60 fieldLogMap = new HashMap<>();
61 request.setAttribute(Constants.FIELD_LOGS, fieldLogMap);
62 }
63 });
64 }
65 }
66
67 public void addFunctionScore(final Consumer<List<FilterFunctionBuilder>> functionScoreQuery) {
68 final List<FilterFunctionBuilder> list = new ArrayList<>();
69 functionScoreQuery.accept(list);
70 queryBuilder = QueryBuilders.functionScoreQuery(queryBuilder, list.toArray(new FilterFunctionBuilder[list.size()]));
71 }
72
73 public void addQuery(final Consumer<BoolQueryBuilder> boolQuery) {
74 BoolQueryBuilder builder;
75 if (queryBuilder instanceof MatchAllQueryBuilder) {
76 builder = QueryBuilders.boolQuery();
77 } else {
78 builder = QueryBuilders.boolQuery().must(queryBuilder);
79 }
80 boolQuery.accept(builder);
81 if (builder.hasClauses()) {
82 queryBuilder = builder;
83 }
84 }
85
86 public void setQueryBuilder(final QueryBuilder queryBuilder) {
87 this.queryBuilder = queryBuilder;
88 }
89
90 public void addSorts(final SortBuilder... sortBuilders) {
91 stream(sortBuilders).of(stream -> stream.forEach(sortBuilder -> sortBuilderList.add(sortBuilder)));
92 }
93
94 public boolean hasSorts() {
95 return !sortBuilderList.isEmpty();
96 }
97
98 public List<SortBuilder> sortBuilders() {
99 return sortBuilderList;
100 }
101
102 public QueryBuilder getQueryBuilder() {
103 return queryBuilder;
104 }
105
106 public void addFieldLog(final String field, final String text) {
107 if (fieldLogMap == null) {
108 return;
109 }
110
111 List<String> list = fieldLogMap.get(field);
112 if (list == null) {
113 list = new ArrayList<>();
114 fieldLogMap.put(field, list);
115 }
116 list.add(text);
117 }
118
119 public List<String> getDefaultKeyword() {
120 if (fieldLogMap != null) {
121 return fieldLogMap.getOrDefault(Constants.DEFAULT_FIELD, Collections.emptyList());
122 }
123 return Collections.emptyList();
124 }
125
126 public void addHighlightedQuery(final String text) {
127 if (highlightedQuerySet != null) {
128 highlightedQuerySet.add(text);
129 }
130 }
131
132 public String getQueryString() {
133 return queryString;
134 }
135
136 public boolean roleQueryEnabled() {
137 return !disableRoleQuery;
138 }
139
140 public void skipRoleQuery() {
141 disableRoleQuery = true;
142 }
143 }