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());