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.Calendar;
21 import java.util.Date;
22 import java.util.List;
23 import java.util.TimeZone;
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;
40 public class QueryByFilter {
42 private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
44 private QueryByFilter() {
48 static long getPage(EntityInput input) {
49 return getPage(input, 1);
52 @SuppressWarnings("null")
53 private static long getPage(EntityInput input, long defaultValue) {
54 return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
57 static long getPageSize(EntityInput input) {
58 return getPageSize(input, 1);
61 @SuppressWarnings("null")
62 private static long getPageSize(EntityInput input, long defaultValue) {
63 return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
67 public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
68 return setSortOrder(query, sortorder, "");
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);
85 public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
89 for (Sortorder o : list) {
90 if (prop.equals(o.getProperty())) {
97 public static Filter getFilter(@Nullable List<Filter> list, String prop) {
101 for (Filter f : list) {
102 if (prop.equals(f.getProperty())) {
109 public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
110 return fromFilter(filters, "");
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);
120 if(Integer.parseInt(s.substring(8,10))==0) {
121 s=s.substring(0,8)+"01"+s.substring(10);
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
130 * 201* => 2010-01... 2020 ..
131 * 2018-* => 2018-01... <=> 2019-01
134 private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
135 if(!value.endsWith("*")) {
138 int idx=value.lastIndexOf("*");
139 String lowerEnd = fillTimeStamp(value);
140 String upperEnd =null;
141 NetconfTimeStamp converter = NetconfTimeStampImpl.getConverter();
144 dt=converter.getDateFromNetconf(lowerEnd);
152 // property.substring(0,idx)+REPLACE.substring(idx+1);
153 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
158 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
159 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
162 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
163 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
166 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
167 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
171 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
172 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
174 case 6: //switch 10 months (2000-0* or 2000-1*)
175 tmpvalue = c.get(Calendar.MONTH);
177 c.set(Calendar.MONTH,9);
180 c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
181 c.set(Calendar.MONTH,0);
183 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
186 case 7: //switch one month (2018-01* or 2018-01-*)
188 c.add(Calendar.MONTH, 1);
189 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
191 case 9: // (2018-01-0*)
192 tmpvalue = c.get(Calendar.DAY_OF_MONTH);
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);
203 c.set(Calendar.DAY_OF_MONTH,30);
205 }else if(tmpvalue==30) {
206 c.set(Calendar.DAY_OF_MONTH,1);
207 c.add(Calendar.MONTH,1);
212 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
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());
219 case 12: // (2018-01-01T1*)
220 tmpvalue = c.get(Calendar.HOUR_OF_DAY);
222 c.set(Calendar.HOUR_OF_DAY,0);
223 c.add(Calendar.DAY_OF_MONTH,1);
226 c.add(Calendar.HOUR_OF_DAY,10);
228 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
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());
235 case 15: // (2018-01-01T11-3*)
236 c.add(Calendar.MINUTE,10);
237 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
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());
244 case 18: // (2018-01-01T11-32-1*)
245 c.add(Calendar.SECOND,10);
246 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
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());
261 return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
264 private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
265 if (filters == null || filters.size() == 0) {
266 return QueryBuilders.matchAllQuery();
268 } else if (filters.size() == 1) {
270 String p = filters.get(0).getProperty();
271 String v= filters.get(0).getFiltervalue();
272 if ("id".equals(p)) {
276 // v=v.toLowerCase();
278 if (DbFilter.hasSearchParams(v)) {
279 if(p!=null && "timestamp".equals(p.toLowerCase())) {
280 query = fromTimestampSearchFilter(p,v);
285 return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
288 } else if (DbFilter.isComparisonValid(v)) {
289 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
294 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
298 return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
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)) {
311 // v=v.toLowerCase();
313 if(DbFilter.hasSearchParams(v)) {
314 if(p!=null && "timestamp".equals(p.toLowerCase())) {
315 tmpQuery=fromTimestampSearchFilter(p,v);
317 query.must(tmpQuery);
319 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
322 query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
325 else if (DbFilter.isComparisonValid(v)) {
326 RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
331 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
335 query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
338 LOG.trace("Query result. {}", query.toJSON());