1 /*******************************************************************************
2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
17 ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
20 import java.util.Calendar;
21 import java.util.Date;
22 import java.util.List;
23 import java.util.TimeZone;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.onap.ccsdk.features.sdnr.wt.base.netconf.util.NetconfTimeStamp;
27 import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
28 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
29 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
39 public class QueryByFilter {
41 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
43 private QueryByFilter() {
47 static long getPage(EntityInput input) {
48 return getPage(input, 1);
51 @SuppressWarnings("null")
52 private static long getPage(EntityInput input, long defaultValue) {
53 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
56 static long getPageSize(EntityInput input) {
57 return getPageSize(input, 1);
60 @SuppressWarnings("null")
61 private static long getPageSize(EntityInput input, long defaultValue) {
62 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
66 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
67 return setSortOrder(query, sortorder, "");
70 private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
71 if (sortorder != null && sortorder.size() > 0) {
72 for (Sortorder so : sortorder) {
73 query.sort((prefix != null ? prefix : "") + so.getProperty(),
74 so.getSortorder() == SortOrder.Ascending
75 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
76 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
84 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
88 for (Sortorder o : list) {
89 if (prop.equals(o.getProperty())) {
96 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
100 for (Filter f : list) {
101 if (prop.equals(f.getProperty())) {
108 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
109 return fromFilter(filters, "");
112 private static String fillTimeStamp(String value) {
113 int idx=value.lastIndexOf("*");
114 final String REPLACE="0000-00-00T00:00:00.0Z";
115 String s = value.substring(0,idx)+REPLACE.substring(idx);
116 if(Integer.parseInt(s.substring(5,7))==0) {
117 s=s.substring(0,5)+"01-"+s.substring(8);
119 if(Integer.parseInt(s.substring(8,10))==0) {
120 s=s.substring(0,8)+"01"+s.substring(10);
126 * convert timestamp with ending placeholder in filter to elasticsearch filter
127 * e.g. 2017* => gte: 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
129 * 201* => 2010-01... 2020 ..
130 * 2018-* => 2018-01... <=> 2019-01
133 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
134 if(!value.endsWith("*")) {
137 int idx=value.lastIndexOf("*");
138 String lowerEnd = fillTimeStamp(value);
139 String upperEnd =null;
140 NetconfTimeStamp converter = NetconfTimeStamp.getConverter();
143 dt=converter.getDateFromNetconf(lowerEnd);
151 // property.substring(0,idx)+REPLACE.substring(idx+1);
152 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
157 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
158 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
161 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
162 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
165 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
166 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
170 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
171 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
173 case 6: //switch 10 months (2000-0* or 2000-1*)
174 tmpvalue = c.get(Calendar.MONTH);
176 c.set(Calendar.MONTH,9);
179 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
180 c.set(Calendar.MONTH,0);
182 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
185 case 7: //switch one month (2018-01* or 2018-01-*)
187 c.add(Calendar.MONTH, 1);
188 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
190 case 9: // (2018-01-0*)
191 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
193 c.set(Calendar.DAY_OF_MONTH, 10);
194 }else if(tmpvalue==10) {
195 c.set(Calendar.DAY_OF_MONTH, 20);
196 }else if(tmpvalue==20) {
197 if(c.getActualMaximum(Calendar.DAY_OF_MONTH)<30) {
198 c.set(Calendar.DAY_OF_MONTH,1);
199 c.add(Calendar.MONTH,1);
202 c.set(Calendar.DAY_OF_MONTH,30);
204 }else if(tmpvalue==30) {
205 c.set(Calendar.DAY_OF_MONTH,1);
206 c.add(Calendar.MONTH,1);
211 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
213 case 10: // (2018-01-01*)
214 case 11: // (2018-01-01T*)
215 c.add(Calendar.DAY_OF_MONTH,1);
216 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
218 case 12: // (2018-01-01T1*)
219 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
221 c.set(Calendar.HOUR_OF_DAY,0);
222 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());
260 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
263 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
264 if (filters == null || filters.size() == 0) {
265 return QueryBuilders.matchAllQuery();
267 } else if (filters.size() == 1) {
269 String p = filters.get(0).getProperty();
270 String v= filters.get(0).getFiltervalue();
271 if ("id".equals(p)) {
275 // v=v.toLowerCase();
277 if (DbFilter.hasSearchParams(v)) {
278 if(p!=null && "timestamp".equals(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);
293 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
297 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
301 BoolQueryBuilder query = new BoolQueryBuilder();
302 QueryBuilder tmpQuery;
303 for (Filter fi : filters) {
304 String p = fi.getProperty();
305 String v=fi.getFiltervalue();
306 if ("id".equals(p)) {
310 // v=v.toLowerCase();
312 if(DbFilter.hasSearchParams(v)) {
313 if(p!=null && "timestamp".equals(p.toLowerCase())) {
314 tmpQuery=fromTimestampSearchFilter(p,v);
316 query.must(tmpQuery);
318 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
321 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
324 else if (DbFilter.isComparisonValid(v)) {
325 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
330 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
334 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
337 LOG.trace("Query result. {}", query.toJSON());