2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
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;
30 import org.eclipse.jdt.annotation.Nullable;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
33 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
34 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
35 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
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.rev190801.EntityInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
45 public class QueryByFilter {
47 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
48 private static final List<String> timestampValueNames = Arrays.asList("timestamp","start","end");
50 private QueryByFilter() {
54 static long getPage(EntityInput input) {
55 return getPage(input, 1);
58 @SuppressWarnings("null")
59 private static long getPage(EntityInput input, long defaultValue) {
60 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
63 static long getPageSize(EntityInput input) {
64 return getPageSize(input, 1);
67 @SuppressWarnings("null")
68 private static long getPageSize(EntityInput input, long defaultValue) {
69 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
73 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
74 return setSortOrder(query, sortorder, "");
77 private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
78 if (sortorder != null && sortorder.size() > 0) {
79 for (Sortorder so : sortorder) {
80 query.sort((prefix != null ? prefix : "") + so.getProperty(),
81 so.getSortorder() == SortOrder.Ascending
82 ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
83 : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
91 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
95 for (Sortorder o : list) {
96 if (prop.equals(o.getProperty())) {
103 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
107 for (Filter f : list) {
108 if (prop.equals(f.getProperty())) {
115 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
116 return fromFilter(filters, "");
119 private static String fillTimeStamp(String value) {
120 int idx=value.lastIndexOf("*");
121 final String REPLACE="0000-00-00T00:00:00.0Z";
122 String s = value.substring(0,idx)+REPLACE.substring(idx);
123 if(Integer.parseInt(s.substring(5,7))==0) {
124 s=s.substring(0,5)+"01-"+s.substring(8);
126 if(Integer.parseInt(s.substring(8,10))==0) {
127 s=s.substring(0,8)+"01"+s.substring(10);
133 * convert timestamp with ending placeholder in filter to elasticsearch filter
134 * e.g. 2017* => gte: 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
136 * 201* => 2010-01... 2020 ..
137 * 2018-* => 2018-01... <=> 2019-01
140 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
141 if(!value.endsWith("*")) {
144 int idx=value.lastIndexOf("*");
145 String lowerEnd = fillTimeStamp(value);
146 String upperEnd =null;
147 NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
150 dt=converter.getDateFromNetconf(lowerEnd);
158 // property.substring(0,idx)+REPLACE.substring(idx+1);
159 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
164 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
165 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
168 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
169 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
172 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
173 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
177 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
178 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
180 case 6: //switch 10 months (2000-0* or 2000-1*)
181 tmpvalue = c.get(Calendar.MONTH);
183 c.set(Calendar.MONTH,9);
186 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
187 c.set(Calendar.MONTH,0);
189 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
192 case 7: //switch one month (2018-01* or 2018-01-*)
194 c.add(Calendar.MONTH, 1);
195 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
197 case 9: // (2018-01-0*)
198 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
200 c.set(Calendar.DAY_OF_MONTH, 10);
201 }else if(tmpvalue==10) {
202 c.set(Calendar.DAY_OF_MONTH, 20);
203 }else if(tmpvalue==20) {
204 if(c.getActualMaximum(Calendar.DAY_OF_MONTH)<30) {
205 c.set(Calendar.DAY_OF_MONTH,1);
206 c.add(Calendar.MONTH,1);
209 c.set(Calendar.DAY_OF_MONTH,30);
211 }else if(tmpvalue==30) {
212 c.set(Calendar.DAY_OF_MONTH,1);
213 c.add(Calendar.MONTH,1);
218 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
220 case 10: // (2018-01-01*)
221 case 11: // (2018-01-01T*)
222 c.add(Calendar.DAY_OF_MONTH,1);
223 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
225 case 12: // (2018-01-01T1*)
226 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
228 c.set(Calendar.HOUR_OF_DAY,0);
229 c.add(Calendar.DAY_OF_MONTH,1);
232 c.add(Calendar.HOUR_OF_DAY,10);
234 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
236 case 13: // (2018-01-01T11*)
237 case 14: // (2018-01-01T11-*)
238 c.add(Calendar.HOUR_OF_DAY,1);
239 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
241 case 15: // (2018-01-01T11-3*)
242 c.add(Calendar.MINUTE,10);
243 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
245 case 16: // (2018-01-01T11-32*)
246 case 17: // (2018-01-01T11-32-*)
247 c.add(Calendar.MINUTE,1);
248 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
250 case 18: // (2018-01-01T11-32-1*)
251 c.add(Calendar.SECOND,10);
252 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
254 case 19: // (2018-01-01T11-32-11*)
255 case 20: // (2018-01-01T11-32-11.*)
256 c.add(Calendar.SECOND,1);
257 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
267 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
270 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
271 if (filters == null || filters.size() == 0) {
272 return QueryBuilders.matchAllQuery();
274 } else if (filters.size() == 1) {
276 String p = filters.get(0).getProperty();
277 String v= filters.get(0).getFiltervalue();
278 if ("id".equals(p)) {
282 // v=v.toLowerCase();
284 if (DbFilter.hasSearchParams(v)) {
285 if(p!=null && timestampValueNames.contains(p.toLowerCase())) {
286 query = fromTimestampSearchFilter(p,v);
291 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
294 } else if (DbFilter.isComparisonValid(v)) {
295 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
300 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
304 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
308 BoolQueryBuilder query = new BoolQueryBuilder();
309 QueryBuilder tmpQuery;
310 for (Filter fi : filters) {
311 String p = fi.getProperty();
312 String v=fi.getFiltervalue();
313 if ("id".equals(p)) {
317 // v=v.toLowerCase();
319 if(DbFilter.hasSearchParams(v)) {
320 if(p!=null && timestampValueNames.contains(p.toLowerCase())) {
321 tmpQuery=fromTimestampSearchFilter(p,v);
323 query.must(tmpQuery);
325 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
328 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
331 else if (DbFilter.isComparisonValid(v)) {
332 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
337 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
341 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
344 LOG.trace("Query result. {}", query.toJSON());