f00ffb546747476c75989251761dee021581fb36
[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.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;
38
39 public class QueryByFilter {
40
41         private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
42
43         private QueryByFilter() {
44                 //Hide
45         }
46
47         static long getPage(EntityInput input) {
48                 return getPage(input, 1);
49         }
50
51         @SuppressWarnings("null")
52         private static long getPage(EntityInput input, long defaultValue) {
53                 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
54         }
55
56         static long getPageSize(EntityInput input) {
57                 return getPageSize(input, 1);
58         }
59
60         @SuppressWarnings("null")
61         private static long getPageSize(EntityInput input, long defaultValue) {
62                 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
63         }
64
65
66         public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
67                 return setSortOrder(query, sortorder, "");
68         }
69
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);
77                         }
78                 }
79                 return query;
80
81         }
82
83
84          public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
85                 if (list == null) {
86                         return null;
87                 }
88                 for (Sortorder o : list) {
89                         if (prop.equals(o.getProperty())) {
90                                 return o;
91                         }
92                 }
93                 return null;
94         }
95
96          public static Filter getFilter(@Nullable List<Filter> list, String prop) {
97                 if (list == null) {
98                         return null;
99                 }
100                 for (Filter f : list) {
101                         if (prop.equals(f.getProperty())) {
102                                 return f;
103                         }
104                 }
105                 return null;
106         }
107
108          public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
109                 return fromFilter(filters, "");
110         }
111
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);
118                 }
119                 if(Integer.parseInt(s.substring(8,10))==0) {
120                         s=s.substring(0,8)+"01"+s.substring(10);
121                 }
122                 
123                 return s;
124          }
125          /**
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
128           * 
129           * 201*   => 2010-01... 2020 ..
130           * 2018-* => 2018-01... <=> 2019-01
131           * 
132           */
133         private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
134                 if(!value.endsWith("*")) {
135                         return null;
136                 }
137                 int idx=value.lastIndexOf("*");
138                 String lowerEnd = fillTimeStamp(value);
139                 String upperEnd =null;
140                 NetconfTimeStamp converter = NetconfTimeStamp.getConverter();
141                 Date dt = null;
142                 try{
143                         dt=converter.getDateFromNetconf(lowerEnd);
144                 }
145                 catch(Exception e) {
146                         
147                 }
148                 if(dt==null) {
149                         return null;
150                 }
151 //              property.substring(0,idx)+REPLACE.substring(idx+1);
152                 Calendar c  = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
153                 c.setTime(dt);
154                 int tmpvalue;
155                 switch(idx) {
156                 case 1:  // (2*)
157                         c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
158                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
159                         break;
160                 case 2:  // (20*)
161                         c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
162                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
163                         break;
164                 case 3:  // (200*)
165                         c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
166                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
167                         break;
168                 case 4:  // (2000*)
169                 case 5:  // (2000-*)
170                         c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
171                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
172                         break;
173                 case 6: //switch 10 months (2000-0* or 2000-1*)
174                         tmpvalue = c.get(Calendar.MONTH);
175                                 if(tmpvalue<9) {
176                                         c.set(Calendar.MONTH,9);
177                                 }
178                                 else {
179                                         c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
180                                         c.set(Calendar.MONTH,0);                
181                                 }
182                                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
183                         
184                         break;
185                 case 7: //switch one month (2018-01* or 2018-01-*)
186                 case 8:
187                         c.add(Calendar.MONTH, 1);
188                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
189                         break;
190                 case 9: // (2018-01-0*)
191                         tmpvalue = c.get(Calendar.DAY_OF_MONTH);
192                         if(tmpvalue==1) {
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);
200                                 }
201                                 else {
202                                         c.set(Calendar.DAY_OF_MONTH,30);
203                                 }
204                         }else if(tmpvalue==30) {
205                                 c.set(Calendar.DAY_OF_MONTH,1);
206                                 c.add(Calendar.MONTH,1);
207                         }
208                         else {
209                                 break;
210                         }
211                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
212                         break;
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());
217                         break;
218                 case 12: // (2018-01-01T1*)
219                         tmpvalue = c.get(Calendar.HOUR_OF_DAY);
220                         if(tmpvalue==20) {
221                                 c.set(Calendar.HOUR_OF_DAY,0);
222                                 c.add(Calendar.DAY_OF_MONTH,1);
223                         }
224                         else {
225                                 c.add(Calendar.HOUR_OF_DAY,10);
226                         }
227                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
228                         break;
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());
233                         break;
234                 case 15: // (2018-01-01T11-3*)
235                         c.add(Calendar.MINUTE,10);      
236                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
237                         break;
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());
242                         break;
243                 case 18: // (2018-01-01T11-32-1*)
244                         c.add(Calendar.SECOND,10);      
245                         upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
246                         break;
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());
251                         break;
252                 
253                         default:
254                                 break;
255                 }
256                  
257                 if(upperEnd==null) {
258                         return null;
259                 }
260                 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
261                 
262         }
263         private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
264                 if (filters == null || filters.size() == 0) {
265                         return QueryBuilders.matchAllQuery();
266
267                 } else if (filters.size() == 1) {
268                         QueryBuilder query;
269                         String p = filters.get(0).getProperty();
270                         String v= filters.get(0).getFiltervalue();
271                         if ("id".equals(p)) {
272                                 p = "_id";
273                         }
274                         else {
275                         //      v=v.toLowerCase();
276                         }
277                         if (DbFilter.hasSearchParams(v)) {
278                                 if(p!=null && "timestamp".equals(p.toLowerCase())) {
279                                         query = fromTimestampSearchFilter(p,v);
280                                         if(query!=null) {
281                                                 return query;
282                                         }
283                                 }
284                                 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
285                                                 
286                                 
287                         } else if (DbFilter.isComparisonValid(v)) {
288                                 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
289                                 if (q != null) {
290                                         return q;
291                                 }
292                                 else {
293                                         return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
294                                 }
295                         }
296                         else {
297                                 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
298                         }
299                 }
300                 else {
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)) {
307                                         p = "_id";
308                                 }
309                                 else {
310                                 //      v=v.toLowerCase();
311                                 }
312                                 if(DbFilter.hasSearchParams(v)) {
313                                         if(p!=null && "timestamp".equals(p.toLowerCase())) {
314                                                 tmpQuery=fromTimestampSearchFilter(p,v);
315                                                 if(tmpQuery!=null) {
316                                                         query.must(tmpQuery);
317                                                 }else {
318                                                         query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
319                                                 }
320                                         }else {
321                                                 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
322                                         }
323                                 }
324                                 else if (DbFilter.isComparisonValid(v)) {
325                                         RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
326                                         if(q!=null) {
327                                                 query.must(q);
328                                         }
329                                         else {
330                                                 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
331                                         }
332                                 }
333                                 else {
334                                         query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
335                                 }
336                         }
337                         LOG.trace("Query result. {}", query.toJSON());
338                         return query;
339                 }
340         }
341
342 }