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.Arrays;
21 import java.util.Calendar;
22 import java.util.Date;
23 import java.util.List;
24 import java.util.TimeZone;
26 import org.eclipse.jdt.annotation.Nullable;
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.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 public class QueryByFilter {
43 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
44 private static final List<String> timestampValueNames = Arrays.asList("timestamp","start","end");
46 private QueryByFilter() {
50 static long getPage(EntityInput input) {
51 return getPage(input, 1);
54 @SuppressWarnings("null")
55 private static long getPage(EntityInput input, long defaultValue) {
56 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
59 static long getPageSize(EntityInput input) {
60 return getPageSize(input, 1);
63 @SuppressWarnings("null")
64 private static long getPageSize(EntityInput input, long defaultValue) {
65 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
69 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
70 return setSortOrder(query, sortorder, "");
73 private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
74 if (sortorder != null && sortorder.size() > 0) {
75 for (Sortorder so : sortorder) {
76 query.sort((prefix != null ? prefix : "") + so.getProperty(),
77 so.getSortorder() == SortOrder.Ascending
78 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
79 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
87 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
91 for (Sortorder o : list) {
92 if (prop.equals(o.getProperty())) {
99 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
103 for (Filter f : list) {
104 if (prop.equals(f.getProperty())) {
111 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
112 return fromFilter(filters, "");
115 private static String fillTimeStamp(String value) {
116 int idx=value.lastIndexOf("*");
117 final String REPLACE="0000-00-00T00:00:00.0Z";
118 String s = value.substring(0,idx)+REPLACE.substring(idx);
119 if(Integer.parseInt(s.substring(5,7))==0) {
120 s=s.substring(0,5)+"01-"+s.substring(8);
122 if(Integer.parseInt(s.substring(8,10))==0) {
123 s=s.substring(0,8)+"01"+s.substring(10);
129 * convert timestamp with ending placeholder in filter to elasticsearch filter
130 * e.g. 2017* => gte: 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
132 * 201* => 2010-01... 2020 ..
133 * 2018-* => 2018-01... <=> 2019-01
136 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
137 if(!value.endsWith("*")) {
140 int idx=value.lastIndexOf("*");
141 String lowerEnd = fillTimeStamp(value);
142 String upperEnd =null;
143 NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
146 dt=converter.getDateFromNetconf(lowerEnd);
154 // property.substring(0,idx)+REPLACE.substring(idx+1);
155 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
160 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
161 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
164 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
165 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
168 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
169 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
173 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
174 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
176 case 6: //switch 10 months (2000-0* or 2000-1*)
177 tmpvalue = c.get(Calendar.MONTH);
179 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);
205 c.set(Calendar.DAY_OF_MONTH,30);
207 }else if(tmpvalue==30) {
208 c.set(Calendar.DAY_OF_MONTH,1);
209 c.add(Calendar.MONTH,1);
214 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
216 case 10: // (2018-01-01*)
217 case 11: // (2018-01-01T*)
218 c.add(Calendar.DAY_OF_MONTH,1);
219 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
221 case 12: // (2018-01-01T1*)
222 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
224 c.set(Calendar.HOUR_OF_DAY,0);
225 c.add(Calendar.DAY_OF_MONTH,1);
228 c.add(Calendar.HOUR_OF_DAY,10);
230 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
232 case 13: // (2018-01-01T11*)
233 case 14: // (2018-01-01T11-*)
234 c.add(Calendar.HOUR_OF_DAY,1);
235 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
237 case 15: // (2018-01-01T11-3*)
238 c.add(Calendar.MINUTE,10);
239 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
241 case 16: // (2018-01-01T11-32*)
242 case 17: // (2018-01-01T11-32-*)
243 c.add(Calendar.MINUTE,1);
244 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
246 case 18: // (2018-01-01T11-32-1*)
247 c.add(Calendar.SECOND,10);
248 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
250 case 19: // (2018-01-01T11-32-11*)
251 case 20: // (2018-01-01T11-32-11.*)
252 c.add(Calendar.SECOND,1);
253 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
263 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
266 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
267 if (filters == null || filters.size() == 0) {
268 return QueryBuilders.matchAllQuery();
270 } else if (filters.size() == 1) {
272 String p = filters.get(0).getProperty();
273 String v= filters.get(0).getFiltervalue();
274 if ("id".equals(p)) {
278 // v=v.toLowerCase();
280 if (DbFilter.hasSearchParams(v)) {
281 if(p!=null && timestampValueNames.contains(p.toLowerCase())) {
282 query = fromTimestampSearchFilter(p,v);
287 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
290 } else if (DbFilter.isComparisonValid(v)) {
291 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
296 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
300 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
304 BoolQueryBuilder query = new BoolQueryBuilder();
305 QueryBuilder tmpQuery;
306 for (Filter fi : filters) {
307 String p = fi.getProperty();
308 String v=fi.getFiltervalue();
309 if ("id".equals(p)) {
313 // v=v.toLowerCase();
315 if(DbFilter.hasSearchParams(v)) {
316 if(p!=null && timestampValueNames.contains(p.toLowerCase())) {
317 tmpQuery=fromTimestampSearchFilter(p,v);
319 query.must(tmpQuery);
321 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
324 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
327 else if (DbFilter.isComparisonValid(v)) {
328 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
333 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
337 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
340 LOG.trace("Query result. {}", query.toJSON());