e09261f7c2a726fddea8f5d7018e04f7b3aa07b8
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
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
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.data.rpctypehelper;
23
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;
44
45 @Deprecated
46 class QueryByFilterStatic {
47
48     private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
49     private static final List<String> timestampValueNames = Arrays.asList("timestamp", "start", "end");
50
51     private QueryByFilterStatic() {
52         //Hide
53     }
54
55     static long getPage(EntityInput input) {
56         return getPage(input, 1);
57     }
58
59     private static long getPage(EntityInput input, long defaultValue) {
60         return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
61     }
62
63     static long getPageSize(EntityInput input) {
64         return getPageSize(input, 1);
65     }
66
67     private static long getPageSize(EntityInput input, long defaultValue) {
68         return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
69     }
70
71
72     public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
73         return setSortOrder(query, sortorder, "");
74     }
75
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);
83             }
84         }
85         return query;
86
87     }
88
89
90     public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
91         if (list == null) {
92             return null;
93         }
94         for (Sortorder o : list) {
95             if (prop.equals(o.getProperty())) {
96                 return o;
97             }
98         }
99         return null;
100     }
101
102     public static Filter getFilter(@Nullable List<Filter> list, String prop) {
103         if (list == null) {
104             return null;
105         }
106         for (Filter f : list) {
107             if (prop.equals(f.getProperty())) {
108                 return f;
109             }
110         }
111         return null;
112     }
113
114     public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
115         return fromFilter(filters, "");
116     }
117
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);
124         }
125         if (Integer.parseInt(s.substring(8, 10)) == 0) {
126             s = s.substring(0, 8) + "01" + s.substring(10);
127         }
128
129         return s;
130     }
131
132     /**
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
135      *
136      * 201* => 2010-01... 2020 .. 2018-* => 2018-01... <=> 2019-01
137      *
138      */
139     private static @Nullable QueryBuilder fromTimestampSearchFilter(String property, String value) {
140         if (!value.endsWith("*")) {
141             return null;
142         }
143         int idx = value.lastIndexOf("*");
144         String lowerEnd = fillTimeStamp(value);
145         String upperEnd = null;
146         NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
147         Date dt = null;
148         try {
149             dt = converter.getDateFromNetconf(lowerEnd);
150         } catch (Exception e) {
151
152         }
153         if (dt == null) {
154             return null;
155         }
156         //        property.substring(0,idx)+REPLACE.substring(idx+1);
157         Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
158         c.setTime(dt);
159         int tmpvalue;
160         switch (idx) {
161             case 1: // (2*)
162                 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1000);
163                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
164                 break;
165             case 2: // (20*)
166                 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 100);
167                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
168                 break;
169             case 3: // (200*)
170                 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 10);
171                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
172                 break;
173             case 4: // (2000*)
174             case 5: // (2000-*)
175                 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
176                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
177                 break;
178             case 6: //switch 10 months (2000-0* or 2000-1*)
179                 tmpvalue = c.get(Calendar.MONTH);
180                 if (tmpvalue < 9) {
181                     c.set(Calendar.MONTH, 9);
182                 } else {
183                     c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
184                     c.set(Calendar.MONTH, 0);
185                 }
186                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
187
188                 break;
189             case 7: //switch one month (2018-01* or 2018-01-*)
190             case 8:
191                 c.add(Calendar.MONTH, 1);
192                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
193                 break;
194             case 9: // (2018-01-0*)
195                 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
196                 if (tmpvalue == 1) {
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);
204                     } else {
205                         c.set(Calendar.DAY_OF_MONTH, 30);
206                     }
207                 } else if (tmpvalue == 30) {
208                     c.set(Calendar.DAY_OF_MONTH, 1);
209                     c.add(Calendar.MONTH, 1);
210                 } else {
211                     break;
212                 }
213                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
214                 break;
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());
219                 break;
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);
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
265     private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
266         if (filters == null || filters.size() == 0) {
267             return QueryBuilders.matchAllQuery();
268
269         } else if (filters.size() == 1) {
270             QueryBuilder query;
271             String p = filters.get(0).getProperty();
272             String v = filters.get(0).getFiltervalue();
273             if ("id".equals(p)) {
274                 p = "_id";
275             } else {
276                 //    v=v.toLowerCase();
277             }
278             if (DbFilter.hasSearchParams(v)) {
279                 if (p != null && timestampValueNames.contains(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                 } else {
293                     return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
294                 }
295             } else {
296                 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
297             }
298         } else {
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)) {
305                     p = "_id";
306                 } else {
307                     //    v=v.toLowerCase();
308                 }
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);
314                         } else {
315                             query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
316                                     DbFilter.createDatabaseRegex(v)));
317                         }
318                     } else {
319                         query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
320                                 DbFilter.createDatabaseRegex(v)));
321                     }
322                 } else if (DbFilter.isComparisonValid(v)) {
323                     RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
324                     if (q != null) {
325                         query.must(q);
326                     } else {
327                         query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
328                     }
329                 } else {
330                     query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
331                 }
332             }
333             LOG.trace("Query result. {}", query.toJSON());
334             return query;
335         }
336     }
337
338 }