a5b14bdb455eb7fb0fc0a4ada214d0db0aa0f6aa
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / aggregatevnf / search / VnfSearchQueryBuilder.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  *
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23 package org.onap.aai.sparky.aggregatevnf.search;
24
25 import java.util.Map;
26
27 import javax.json.Json;
28 import javax.json.JsonArray;
29 import javax.json.JsonArrayBuilder;
30 import javax.json.JsonObject;
31 import javax.json.JsonObjectBuilder;
32
33
34 /**
35  * Build a JSON payload to send to elastic search to get vnf search data.
36  */
37
38 public class VnfSearchQueryBuilder {
39         
40
41   /**
42    * Creates the suggestions query.
43    * 
44    * @param maxResults maximum number of suggestions to fetch
45    * @param queryStr query string
46    * @return the json object
47    */
48
49   /*
50    * { "vnfs" : { "text" : "VNFs", "completion" : { "field" : "entity_suggest", "size": 1 } } }
51    */
52   public static JsonObject createSuggestionsQuery(String maxResults, String queryStr) {
53     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
54
55     JsonObjectBuilder completionBlob = Json.createObjectBuilder();
56     completionBlob.add("field", "entity_suggest");
57     completionBlob.add("size", maxResults);
58
59     JsonObjectBuilder jsonAllBuilder = Json.createObjectBuilder();
60     jsonAllBuilder.add("text", queryStr);
61     jsonAllBuilder.add("completion", completionBlob);
62
63     jsonBuilder.add("vnfs", jsonAllBuilder.build());
64     return jsonBuilder.build();
65   }
66
67   public static JsonObject getTermBlob(String key, String value) {
68     JsonObjectBuilder termBlobBuilder = Json.createObjectBuilder();
69     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder().add(key, value);
70     return termBlobBuilder.add("term", jsonBuilder.build()).build();
71   }
72
73   public static void getSummaryAggsBlob(JsonObjectBuilder aggsBlobBuilder, String aggsKey,
74       int resultSize) {
75     JsonObjectBuilder fieldBuilder =
76         Json.createObjectBuilder().add("field", aggsKey).add("size", resultSize);
77     JsonObject aggsFieldBlob = fieldBuilder.build();
78     JsonObjectBuilder defaultBlobBuilder = Json.createObjectBuilder().add("terms", aggsFieldBlob);
79     JsonObject defaultBlob = defaultBlobBuilder.build();
80     aggsBlobBuilder.add("default", defaultBlob);
81   }
82
83   public static void buildSingleTermCountQuery(JsonObjectBuilder jsonBuilder, String key,
84       String value) {
85     jsonBuilder.add("query", getTermBlob(key, value));
86   }
87
88   public static void buildSingleTermSummaryQuery(JsonObjectBuilder jsonBuilder, String key,
89       String value, String groupByKey) {
90     JsonObjectBuilder queryBlobBuilder = Json.createObjectBuilder();
91     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
92
93     queryBlobBuilder.add("constant_score",
94         Json.createObjectBuilder().add("filter", getTermBlob(key, value)));
95
96     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
97
98     jsonBuilder.add("query", queryBlobBuilder.build());
99     jsonBuilder.add("aggs", aggsBlobBuilder.build());
100   }
101
102   public static void buildMultiTermSummaryQuery(JsonObjectBuilder jsonBuilder,
103       Map<String, String> attributes, String groupByKey) {
104     JsonObjectBuilder queryBlobBuilder = Json.createObjectBuilder();
105     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
106     JsonArrayBuilder mustBlobBuilder = Json.createArrayBuilder();
107     for (String key : attributes.keySet()) {
108       mustBlobBuilder.add(getTermBlob(key, attributes.get(key)));
109     }
110     JsonArray mustBlob = mustBlobBuilder.build();
111
112     queryBlobBuilder.add("constant_score", Json.createObjectBuilder().add("filter",
113         Json.createObjectBuilder().add("bool", Json.createObjectBuilder().add("must", mustBlob))));
114
115     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
116
117     jsonBuilder.add("query", queryBlobBuilder.build());
118     jsonBuilder.add("aggs", aggsBlobBuilder.build());
119   }
120
121   public static void buildZeroTermSummaryQuery(JsonObjectBuilder jsonBuilder, String groupByKey) {
122     JsonObjectBuilder aggsBlobBuilder = Json.createObjectBuilder();
123
124     getSummaryAggsBlob(aggsBlobBuilder, groupByKey, 0);
125
126     jsonBuilder.add("aggs", aggsBlobBuilder.build());
127   }
128
129   public static void buildMultiTermCountQuery(JsonObjectBuilder jsonBuilder,
130       Map<String, String> attributes) {
131     JsonArrayBuilder mustBlobBuilder = Json.createArrayBuilder();
132     for (String key : attributes.keySet()) {
133       mustBlobBuilder.add(getTermBlob(key, attributes.get(key)));
134     }
135     jsonBuilder.add("query", Json.createObjectBuilder().add("bool",
136         Json.createObjectBuilder().add("must", mustBlobBuilder)));
137   }
138
139
140
141   public static JsonObject createSummaryByEntityTypeQuery(Map<String, String> attributes,
142       String groupByKey) {
143     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
144     jsonBuilder.add("size", "0"); // avoid source data
145     if (attributes.size() == 0) {
146       buildZeroTermSummaryQuery(jsonBuilder, groupByKey);
147     } else if (attributes.size() == 1) {
148       Map.Entry<String, String> entry = attributes.entrySet().iterator().next();
149       buildSingleTermSummaryQuery(jsonBuilder, entry.getKey(), entry.getValue(), groupByKey);
150     } else {
151       buildMultiTermSummaryQuery(jsonBuilder, attributes, groupByKey);
152     }
153     return jsonBuilder.build();
154   }
155
156   public static JsonObject createEntityCountsQuery(Map<String, String> attributes) {
157     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
158     if (attributes.size() == 1) {
159       Map.Entry<String, String> entry = attributes.entrySet().iterator().next();
160       buildSingleTermCountQuery(jsonBuilder, entry.getKey(), entry.getValue());
161     } else {
162       buildMultiTermCountQuery(jsonBuilder, attributes);
163     }
164     return jsonBuilder.build();
165   }
166
167   public static JsonArray getSortCriteria(String sortFieldName, String sortOrder) {
168     JsonArrayBuilder jsonBuilder = Json.createArrayBuilder();
169     jsonBuilder.add(Json.createObjectBuilder().add(sortFieldName,
170         Json.createObjectBuilder().add("order", sortOrder)));
171
172     return jsonBuilder.build();
173   }
174 }