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.aggregatevnf.search;
 
  25 import javax.json.Json;
 
  26 import javax.json.JsonArray;
 
  27 import javax.json.JsonArrayBuilder;
 
  28 import javax.json.JsonObject;
 
  29 import javax.json.JsonObjectBuilder;
 
  33  * Build a JSON payload to send to elastic search to get vnf search data.
 
  36 public class VnfSearchQueryBuilder {
 
  40    * Creates the suggestions query.
 
  42    * @param maxResults maximum number of suggestions to fetch
 
  43    * @param queryStr query string
 
  44    * @return the json object
 
  48    * { "vnfs" : { "text" : "VNFs", "completion" : { "field" : "entity_suggest", "size": 1 } } }
 
  50   public static JsonObject createSuggestionsQuery(String maxResults, String queryStr) {
 
  51     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
 
  53     JsonObjectBuilder completionBlob = Json.createObjectBuilder();
 
  54     completionBlob.add("field", "entity_suggest");
 
  55     completionBlob.add("size", maxResults);
 
  57     JsonObjectBuilder jsonAllBuilder = Json.createObjectBuilder();
 
  58     jsonAllBuilder.add("text", queryStr);
 
  59     jsonAllBuilder.add("completion", completionBlob);
 
  61     jsonBuilder.add("vnfs", jsonAllBuilder.build());
 
  62     return jsonBuilder.build();
 
  65   public static JsonObject getTermBlob(String key, String value) {
 
  66     JsonObjectBuilder termBlobBuilder = Json.createObjectBuilder();
 
  67     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder().add(key, value);
 
  68     return termBlobBuilder.add("term", jsonBuilder.build()).build();
 
  71   public static void getSummaryAggsBlob(JsonObjectBuilder aggsBlobBuilder, String aggsKey,
 
  73     JsonObjectBuilder fieldBuilder =
 
  74         Json.createObjectBuilder().add("field", aggsKey).add("size", resultSize);
 
  75     JsonObject aggsFieldBlob = fieldBuilder.build();
 
  76     JsonObjectBuilder defaultBlobBuilder = Json.createObjectBuilder().add("terms", aggsFieldBlob);
 
  77     JsonObject defaultBlob = defaultBlobBuilder.build();
 
  78     aggsBlobBuilder.add("default", defaultBlob);
 
  81   public static void buildSingleTermCountQuery(JsonObjectBuilder jsonBuilder, String key,
 
  83     jsonBuilder.add("query", getTermBlob(key, value));
 
  86   public static void buildSingleTermSummaryQuery(JsonObjectBuilder jsonBuilder, String key,
 
  87       String value, String groupByKey) {
 
  88     JsonObjectBuilder queryBlobBuilder = Json.createObjectBuilder();
 
  89     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
 
  91     queryBlobBuilder.add("constant_score",
 
  92         Json.createObjectBuilder().add("filter", getTermBlob(key, value)));
 
  94     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
 
  96     jsonBuilder.add("query", queryBlobBuilder.build());
 
  97     jsonBuilder.add("aggs", aggsBlobBuilder.build());
 
 100   public static void buildMultiTermSummaryQuery(JsonObjectBuilder jsonBuilder,
 
 101       Map<String, String> attributes, String groupByKey) {
 
 102     JsonObjectBuilder queryBlobBuilder = Json.createObjectBuilder();
 
 103     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
 
 104     JsonArrayBuilder mustBlobBuilder = Json.createArrayBuilder();
 
 105     for (String key : attributes.keySet()) {
 
 106       mustBlobBuilder.add(getTermBlob(key, attributes.get(key)));
 
 108     JsonArray mustBlob = mustBlobBuilder.build();
 
 110     queryBlobBuilder.add("constant_score", Json.createObjectBuilder().add("filter",
 
 111         Json.createObjectBuilder().add("bool", Json.createObjectBuilder().add("must", mustBlob))));
 
 113     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
 
 115     jsonBuilder.add("query", queryBlobBuilder.build());
 
 116     jsonBuilder.add("aggs", aggsBlobBuilder.build());
 
 119   public static void buildZeroTermSummaryQuery(JsonObjectBuilder jsonBuilder, String groupByKey) {
 
 120     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
 
 122     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
 
 124     jsonBuilder.add("aggs", aggsBlobBuilder.build());
 
 127   public static void buildMultiTermCountQuery(JsonObjectBuilder jsonBuilder,
 
 128       Map<String, String> attributes) {
 
 129     JsonArrayBuilder mustBlobBuilder = Json.createArrayBuilder();
 
 130     for (String key : attributes.keySet()) {
 
 131       mustBlobBuilder.add(getTermBlob(key, attributes.get(key)));
 
 133     jsonBuilder.add("query", Json.createObjectBuilder().add("bool",
 
 134         Json.createObjectBuilder().add("must", mustBlobBuilder)));
 
 139   public static JsonObject createSummaryByEntityTypeQuery(Map<String, String> attributes,
 
 141     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
 
 142     jsonBuilder.add("size", "0"); // avoid source data
 
 143     if (attributes.size() == 0) {
 
 144       buildZeroTermSummaryQuery(jsonBuilder, groupByKey);
 
 145     } else if (attributes.size() == 1) {
 
 146       Map.Entry<String, String> entry = attributes.entrySet().iterator().next();
 
 147       buildSingleTermSummaryQuery(jsonBuilder, entry.getKey(), entry.getValue(), groupByKey);
 
 149       buildMultiTermSummaryQuery(jsonBuilder, attributes, groupByKey);
 
 151     return jsonBuilder.build();
 
 154   public static JsonObject createEntityCountsQuery(Map<String, String> attributes) {
 
 155     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
 
 156     if (attributes.size() == 1) {
 
 157       Map.Entry<String, String> entry = attributes.entrySet().iterator().next();
 
 158       buildSingleTermCountQuery(jsonBuilder, entry.getKey(), entry.getValue());
 
 160       buildMultiTermCountQuery(jsonBuilder, attributes);
 
 162     return jsonBuilder.build();
 
 165   public static JsonArray getSortCriteria(String sortFieldName, String sortOrder) {
 
 166     JsonArrayBuilder jsonBuilder = Json.createArrayBuilder();
 
 167     jsonBuilder.add(Json.createObjectBuilder().add(sortFieldName,
 
 168         Json.createObjectBuilder().add("order", sortOrder)));
 
 170     return jsonBuilder.build();