2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
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=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.List;
27 import org.json.JSONObject;
28 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
29 import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
33 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder;
34 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.Search7Request;
35 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
36 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
37 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
38 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeChildObject;
39 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeObject;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
43 * @author Michael Dürre
46 public class DataTreeProviderImpl {
48 private static final long MAXSIZE_PERSEARCH = 10;
49 private HtDatabaseClient dbClient;
50 private static final String INVENTORY_PROPERTY_TREELEVEL = "tree-level";
51 private static final String INVENTORY_PROPERTY_NODEID = "node-id";
52 private static final String INVENTORY_PROPERTY_UUID = "uuid";
53 private static final String INVENTORY_PROPERTY_PARENTUUID = "parent-uuid";
54 private static final String INVENTORY_PROPERTY_FOR_LABEL_CHILD = "uuid";
55 private static final String INVENTORY_PROPERTY_FOR_LABEL = "uuid";
57 private List<SearchHit> search(Entity e, String filter, String propTreeLevel) throws IOException {
58 return this.search(e, filter, null, null, null, null, null, null, propTreeLevel);
61 private List<SearchHit> search(Entity e, String filter, String nodeKey, String nodeId, String parentKey,
62 String parentValue, String childKey, String childValue, String propTreeLevel) throws IOException {
64 filter == null ? QueryBuilders.matchAllQuery() : QueryBuilders.searchAllFieldsQuery(filter);
65 if ((nodeId != null && nodeKey != null) || (parentKey != null && parentValue != null)) {
66 BoolQueryBuilder bquery = new BoolQueryBuilder();
71 bquery.must(QueryBuilders.matchQuery(nodeKey, nodeId));
76 return this.search(e, query, propTreeLevel);
79 private List<SearchHit> search(Entity e, QueryBuilder query, String propTreeLevel) throws IOException {
80 List<SearchHit> list = new ArrayList<SearchHit>();
81 query.sort(propTreeLevel, SortOrder.ASCENDING);
82 SearchRequest request = new Search7Request(Entity.Inventoryequipment.getName());
83 query.size(MAXSIZE_PERSEARCH);
84 request.setQuery(query);
85 SearchResponse response = this.dbClient.search(request);
86 SearchHit[] matches = response.getHits();
87 for (SearchHit hit : matches) {
90 if (response.getTotal() > MAXSIZE_PERSEARCH) {
91 long todo = response.getTotal();
92 long from = MAXSIZE_PERSEARCH;
94 request.setQuery(query.from(from));
95 from += MAXSIZE_PERSEARCH;
97 response = this.dbClient.search(request);
98 matches = response.getHits();
99 for (SearchHit hit : matches) {
108 * @param iNVENTORY_PROPERTY_NODEID2
110 * @throws IOException
112 private AggregationEntries searchAggregated(Entity e, String key) throws IOException {
113 QueryBuilder query = QueryBuilders.matchAllQuery().aggregations(key).size(MAXSIZE_PERSEARCH);
114 SearchRequest request = new Search7Request(e.getName());
115 request.setQuery(query);
116 SearchResponse response = this.dbClient.search(request);
117 return response.getAggregations(key);
126 * @throws IOException
128 public DataTreeObject readInventoryTree(List<String> tree, String filter) throws IOException {
130 //root nodes will be node-information -> below inventory
131 if (tree == null || tree.size() <= 0) {
132 return this.readInventoryTreeWithNode(filter);
134 //root node will be inventory on tree-level if sliced treePath
136 return this.readInventoryTreeForNode(tree.get(0), tree.subList(0, tree.size() - 1), filter);
148 private DataTreeObject readInventoryTreeForNode(String nodeId, List<String> list, String filter)
150 DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
151 final String parentUuid = list.size() > 1 ? list.get(list.size() - 2) : null;
152 final String uuid = list.size() > 0 ? list.get(list.size() - 1) : null;
153 List<SearchHit> matches = this.search(Entity.Inventoryequipment, filter, INVENTORY_PROPERTY_NODEID, nodeId,
154 INVENTORY_PROPERTY_PARENTUUID, parentUuid, INVENTORY_PROPERTY_UUID, uuid, INVENTORY_PROPERTY_TREELEVEL);
156 //tree.a(subtreePath);
157 List<SearchHit> others = this.search(Entity.Inventoryequipment, (String) null, INVENTORY_PROPERTY_NODEID, nodeId,
158 null, null, null, null, INVENTORY_PROPERTY_TREELEVEL);
159 if (matches.size() > 0) {
160 int treeLevelToStart = (list == null || list.size() <= 0) ? 0 : list.size() - 1;
164 for (SearchHit hit : matches) {
165 hitData = hit.getSource();
166 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == treeLevelToStart) {
167 tree.put(hit.getId(),
168 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true)
169 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
170 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
171 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
174 for (SearchHit hit : others) {
175 hitData = hit.getSource();
176 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == treeLevelToStart) {
177 tree.putIfNotExists(hit.getId(),
178 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false)
179 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
180 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
181 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
185 for (SearchHit hit : matches) {
186 hitData = hit.getSource();
187 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > treeLevelToStart) {
188 tree.put(hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) - treeLevelToStart - 1, hit.getId(),
189 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true)
190 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
191 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
192 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
195 for (SearchHit hit : others) {
196 hitData = hit.getSource();
197 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > treeLevelToStart) {
198 tree.putIfNotExists(hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) - treeLevelToStart - 1, hit.getId(),
199 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false)
200 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
201 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
202 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
205 tree.removeUnmatchedPaths();
211 * node will be root elements inventory information below from level-1
215 * @throws IOException
217 private DataTreeObject readInventoryTreeWithNode(String filter) throws IOException {
218 DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
220 List<SearchHit> matches = this.search(Entity.Inventoryequipment, filter, INVENTORY_PROPERTY_TREELEVEL);
221 List<SearchHit> others = null;
222 if (matches.size() > 0) {
223 if (filter != null) {
224 //find all parents up to tree-level 0
226 List<String> alreadyInList = new ArrayList<>();
227 BoolQueryBuilder query2 = QueryBuilders.boolQuery();
228 for (SearchHit hit : matches) {
229 nodeId = hit.getSource().getString(INVENTORY_PROPERTY_NODEID);
230 if (alreadyInList.contains(nodeId)) {
233 query2.should(QueryBuilders.matchQuery(INVENTORY_PROPERTY_NODEID, nodeId));
234 alreadyInList.add(nodeId);
236 new DataTreeChildObject(nodeId, false).setProperty(INVENTORY_PROPERTY_UUID, nodeId));
239 others = this.search(Entity.Inventoryequipment, query2, INVENTORY_PROPERTY_TREELEVEL);
241 AggregationEntries nodes = this.searchAggregated(Entity.Inventoryequipment, INVENTORY_PROPERTY_NODEID);
242 for (String node : nodes.keySet()) {
243 tree.put(node, new DataTreeChildObject(node, false).setProperty(INVENTORY_PROPERTY_UUID, node));
250 for (SearchHit hit : matches) {
251 hitData = hit.getSource();
252 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == 0) {
253 tree.put(0, hit.getId(),
254 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), true)
255 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
256 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
257 hitData.getString(INVENTORY_PROPERTY_NODEID)));
260 if (others != null) {
261 for (SearchHit hit : others) {
262 hitData = hit.getSource();
263 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) == 0) {
264 tree.putIfNotExists(0, hit.getId(),
265 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL), false)
266 .setProperty(INVENTORY_PROPERTY_UUID,
267 hitData.getString(INVENTORY_PROPERTY_UUID))
268 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
269 hitData.getString(INVENTORY_PROPERTY_NODEID)));
273 //fill child elements
274 for (SearchHit hit : matches) {
275 hitData = hit.getSource();
276 long treeLevel = hitData.getLong(INVENTORY_PROPERTY_TREELEVEL);
278 tree.put(treeLevel, hit.getId(),
279 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL_CHILD), true)
280 .setProperty(INVENTORY_PROPERTY_UUID, hitData.getString(INVENTORY_PROPERTY_UUID))
281 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
282 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
285 if (others != null) {
286 for (SearchHit hit : others) {
287 hitData = hit.getSource();
288 long treeLevel = hitData.getLong(INVENTORY_PROPERTY_TREELEVEL);
289 if (hitData.getLong(INVENTORY_PROPERTY_TREELEVEL) > 0) {
290 tree.putIfNotExists(treeLevel, hit.getId(),
291 new DataTreeChildObject(hitData.getString(INVENTORY_PROPERTY_FOR_LABEL_CHILD), false)
292 .setProperty(INVENTORY_PROPERTY_UUID,
293 hitData.getString(INVENTORY_PROPERTY_UUID))
294 .setProperty(INVENTORY_PROPERTY_PARENTUUID,
295 hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
299 tree.removeUnmatchedPaths();
310 public void setDatabaseClient(HtDatabaseClient client) {
311 this.dbClient = client;