View Javadoc
1   /*
2    * Copyright 2012-2021 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.es.log.allcommon;
17  
18  import java.util.ArrayList;
19  import java.util.Collection;
20  import java.util.Collections;
21  import java.util.List;
22  
23  import org.codelibs.fesen.index.query.QueryBuilder;
24  import org.codelibs.fesen.search.aggregations.AbstractAggregationBuilder;
25  import org.codelibs.fesen.search.aggregations.AggregationBuilders;
26  import org.codelibs.fesen.search.aggregations.bucket.filter.FilterAggregationBuilder;
27  import org.codelibs.fesen.search.aggregations.bucket.global.GlobalAggregationBuilder;
28  import org.codelibs.fesen.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
29  import org.codelibs.fesen.search.aggregations.bucket.histogram.HistogramAggregationBuilder;
30  import org.codelibs.fesen.search.aggregations.bucket.missing.MissingAggregationBuilder;
31  import org.codelibs.fesen.search.aggregations.bucket.range.DateRangeAggregationBuilder;
32  import org.codelibs.fesen.search.aggregations.bucket.range.IpRangeAggregationBuilder;
33  import org.codelibs.fesen.search.aggregations.bucket.range.RangeAggregationBuilder;
34  import org.codelibs.fesen.search.aggregations.bucket.sampler.SamplerAggregationBuilder;
35  import org.codelibs.fesen.search.aggregations.bucket.terms.SignificantTermsAggregationBuilder;
36  import org.codelibs.fesen.search.aggregations.bucket.terms.TermsAggregationBuilder;
37  import org.codelibs.fesen.search.aggregations.metrics.AvgAggregationBuilder;
38  import org.codelibs.fesen.search.aggregations.metrics.CardinalityAggregationBuilder;
39  import org.codelibs.fesen.search.aggregations.metrics.ExtendedStatsAggregationBuilder;
40  import org.codelibs.fesen.search.aggregations.metrics.MaxAggregationBuilder;
41  import org.codelibs.fesen.search.aggregations.metrics.MinAggregationBuilder;
42  import org.codelibs.fesen.search.aggregations.metrics.PercentileRanksAggregationBuilder;
43  import org.codelibs.fesen.search.aggregations.metrics.PercentilesAggregationBuilder;
44  import org.codelibs.fesen.search.aggregations.metrics.ScriptedMetricAggregationBuilder;
45  import org.codelibs.fesen.search.aggregations.metrics.StatsAggregationBuilder;
46  import org.codelibs.fesen.search.aggregations.metrics.SumAggregationBuilder;
47  import org.codelibs.fesen.search.aggregations.metrics.TopHitsAggregationBuilder;
48  import org.codelibs.fesen.search.aggregations.metrics.ValueCountAggregationBuilder;
49  import org.dbflute.exception.InvalidQueryRegisteredException;
50  
51  /**
52   * @author ESFlute (using FreeGen)
53   */
54  public abstract class EsAbstractConditionAggregation {
55  
56      protected static final String CA_PROPERTY = "conditionAggregation";
57  
58      // ===================================================================================
59      //                                                                           Attribute
60      //                                                                           =========
61      protected List<AbstractAggregationBuilder<?>> aggregationAggregationBuilderList;
62  
63      // ===================================================================================
64      //                                                                             Control
65      //                                                                             =======
66  
67      public boolean hasAggregations() {
68          return aggregationAggregationBuilderList != null && !aggregationAggregationBuilderList.isEmpty();
69      }
70  
71      public List<AbstractAggregationBuilder<?>> getAggregationBuilderList() {
72          return aggregationAggregationBuilderList != null ? aggregationAggregationBuilderList : Collections.emptyList();
73      }
74  
75      // ===================================================================================
76      //                                                                         Aggregation
77      //                                                                         ===========
78      public void addAggregation(AbstractAggregationBuilder<?> aggregationAggregationBuilder) {
79          assertObjectNotNull("aggregationAggregationBuilder", aggregationAggregationBuilder);
80          regA(aggregationAggregationBuilder);
81      }
82  
83      // ===================================================================================
84      //                                                                            Register
85      //                                                                            ========
86  
87      protected AvgAggregationBuilder regAvgA(String name, String field) {
88          AvgAggregationBuilder builder = AggregationBuilders.avg(name).field(field);
89          regA(builder);
90          return builder;
91      }
92  
93      protected MaxAggregationBuilder regMaxA(String name, String field) {
94          MaxAggregationBuilder builder = AggregationBuilders.max(name).field(field);
95          regA(builder);
96          return builder;
97      }
98  
99      protected MinAggregationBuilder regMinA(String name, String field) {
100         MinAggregationBuilder builder = AggregationBuilders.min(name).field(field);
101         regA(builder);
102         return builder;
103     }
104 
105     protected SumAggregationBuilder regSumA(String name, String field) {
106         SumAggregationBuilder builder = AggregationBuilders.sum(name).field(field);
107         regA(builder);
108         return builder;
109     }
110 
111     protected ExtendedStatsAggregationBuilder regExtendedStatsA(String name, String field) {
112         ExtendedStatsAggregationBuilder builder = AggregationBuilders.extendedStats(name).field(field);
113         regA(builder);
114         return builder;
115     }
116 
117     protected StatsAggregationBuilder regStatsA(String name, String field) {
118         StatsAggregationBuilder builder = AggregationBuilders.stats(name).field(field);
119         regA(builder);
120         return builder;
121     }
122 
123     protected PercentilesAggregationBuilder regPercentilesA(String name, String field) {
124         PercentilesAggregationBuilder builder = AggregationBuilders.percentiles(name).field(field);
125         regA(builder);
126         return builder;
127     }
128 
129     protected PercentileRanksAggregationBuilder regPercentileRanksA(String name, String field, double[] values) {
130         PercentileRanksAggregationBuilder builder = AggregationBuilders.percentileRanks(name, values).field(field);
131         regA(builder);
132         return builder;
133     }
134 
135     protected CardinalityAggregationBuilder regCardinalityA(String name, String field) {
136         CardinalityAggregationBuilder builder = AggregationBuilders.cardinality(name).field(field);
137         regA(builder);
138         return builder;
139     }
140 
141     protected ValueCountAggregationBuilder regCountA(String name, String field) {
142         ValueCountAggregationBuilder builder = AggregationBuilders.count(name).field(field);
143         regA(builder);
144         return builder;
145     }
146 
147     protected TermsAggregationBuilder regTermsA(String name, String field) {
148         TermsAggregationBuilder builder = AggregationBuilders.terms(name).field(field);
149         regA(builder);
150         return builder;
151     }
152 
153     protected SignificantTermsAggregationBuilder regSignificantTermsA(String name, String field) {
154         SignificantTermsAggregationBuilder builder = AggregationBuilders.significantTerms(name).field(field);
155         regA(builder);
156         return builder;
157     }
158 
159     protected HistogramAggregationBuilder regHistogramA(String name, String field) {
160         HistogramAggregationBuilder builder = AggregationBuilders.histogram(name).field(field);
161         regA(builder);
162         return builder;
163     }
164 
165     protected DateHistogramAggregationBuilder regDateHistogramA(String name, String field) {
166         DateHistogramAggregationBuilder builder = AggregationBuilders.dateHistogram(name).field(field);
167         regA(builder);
168         return builder;
169     }
170 
171     protected RangeAggregationBuilder regRangeA(String name, String field) {
172         RangeAggregationBuilder builder = AggregationBuilders.range(name).field(field);
173         regA(builder);
174         return builder;
175     }
176 
177     protected DateRangeAggregationBuilder regDateRangeA(String name, String field) {
178         DateRangeAggregationBuilder builder = AggregationBuilders.dateRange(name).field(field);
179         regA(builder);
180         return builder;
181     }
182 
183     protected IpRangeAggregationBuilder regIpRangeA(String name, String field) {
184         IpRangeAggregationBuilder builder = AggregationBuilders.ipRange(name).field(field);
185         regA(builder);
186         return builder;
187     }
188 
189     protected MissingAggregationBuilder regMissingA(String name, String field) {
190         MissingAggregationBuilder builder = AggregationBuilders.missing(name).field(field);
191         regA(builder);
192         return builder;
193     }
194 
195     protected FilterAggregationBuilder regFilterA(String name, QueryBuilder filter) {
196         FilterAggregationBuilder builder = AggregationBuilders.filter(name, filter);
197         regA(builder);
198         return builder;
199     }
200 
201     protected GlobalAggregationBuilder regGlobalA(String name) {
202         GlobalAggregationBuilder builder = AggregationBuilders.global(name);
203         regA(builder);
204         return builder;
205     }
206 
207     protected SamplerAggregationBuilder regSamplerA(String name) {
208         SamplerAggregationBuilder builder = AggregationBuilders.sampler(name);
209         regA(builder);
210         return builder;
211     }
212 
213     protected ScriptedMetricAggregationBuilder regScriptedMetricA(String name) {
214         ScriptedMetricAggregationBuilder builder = AggregationBuilders.scriptedMetric(name);
215         regA(builder);
216         return builder;
217     }
218 
219     protected TopHitsAggregationBuilder regTopHitsA(String name) {
220         TopHitsAggregationBuilder builder = AggregationBuilders.topHits(name);
221         regA(builder);
222         return builder;
223     }
224 
225     protected void regA(AbstractAggregationBuilder<?> builder) {
226         assertObjectNotNull("builder", builder);
227         if (aggregationAggregationBuilderList == null) {
228             aggregationAggregationBuilderList = new ArrayList<>();
229         }
230         aggregationAggregationBuilderList.add(builder);
231     }
232 
233     // ===================================================================================
234     //                                                                 Invalid Aggregation
235     //                                                                       =============
236     protected void checkEsInvalidAggregation(String name, Object value) {
237         if (value == null || (value instanceof String && ((String) value).isEmpty())) {
238             String msg = "Cannot register null or empty aggregation: name=" + name + " value=" + value;
239             throw new InvalidQueryRegisteredException(msg);
240         }
241     }
242 
243     protected void checkEsInvalidAggregationCollection(String name, Collection<?> values) {
244         if (values == null || values.isEmpty()) {
245             String msg = "Cannot register null or empty query collection: name=" + name + " values=" + values;
246             throw new InvalidQueryRegisteredException(msg);
247         }
248     }
249 
250     // ===================================================================================
251     //                                                                      General Helper
252     //                                                                      ==============
253     protected void assertObjectNotNull(String variableName, Object value) {
254         if (variableName == null) {
255             String msg = "The value should not be null: variableName=null value=" + value;
256             throw new IllegalArgumentException(msg);
257         }
258         if (value == null) {
259             String msg = "The value should not be null: variableName=" + variableName;
260             throw new IllegalArgumentException(msg);
261         }
262     }
263 
264     // ===================================================================================
265     //                                                                        Assist Class
266     //                                                                        ============
267 
268     @FunctionalInterface
269     public interface ConditionOptionCall<OP extends AbstractAggregationBuilder<?>> {
270 
271         /**
272          * @param op The option of condition to be set up. (NotNull)
273          */
274         void callback(OP op);
275     }
276 
277     @FunctionalInterface
278     public interface OperatorCall<CA extends EsAbstractConditionAggregation> {
279 
280         void callback(CA query);
281     }
282 }