db527959c64ed48583e887183cb68a0aebd3dc33
[ccsdk/features.git] /
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
19
20 import java.util.Calendar;
21 import java.util.Date;
22 import java.util.List;
23 import java.util.TimeZone;
24
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
27 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
28 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
29 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
31 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
32 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 public class QueryByFilter {
41
42      private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
43
44      private QueryByFilter() {
45          //Hide
46      }
47
48     static long getPage(EntityInput input) {
49         return getPage(input, 1);
50     }
51
52     @SuppressWarnings("null")
53     private static long getPage(EntityInput input, long defaultValue) {
54         return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
55     }
56
57     static long getPageSize(EntityInput input) {
58         return getPageSize(input, 1);
59     }
60
61     @SuppressWarnings("null")
62     private static long getPageSize(EntityInput input, long defaultValue) {
63         return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
64     }
65
66
67     public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
68         return setSortOrder(query, sortorder, "");
69     }
70
71     private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
72         if (sortorder != null && sortorder.size() > 0) {
73             for (Sortorder so : sortorder) {
74                 query.sort((prefix != null ? prefix : "") + so.getProperty(),
75                         so.getSortorder() == SortOrder.Ascending
76                                 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
77                                 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
78             }
79         }
80         return query;
81
82     }
83
84
85      public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
86         if (list == null) {
87             return null;
88         }
89         for (Sortorder o : list) {
90             if (prop.equals(o.getProperty())) {
91                 return o;
92             }
93         }
94         return null;
95     }
96
97      public static Filter getFilter(@Nullable List<Filter> list, String prop) {
98         if (list == null) {
99             return null;
100         }
101         for (Filter f : list) {
102             if (prop.equals(f.getProperty())) {
103                 return f;
104             }
105         }
106         return null;
107     }
108
109      public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
110         return fromFilter(filters, "");
111     }
112
113      private static String fillTimeStamp(String value) {
114         int idx=value.lastIndexOf("*");
115         final String REPLACE="0000-00-00T00:00:00.0Z";
116         String s = value.substring(0,idx)+REPLACE.substring(idx);
117         if(Integer.parseInt(s.substring(5,7))==0) {
118             s=s.substring(0,5)+"01-"+s.substring(8);
119         }
120         if(Integer.parseInt(s.substring(8,10))==0) {
121             s=s.substring(0,8)+"01"+s.substring(10);
122         }
123
124         return s;
125      }
126      /**
127       * convert timestamp with ending placeholder in filter to elasticsearch filter
128       * e.g. 2017* => gte: 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
129       *
130       * 201*   => 2010-01... 2020 ..
131       * 2018-* => 2018-01... <=> 2019-01
132       *
133       */
134     private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
135         if(!value.endsWith("*")) {
136             return null;
137         }
138         int idx=value.lastIndexOf("*");
139         String lowerEnd = fillTimeStamp(value);
140         String upperEnd =null;
141         NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
142         Date dt = null;
143         try{
144             dt=converter.getDateFromNetconf(lowerEnd);
145         }
146         catch(Exception e) {
147
148         }
149         if(dt==null) {
150             return null;
151         }
152 //        property.substring(0,idx)+REPLACE.substring(idx+1);
153         Calendar c  = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
154         c.setTime(dt);
155         int tmpvalue;
156         switch(idx) {
157         case 1:  // (2*)
158             c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
159             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
160             break;
161         case 2:  // (20*)
162             c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
163             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
164             break;
165         case 3:  // (200*)
166             c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
167             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
168             break;
169         case 4:  // (2000*)
170         case 5:  // (2000-*)
171             c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
172             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
173             break;
174         case 6: //switch 10 months (2000-0* or 2000-1*)
175             tmpvalue = c.get(Calendar.MONTH);
176                 if(tmpvalue<9) {
177                     c.set(Calendar.MONTH,9);
178                 }
179                 else {
180                     c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
181                     c.set(Calendar.MONTH,0);
182                 }
183                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
184
185             break;
186         case 7: //switch one month (2018-01* or 2018-01-*)
187         case 8:
188             c.add(Calendar.MONTH, 1);
189             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
190             break;
191         case 9: // (2018-01-0*)
192             tmpvalue = c.get(Calendar.DAY_OF_MONTH);
193             if(tmpvalue==1) {
194                 c.set(Calendar.DAY_OF_MONTH, 10);
195             }else if(tmpvalue==10) {
196                 c.set(Calendar.DAY_OF_MONTH, 20);
197             }else if(tmpvalue==20) {
198                 if(c.getActualMaximum(Calendar.DAY_OF_MONTH)<30) {
199                     c.set(Calendar.DAY_OF_MONTH,1);
200                     c.add(Calendar.MONTH,1);
201                 }
202                 else {
203                     c.set(Calendar.DAY_OF_MONTH,30);
204                 }
205             }else if(tmpvalue==30) {
206                 c.set(Calendar.DAY_OF_MONTH,1);
207                 c.add(Calendar.MONTH,1);
208             }
209             else {
210                 break;
211             }
212             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
213             break;
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());
218             break;
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);
224             }
225             else {
226                 c.add(Calendar.HOUR_OF_DAY,10);
227             }
228             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
229             break;
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());
234             break;
235         case 15: // (2018-01-01T11-3*)
236             c.add(Calendar.MINUTE,10);
237             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
238             break;
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());
243             break;
244         case 18: // (2018-01-01T11-32-1*)
245             c.add(Calendar.SECOND,10);
246             upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
247             break;
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());
252             break;
253
254             default:
255                 break;
256         }
257
258         if(upperEnd==null) {
259             return null;
260         }
261         return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
262
263     }
264     private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
265         if (filters == null || filters.size() == 0) {
266             return QueryBuilders.matchAllQuery();
267
268         } else if (filters.size() == 1) {
269             QueryBuilder query;
270             String p = filters.get(0).getProperty();
271             String v= filters.get(0).getFiltervalue();
272             if ("id".equals(p)) {
273                 p = "_id";
274             }
275             else {
276             //    v=v.toLowerCase();
277             }
278             if (DbFilter.hasSearchParams(v)) {
279                 if(p!=null && "timestamp".equals(p.toLowerCase())) {
280                     query = fromTimestampSearchFilter(p,v);
281                     if(query!=null) {
282                         return query;
283                     }
284                 }
285                 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
286
287
288             } else if (DbFilter.isComparisonValid(v)) {
289                 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
290                 if (q != null) {
291                     return q;
292                 }
293                 else {
294                     return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
295                 }
296             }
297             else {
298                 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
299             }
300         }
301         else {
302             BoolQueryBuilder query = new BoolQueryBuilder();
303             QueryBuilder tmpQuery;
304             for (Filter fi : filters) {
305                 String p = fi.getProperty();
306                 String v=fi.getFiltervalue();
307                 if ("id".equals(p)) {
308                     p = "_id";
309                 }
310                 else {
311                 //    v=v.toLowerCase();
312                 }
313                 if(DbFilter.hasSearchParams(v)) {
314                     if(p!=null && "timestamp".equals(p.toLowerCase())) {
315                         tmpQuery=fromTimestampSearchFilter(p,v);
316                         if(tmpQuery!=null) {
317                             query.must(tmpQuery);
318                         }else {
319                             query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
320                         }
321                     }else {
322                         query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
323                     }
324                 }
325                 else if (DbFilter.isComparisonValid(v)) {
326                     RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
327                     if(q!=null) {
328                         query.must(q);
329                     }
330                     else {
331                         query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
332                     }
333                 }
334                 else {
335                     query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
336                 }
337             }
338             LOG.trace("Query result. {}", query.toJSON());
339             return query;
340         }
341     }
342
343 }