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.database.elasticsearch.data.rpctypehelper;
24 import java.util.Arrays;
25 import java.util.Calendar;
26 import java.util.Date;
27 import java.util.List;
28 import java.util.TimeZone;
29 import org.eclipse.jdt.annotation.Nullable;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
33 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
34 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.acessor.DataObjectAcessorPm;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EntityInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SortOrder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Filter;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Sortorder;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
46 class QueryByFilterStatic {
48 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
49 private static final List<String> timestampValueNames = Arrays.asList("timestamp", "start", "end");
51 private QueryByFilterStatic() {
55 static long getPage(EntityInput input) {
56 return getPage(input, 1);
59 private static long getPage(EntityInput input, long defaultValue) {
60 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
63 static long getPageSize(EntityInput input) {
64 return getPageSize(input, 1);
67 private static long getPageSize(EntityInput input, long defaultValue) {
68 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
72 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
73 return setSortOrder(query, sortorder, "");
76 private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
77 if (sortorder != null && sortorder.size() > 0) {
78 for (Sortorder so : sortorder) {
79 query.sort((prefix != null ? prefix : "") + so.getProperty(),
80 so.getSortorder() == SortOrder.Ascending
81 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
82 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
90 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
94 for (Sortorder o : list) {
95 if (prop.equals(o.getProperty())) {
102 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
106 for (Filter f : list) {
107 if (prop.equals(f.getProperty())) {
114 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
115 return fromFilter(filters, "");
118 private static String fillTimeStamp(String value) {
119 int idx = value.lastIndexOf("*");
120 final String REPLACE = "0000-00-00T00:00:00.0Z";
121 String s = value.substring(0, idx) + REPLACE.substring(idx);
122 if (Integer.parseInt(s.substring(5, 7)) == 0) {
123 s = s.substring(0, 5) + "01-" + s.substring(8);
125 if (Integer.parseInt(s.substring(8, 10)) == 0) {
126 s = s.substring(0, 8) + "01" + s.substring(10);
133 * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte:
134 * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
136 * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01
139 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) {
140 if (!value.endsWith("*")) {
143 int idx = value.lastIndexOf("*");
144 String lowerEnd = fillTimeStamp(value);
145 String upperEnd = null;
146 NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
149 dt = converter.getDateFromNetconf(lowerEnd);
150 } catch (Exception e) {
156 // property.substring(0,idx)+REPLACE.substring(idx+1);
157 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
162 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000);
163 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
166 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100);
167 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
170 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10);
171 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
175 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
176 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
178 case 6: //switch 10 months (2000-0* or 2000-1*)
179 tmpvalue = c.get(Calendar.MONTH);
181 c.set(Calendar.MONTH, 9);
183 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
184 c.set(Calendar.MONTH, 0);
186 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
189 case 7: //switch one month (2018-01* or 2018-01-*)
191 c.add(Calendar.MONTH, 1);
192 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
194 case 9: // (2018-01-0*)
195 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
197 c.set(Calendar.DAY_OF_MONTH, 10);
198 } else if (tmpvalue == 10) {
199 c.set(Calendar.DAY_OF_MONTH, 20);
200 } else if (tmpvalue == 20) {
201 if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) {
202 c.set(Calendar.DAY_OF_MONTH, 1);
203 c.add(Calendar.MONTH, 1);
205 c.set(Calendar.DAY_OF_MONTH, 30);
207 } else if (tmpvalue == 30) {
208 c.set(Calendar.DAY_OF_MONTH, 1);
209 c.add(Calendar.MONTH, 1);
213 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
215 case 10: // (2018-01-01*)
216 case 11: // (2018-01-01T*)
217 c.add(Calendar.DAY_OF_MONTH, 1);
218 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
220 case 12: // (2018-01-01T1*)
221 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
222 if (tmpvalue == 20) {
223 c.set(Calendar.HOUR_OF_DAY, 0);
224 c.add(Calendar.DAY_OF_MONTH, 1);
226 c.add(Calendar.HOUR_OF_DAY, 10);
228 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
230 case 13: // (2018-01-01T11*)
231 case 14: // (2018-01-01T11-*)
232 c.add(Calendar.HOUR_OF_DAY, 1);
233 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
235 case 15: // (2018-01-01T11-3*)
236 c.add(Calendar.MINUTE, 10);
237 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
239 case 16: // (2018-01-01T11-32*)
240 case 17: // (2018-01-01T11-32-*)
241 c.add(Calendar.MINUTE, 1);
242 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
244 case 18: // (2018-01-01T11-32-1*)
245 c.add(Calendar.SECOND, 10);
246 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
248 case 19: // (2018-01-01T11-32-11*)
249 case 20: // (2018-01-01T11-32-11.*)
250 c.add(Calendar.SECOND, 1);
251 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
258 if (upperEnd == null) {
261 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
265 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
266 if (filters == null || filters.size() == 0) {
267 return QueryBuilders.matchAllQuery();
269 } else if (filters.size() == 1) {
271 String p = filters.get(0).getProperty();
272 String v = filters.get(0).getFiltervalue();
273 if ("id".equals(p)) {
276 // v=v.toLowerCase();
278 if (DbFilter.hasSearchParams(v)) {
279 if (p != null && timestampValueNames.contains(p.toLowerCase())) {
280 query = fromTimestampSearchFilter(p, v);
285 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
288 } else if (DbFilter.isComparisonValid(v)) {
289 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
293 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
296 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
299 BoolQueryBuilder query = new BoolQueryBuilder();
300 QueryBuilder tmpQuery;
301 for (Filter fi : filters) {
302 String p = fi.getProperty();
303 String v = fi.getFiltervalue();
304 if ("id".equals(p)) {
307 // v=v.toLowerCase();
309 if (DbFilter.hasSearchParams(v)) {
310 if (p != null && timestampValueNames.contains(p.toLowerCase())) {
311 tmpQuery = fromTimestampSearchFilter(p, v);
312 if (tmpQuery != null) {
313 query.must(tmpQuery);
315 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
316 DbFilter.createDatabaseRegex(v)));
319 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
320 DbFilter.createDatabaseRegex(v)));
322 } else if (DbFilter.isComparisonValid(v)) {
323 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
327 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
330 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
333 LOG.trace("Query result. {}", query.toJSON());