2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017 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 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
23 package org.onap.aai.sparky.search.filters;
25 import java.util.ArrayList;
26 import java.util.List;
28 import javax.json.Json;
29 import javax.json.JsonArrayBuilder;
30 import javax.json.JsonObject;
31 import javax.json.JsonObjectBuilder;
33 import org.onap.aai.sparky.search.filters.config.FiltersConfig;
34 import org.onap.aai.sparky.search.filters.config.UiFilterConfig;
35 import org.onap.aai.sparky.search.filters.entity.AggregationEntity;
36 import org.onap.aai.sparky.search.filters.entity.BoolQueryBuilder;
37 import org.onap.aai.sparky.search.filters.entity.FilteredAggregationQueryBuilder;
38 import org.onap.aai.sparky.search.filters.entity.MatchFilterCriteriaEntity;
39 import org.onap.aai.sparky.search.filters.entity.SearchFilter;
42 * Used to generate queries against Elasticsearch for filter related queries.
44 public class FilterQueryBuilder {
46 private static final int EXISTING_FILTERS_LIMIT = 0;
47 private static final int SHOULD_BRANCH_LIMIT = 2;
49 public static JsonObject createFilteredBoolQueryObject(List<SearchFilter> searchFilters, int minShouldMatch, List<String> fields) {
51 if (searchFilters == null || searchFilters.size() == 0) {
55 int searchFilterValueSize = 0;
57 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
59 FiltersConfig filters = FiltersConfig.getInstance();
61 for (SearchFilter searchFilter : searchFilters) {
63 searchFilterValueSize = searchFilter.getValues().size();
66 * translate the filter-id into the filter-name from the oxm data model/config file
68 UiFilterConfig filter = filters.getFilterById(searchFilter.getFilterId());
70 if (filter == null || filter.getFilterName() == null) {
71 // log error and continue
74 String fieldName = filter.getDataSource().getFieldName();
75 if(!fields.contains(fieldName)) {
76 fields.add(fieldName);
79 if (searchFilterValueSize >= SHOULD_BRANCH_LIMIT) {
80 // Add should branches
81 for (String filterValue : searchFilter.getValues()) {
82 boolQueryBuilder.addShouldFilter(new MatchFilterCriteriaEntity(fieldName, filterValue));
85 } else if (searchFilterValueSize > EXISTING_FILTERS_LIMIT) {
87 for (String filterValue : searchFilter.getValues()) {
88 boolQueryBuilder.addMustFilter(new MatchFilterCriteriaEntity(fieldName, filterValue));
94 boolQueryBuilder.setMinShouldMatch(minShouldMatch);
96 return boolQueryBuilder.getJsonObject();
99 public static JsonObject createAggregationQueryArray(List<SearchFilter> searchFilters) {
101 if (searchFilters == null || searchFilters.size() == 0) {
106 FilteredAggregationQueryBuilder aggQueryBuilder = new FilteredAggregationQueryBuilder();
108 FiltersConfig filters = FiltersConfig.getInstance();
110 for (SearchFilter searchFilter : searchFilters) {
113 * translate the filter-id into the filter-name from the oxm data model/config file
115 UiFilterConfig filter = filters.getFilterById(searchFilter.getFilterId());
117 if (filter == null || filter.getFilterName() == null) {
118 // log error and continue
120 String fieldName = filter.getDataSource().getFieldName();
121 aggQueryBuilder.addAggregationEntity(new AggregationEntity(fieldName, fieldName, 0));
126 return aggQueryBuilder.getJsonObject();
129 public static JsonObject createCombinedBoolAndAggQuery(List<SearchFilter> searchFilters, int minShouldMatch) {
130 JsonObjectBuilder wrappedQueryBuilder = Json.createObjectBuilder();
131 if(searchFilters != null) {
132 List<String> fields = new ArrayList<String>();
133 JsonObject boolQuery = createFilteredBoolQueryObject(searchFilters, minShouldMatch, fields);
134 JsonObject aggQuery = createAggregationQueryArray(searchFilters);
136 if (boolQuery != null) {
137 wrappedQueryBuilder.add("size", 0);
139 JsonArrayBuilder filedsArrayBuilder = Json.createBuilderFactory(null).createArrayBuilder(); // TODO -> Should we use a class instance factory?
140 for(String field : fields) {
141 filedsArrayBuilder.add(field);
143 wrappedQueryBuilder.add("fields", filedsArrayBuilder.build());
145 wrappedQueryBuilder.add("query", boolQuery);
148 if (aggQuery != null) {
149 wrappedQueryBuilder.add("aggs", aggQuery);
152 return wrappedQueryBuilder.build();
155 public static JsonObject createFilterValueQueryObject(String fieldValue) {
156 JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
157 jsonBuilder.add("size", "0"); // avoid source data
158 buildZeroTermSummaryQuery(jsonBuilder, fieldValue);
160 return jsonBuilder.build();
163 public static JsonObject createNestedFilterValueQueryObject(String fieldValue,
164 String pathToField) {
165 JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
166 jsonBuilder.add("size", "0"); // avoid source data
167 generateNestedAggregations(jsonBuilder, fieldValue, pathToField);
169 return jsonBuilder.build();
172 public static void buildZeroTermSummaryQuery(JsonObjectBuilder jsonBuilder, String fieldValue) {
173 JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
174 getSummaryAggsBlob(aggsBlobBuilder, fieldValue, 0);
175 jsonBuilder.add("aggs", aggsBlobBuilder.build());
178 public static void getSummaryAggsBlob(JsonObjectBuilder aggsBlobBuilder, String fieldValue,
180 JsonObjectBuilder fieldBuilder =
181 Json.createObjectBuilder().add("field", fieldValue).add("size", resultSize);
182 JsonObject aggsFieldBlob = fieldBuilder.build();
183 JsonObjectBuilder defaultBlobBuilder = Json.createObjectBuilder().add("terms", aggsFieldBlob);
184 JsonObject defaultBlob = defaultBlobBuilder.build();
185 aggsBlobBuilder.add("default", defaultBlob);
188 public static void addNestedSummaryAggsBlob(JsonObjectBuilder nestedAggsBuilder,
189 String containerValue, String fieldValue, int resultSize) {
190 JsonObjectBuilder fieldBuilder = Json.createObjectBuilder()
191 .add("field", containerValue + "." + fieldValue).add("size", resultSize);
192 JsonObject aggsFieldObject = fieldBuilder.build();
194 JsonObjectBuilder termBuilder = Json.createObjectBuilder().add("terms", aggsFieldObject);
195 JsonObject termObject = termBuilder.build();
197 JsonObjectBuilder namedAggsBuilder = Json.createObjectBuilder().add(fieldValue, termObject);
198 JsonObject namedAggsObject = namedAggsBuilder.build();
200 nestedAggsBuilder.add("aggs", namedAggsObject);
203 public static void generateNestedAggregations(JsonObjectBuilder jsonBuilder, String fieldValue,
204 String pathToField) {
205 JsonObjectBuilder nestedAggsBuilder = Json.createObjectBuilder();
207 JsonObjectBuilder pathObjectBuilder = Json.createObjectBuilder().add("path", pathToField);
208 JsonObject nestedPathObject = pathObjectBuilder.build();
210 JsonObjectBuilder nestedObjectBuilder =
211 Json.createObjectBuilder().add("nested", nestedPathObject);
213 addNestedSummaryAggsBlob(nestedObjectBuilder, pathToField, fieldValue, 0);
215 JsonObject nestedObject = nestedObjectBuilder.build();
216 nestedAggsBuilder.add(pathToField, nestedObject);
218 jsonBuilder.add("aggs", nestedAggsBuilder.build());