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.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.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.rev190801.EntityInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
45 class QueryByFilterStatic {
47 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
48 private static final List<String> timestampValueNames = Arrays.asList("timestamp", "start", "end");
50 private QueryByFilterStatic() {
54 static long getPage(EntityInput input) {
55 return getPage(input, 1);
58 private static long getPage(EntityInput input, long defaultValue) {
59 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
62 static long getPageSize(EntityInput input) {
63 return getPageSize(input, 1);
66 private static long getPageSize(EntityInput input, long defaultValue) {
67 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
71 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
72 return setSortOrder(query, sortorder, "");
75 private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
76 if (sortorder != null && sortorder.size() > 0) {
77 for (Sortorder so : sortorder) {
78 query.sort((prefix != null ? prefix : "") + so.getProperty(),
79 so.getSortorder() == SortOrder.Ascending
80 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
81 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
89 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
93 for (Sortorder o : list) {
94 if (prop.equals(o.getProperty())) {
101 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
105 for (Filter f : list) {
106 if (prop.equals(f.getProperty())) {
113 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
114 return fromFilter(filters, "");
117 private static String fillTimeStamp(String value) {
118 int idx = value.lastIndexOf("*");
119 final String REPLACE = "0000-00-00T00:00:00.0Z";
120 String s = value.substring(0, idx) + REPLACE.substring(idx);
121 if (Integer.parseInt(s.substring(5, 7)) == 0) {
122 s = s.substring(0, 5) + "01-" + s.substring(8);
124 if (Integer.parseInt(s.substring(8, 10)) == 0) {
125 s = s.substring(0, 8) + "01" + s.substring(10);
132 * convert timestamp with ending placeholder in filter to elasticsearch filter e.g. 2017* => gte:
133 * 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
135 * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01
138 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) {
139 if (!value.endsWith("*")) {
142 int idx = value.lastIndexOf("*");
143 String lowerEnd = fillTimeStamp(value);
144 String upperEnd = null;
145 NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
148 dt = converter.getDateFromNetconf(lowerEnd);
149 } catch (Exception e) {
155 // property.substring(0,idx)+REPLACE.substring(idx+1);
156 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
161 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000);
162 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
165 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100);
166 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
169 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10);
170 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
174 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
175 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
177 case 6: //switch 10 months (2000-0* or 2000-1*)
178 tmpvalue = c.get(Calendar.MONTH);
180 c.set(Calendar.MONTH, 9);
182 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
183 c.set(Calendar.MONTH, 0);
185 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
188 case 7: //switch one month (2018-01* or 2018-01-*)
190 c.add(Calendar.MONTH, 1);
191 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
193 case 9: // (2018-01-0*)
194 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
196 c.set(Calendar.DAY_OF_MONTH, 10);
197 } else if (tmpvalue == 10) {
198 c.set(Calendar.DAY_OF_MONTH, 20);
199 } else if (tmpvalue == 20) {
200 if (c.getActualMaximum(Calendar.DAY_OF_MONTH) < 30) {
201 c.set(Calendar.DAY_OF_MONTH, 1);
202 c.add(Calendar.MONTH, 1);
204 c.set(Calendar.DAY_OF_MONTH, 30);
206 } else if (tmpvalue == 30) {
207 c.set(Calendar.DAY_OF_MONTH, 1);
208 c.add(Calendar.MONTH, 1);
212 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
214 case 10: // (2018-01-01*)
215 case 11: // (2018-01-01T*)
216 c.add(Calendar.DAY_OF_MONTH, 1);
217 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
219 case 12: // (2018-01-01T1*)
220 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
221 if (tmpvalue == 20) {
222 c.set(Calendar.HOUR_OF_DAY, 0);
223 c.add(Calendar.DAY_OF_MONTH, 1);
225 c.add(Calendar.HOUR_OF_DAY, 10);
227 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
229 case 13: // (2018-01-01T11*)
230 case 14: // (2018-01-01T11-*)
231 c.add(Calendar.HOUR_OF_DAY, 1);
232 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
234 case 15: // (2018-01-01T11-3*)
235 c.add(Calendar.MINUTE, 10);
236 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
238 case 16: // (2018-01-01T11-32*)
239 case 17: // (2018-01-01T11-32-*)
240 c.add(Calendar.MINUTE, 1);
241 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
243 case 18: // (2018-01-01T11-32-1*)
244 c.add(Calendar.SECOND, 10);
245 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
247 case 19: // (2018-01-01T11-32-11*)
248 case 20: // (2018-01-01T11-32-11.*)
249 c.add(Calendar.SECOND, 1);
250 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
257 if (upperEnd == null) {
260 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
264 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
265 if (filters == null || filters.size() == 0) {
266 return QueryBuilders.matchAllQuery();
268 } else if (filters.size() == 1) {
270 String p = filters.get(0).getProperty();
271 String v = filters.get(0).getFiltervalue();
272 if ("id".equals(p)) {
275 // v=v.toLowerCase();
277 if (DbFilter.hasSearchParams(v)) {
278 if (p != null && timestampValueNames.contains(p.toLowerCase())) {
279 query = fromTimestampSearchFilter(p, v);
284 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
287 } else if (DbFilter.isComparisonValid(v)) {
288 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
292 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
295 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
298 BoolQueryBuilder query = new BoolQueryBuilder();
299 QueryBuilder tmpQuery;
300 for (Filter fi : filters) {
301 String p = fi.getProperty();
302 String v = fi.getFiltervalue();
303 if ("id".equals(p)) {
306 // v=v.toLowerCase();
308 if (DbFilter.hasSearchParams(v)) {
309 if (p != null && timestampValueNames.contains(p.toLowerCase())) {
310 tmpQuery = fromTimestampSearchFilter(p, v);
311 if (tmpQuery != null) {
312 query.must(tmpQuery);
314 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
315 DbFilter.createDatabaseRegex(v)));
318 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
319 DbFilter.createDatabaseRegex(v)));
321 } else if (DbFilter.isComparisonValid(v)) {
322 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
326 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
329 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
332 LOG.trace("Query result. {}", query.toJSON());