View Javadoc
1   /*
2    * Copyright 2012-2017 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
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 }