2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017-2018 Amdocs
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 package org.onap.aai.sparky.search.filters;
23 import java.util.ArrayList;
24 import java.util.List;
26 import javax.json.Json;
27 import javax.json.JsonArrayBuilder;
28 import javax.json.JsonObject;
29 import javax.json.JsonObjectBuilder;
31 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
32 import org.onap.aai.sparky.search.filters.config.UiFilterConfig;
33 import org.onap.aai.sparky.search.filters.entity.AggregationEntity;
34 import org.onap.aai.sparky.search.filters.entity.BoolQueryBuilder;
35 import org.onap.aai.sparky.search.filters.entity.FilteredAggregationQueryBuilder;
36 import org.onap.aai.sparky.search.filters.entity.MatchFilterCriteriaEntity;
37 import org.onap.aai.sparky.search.filters.entity.SearchFilter;
40 * Used to generate queries against Elasticsearch for filter related queries.
42 public class FilterQueryBuilder {
44 private static final int EXISTING_FILTERS_LIMIT = 0;
45 private static final int SHOULD_BRANCH_LIMIT = 2;
47 public static JsonObject createFilteredBoolQueryObject(FiltersConfig filtersConfig, List<SearchFilter> searchFilters, int minShouldMatch, List<String> fields) {
49 if (searchFilters == null || searchFilters.size() == 0) {
53 int searchFilterValueSize = 0;
55 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
57 for (SearchFilter searchFilter : searchFilters) {
59 searchFilterValueSize = searchFilter.getValues().size();
62 * translate the filter-id into the filter-name from the oxm data model/config file
64 UiFilterConfig filter = filtersConfig.getFilterById(searchFilter.getFilterId());
66 if (filter == null || filter.getFilterName() == null) {
67 // log error and continue
70 String fieldName = filter.getDataSource().getFieldName();
71 if(!fields.contains(fieldName)) {
72 fields.add(fieldName);
75 if (searchFilterValueSize >= SHOULD_BRANCH_LIMIT) {
76 // Add should branches
77 for (String filterValue : searchFilter.getValues()) {
78 boolQueryBuilder.addShouldFilter(new MatchFilterCriteriaEntity(fieldName, filterValue));
81 } else if (searchFilterValueSize > EXISTING_FILTERS_LIMIT) {
83 for (String filterValue : searchFilter.getValues()) {
84 boolQueryBuilder.addMustFilter(new MatchFilterCriteriaEntity(fieldName, filterValue));
90 boolQueryBuilder.setMinShouldMatch(minShouldMatch);
92 return boolQueryBuilder.getJsonObject();
95 public static JsonObject createAggregationQueryArray(FiltersConfig filtersConfig, List<SearchFilter> searchFilters) {
97 if (searchFilters == null || searchFilters.size() == 0) {
102 FilteredAggregationQueryBuilder aggQueryBuilder = new FilteredAggregationQueryBuilder();
104 for (SearchFilter searchFilter : searchFilters) {
107 * translate the filter-id into the filter-name from the oxm data model/config file
109 UiFilterConfig filter = filtersConfig.getFilterById(searchFilter.getFilterId());
111 if (filter == null || filter.getFilterName() == null) {
112 // log error and continue
114 String fieldName = filter.getDataSource().getFieldName();
115 aggQueryBuilder.addAggregationEntity(new AggregationEntity(fieldName, fieldName, 0));
120 return aggQueryBuilder.getJsonObject();
123 public static JsonObject createCombinedBoolAndAggQuery(FiltersConfig filtersConfig, List<SearchFilter> searchFilters, int minShouldMatch) {
124 JsonObjectBuilder wrappedQueryBuilder = Json.createObjectBuilder();
125 if(searchFilters != null) {
126 List<String> fields = new ArrayList<String>();
127 JsonObject boolQuery = createFilteredBoolQueryObject(filtersConfig,searchFilters, minShouldMatch, fields);
128 JsonObject aggQuery = createAggregationQueryArray(filtersConfig, searchFilters);
130 if (boolQuery != null) {
131 wrappedQueryBuilder.add("size", 0);
133 JsonArrayBuilder filedsArrayBuilder = Json.createBuilderFactory(null).createArrayBuilder(); // TODO -> Should we use a class instance factory?
134 for(String field : fields) {
135 filedsArrayBuilder.add(field);
137 wrappedQueryBuilder.add("fields", filedsArrayBuilder.build());
139 wrappedQueryBuilder.add("query", boolQuery);
142 if (aggQuery != null) {
143 wrappedQueryBuilder.add("aggs", aggQuery);
146 return wrappedQueryBuilder.build();
149 public static JsonObject createFilterValueQueryObject(String fieldValue) {
150 JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
151 jsonBuilder.add("size", "0"); // avoid source data
152 buildZeroTermSummaryQuery(jsonBuilder, fieldValue);
154 return jsonBuilder.build();
157 public static JsonObject createNestedFilterValueQueryObject(String fieldValue,
158 String pathToField) {
159 JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
160 jsonBuilder.add("size", "0"); // avoid source data
161 generateNestedAggregations(jsonBuilder, fieldValue, pathToField);
163 return jsonBuilder.build();
166 public static void buildZeroTermSummaryQuery(JsonObjectBuilder jsonBuilder, String fieldValue) {
167 JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
168 getSummaryAggsBlob(aggsBlobBuilder, fieldValue, 0);
169 jsonBuilder.add("aggs", aggsBlobBuilder.build());
172 public static void getSummaryAggsBlob(JsonObjectBuilder aggsBlobBuilder, String fieldValue,
174 JsonObjectBuilder fieldBuilder =
175 Json.createObjectBuilder().add("field", fieldValue).add("size", resultSize);
176 JsonObject aggsFieldBlob = fieldBuilder.build();
177 JsonObjectBuilder defaultBlobBuilder = Json.createObjectBuilder().add("terms", aggsFieldBlob);
178 JsonObject defaultBlob = defaultBlobBuilder.build();
179 aggsBlobBuilder.add("default", defaultBlob);
182 public static void addNestedSummaryAggsBlob(JsonObjectBuilder nestedAggsBuilder,
183 String containerValue, String fieldValue, int resultSize) {
184 JsonObjectBuilder fieldBuilder = Json.createObjectBuilder()
185 .add("field", containerValue + "." + fieldValue).add("size", resultSize);
186 JsonObject aggsFieldObject = fieldBuilder.build();
188 JsonObjectBuilder termBuilder = Json.createObjectBuilder().add("terms", aggsFieldObject);
189 JsonObject termObject = termBuilder.build();
191 JsonObjectBuilder namedAggsBuilder = Json.createObjectBuilder().add(fieldValue, termObject);
192 JsonObject namedAggsObject = namedAggsBuilder.build();
194 nestedAggsBuilder.add("aggs", namedAggsObject);
197 public static void generateNestedAggregations(JsonObjectBuilder jsonBuilder, String fieldValue,
198 String pathToField) {
199 JsonObjectBuilder nestedAggsBuilder = Json.createObjectBuilder();
201 JsonObjectBuilder pathObjectBuilder = Json.createObjectBuilder().add("path", pathToField);
202 JsonObject nestedPathObject = pathObjectBuilder.build();
204 JsonObjectBuilder nestedObjectBuilder =
205 Json.createObjectBuilder().add("nested", nestedPathObject);
207 addNestedSummaryAggsBlob(nestedObjectBuilder, pathToField, fieldValue, 0);
209 JsonObject nestedObject = nestedObjectBuilder.build();
210 nestedAggsBuilder.add(pathToField, nestedObject);
212 jsonBuilder.add("aggs", nestedAggsBuilder.build());