SDN-R data-provider with ES7
[ccsdk/features.git] / sdnr / wt / data-provider / provider / src / main / java / org / onap / ccsdk / features / sdnr / wt / dataprovider / data / QueryByFilter.java
index b6a5020..4e7bee9 100644 (file)
@@ -21,6 +21,8 @@
  */
 package org.onap.ccsdk.features.sdnr.wt.dataprovider.data;
 
+import java.math.BigInteger;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
@@ -33,11 +35,13 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Pagination;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,48 +51,130 @@ public class QueryByFilter {
     private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
     private static final List<String> timestampValueNames = Arrays.asList("timestamp", "start", "end");
 
-    private QueryByFilter() {
-        //Hide
+    private static List<Sortorder> emptySortOrderList = new ArrayList<>();
+    private static List<Filter> emptyFilterList = new ArrayList<>();
+
+    // Derived from input
+    private long page;
+    private long pageSize;
+    private long fromPage;
+    private List<Filter> filterList;
+    private List<Sortorder> sortOrder;
+
+    /**
+     * Process input from RPC into Queries to database
+     * 
+     * @param input Input from RPC, for test it could be null
+     */
+    public QueryByFilter(EntityInput input) {
+        page = -1;
+        pageSize = -1;
+        if (input != null) {
+            @Nullable
+            Pagination pagination = input.getPagination();
+            if (pagination != null) {
+                BigInteger pageOrNull = pagination.getPage();
+                if (pageOrNull != null) {
+                    page = pageOrNull.longValue();
+                }
+                Long pageSizeOrNull = pagination.getSize();
+                if (pageSizeOrNull != null) {
+                    pageSize = pageSizeOrNull;
+                }
+            }
+        }
+        if (page < 0)
+            page = 1;
+        if (pageSize < 0)
+            pageSize = 1;
+
+        fromPage = (page - 1) * pageSize;
+        if (fromPage < 0 || pageSize > 10000)
+            throw new IllegalArgumentException("mismatching input parameters. From:" + fromPage + " size:" + pageSize);
+
+        filterList = input.getFilter();
+        if (filterList == null)
+            filterList = emptyFilterList;
+        sortOrder = input.getSortorder();
+        if (sortOrder == null)
+            sortOrder = emptySortOrderList;
+
+    }
+
+    public QueryBuilder getQueryBuilderByFilter() {
+        return getQueryBuilderByFilter("");
     }
 
-    static long getPage(EntityInput input) {
-        return getPage(input, 1);
+    public QueryBuilder getQueryBuilderByFilter(String prefix) {
+        QueryBuilder queryBuilder = fromFilter(filterList, prefix).from(fromPage).size(pageSize);
+        setSortOrder(queryBuilder, sortOrder, prefix);
+        return queryBuilder;
     }
 
-    @SuppressWarnings("null")
-    private static long getPage(EntityInput input, long defaultValue) {
-        return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
+    public SearchRequest getSearchRequestByFilter(String nodeKey, String uuidKey, String index, String dataType) {
+        Filter nodeFilter = getFilter(filterList, nodeKey);
+        if (nodeFilter != null) {
+            SearchRequest request = new SearchRequest(index, dataType);
+            request.setQuery(
+                    QueryBuilders.matchQuery(nodeKey, nodeFilter.getFiltervalue()).aggregations(uuidKey).size(0));
+            return request;
+        } else {
+            String msg = "no nodename in filter found ";
+            LOG.debug(msg);
+            throw new IllegalArgumentException(msg);
+        }
     }
 
-    static long getPageSize(EntityInput input) {
-        return getPageSize(input, 1);
+    public SearchRequest getSearchRequestBySortOrder(String nodeKey, String uuidKey, String index, String dataType) {
+        Sortorder soNode = getSortOrder(sortOrder, nodeKey);
+        SearchRequest request = new SearchRequest(index, dataType);
+        QueryBuilder query = null;
+        if (soNode != null) {
+            query = QueryBuilders.matchAllQuery().aggregations(nodeKey, convert(soNode.getSortorder())).size(0);
+        } else {
+            query = QueryBuilders.matchAllQuery().aggregations(nodeKey).size(0);
+        }
+        request.setQuery(query);
+        return request;
     }
 
-    @SuppressWarnings("null")
-    private static long getPageSize(EntityInput input, long defaultValue) {
-        return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
+    public long getPage() {
+        return page;
     }
 
+    public long getPageSize() {
+        return pageSize;
+    }
+
+    public long getPageStartIndex() {
+        return fromPage;
+    }
 
-    public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
-        return setSortOrder(query, sortorder, "");
+    @Override
+    public String toString() {
+        return "QueryByFilter [page=" + page + ", pageSize=" + pageSize + ", fromPage=" + fromPage + ", filterList="
+                + filterList + ", sortOrder=" + sortOrder + "]";
     }
 
+    /*
+     * Private and static implementations
+     */
     private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
         if (sortorder != null && sortorder.size() > 0) {
             for (Sortorder so : sortorder) {
-                query.sort((prefix != null ? prefix : "") + so.getProperty(),
-                        so.getSortorder() == SortOrder.Ascending
-                                ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
-                                : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
+                query.sort(handlePrefix(prefix, so.getProperty()), convert(so.getSortorder()));
             }
         }
         return query;
-
     }
 
+    private static org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder convert(SortOrder sortOrder) {
+        return sortOrder == SortOrder.Ascending
+                ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
+                : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING;
+    };
 
-    public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
+    private static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
         if (list == null) {
             return null;
         }
@@ -100,7 +186,7 @@ public class QueryByFilter {
         return null;
     }
 
-    public static Filter getFilter(@Nullable List<Filter> list, String prop) {
+    private static Filter getFilter(@Nullable List<Filter> list, String prop) {
         if (list == null) {
             return null;
         }
@@ -112,10 +198,6 @@ public class QueryByFilter {
         return null;
     }
 
-    public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
-        return fromFilter(filters, "");
-    }
-
     private static String fillTimeStamp(String value) {
         int idx = value.lastIndexOf("*");
         final String REPLACE = "0000-00-00T00:00:00.0Z";
@@ -176,7 +258,7 @@ public class QueryByFilter {
                 c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
                 break;
-            case 6: //switch 10 months (2000-0* or 2000-1*)
+            case 6: // switch 10 months (2000-0* or 2000-1*)
                 tmpvalue = c.get(Calendar.MONTH);
                 if (tmpvalue < 9) {
                     c.set(Calendar.MONTH, 9);
@@ -187,7 +269,7 @@ public class QueryByFilter {
                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
 
                 break;
-            case 7: //switch one month (2018-01* or 2018-01-*)
+            case 7: // switch one month (2018-01* or 2018-01-*)
             case 8:
                 c.add(Calendar.MONTH, 1);
                 upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
@@ -287,14 +369,14 @@ public class QueryByFilter {
 
 
             } else if (DbFilter.isComparisonValid(v)) {
-                RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
+                RangeQueryBuilder q = DbFilter.getRangeQuery(handlePrefix(prefix, p), v);
                 if (q != null) {
                     return q;
                 } else {
-                    return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
+                    return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
                 }
             } else {
-                return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
+                return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
             }
         } else {
             BoolQueryBuilder query = new BoolQueryBuilder();
@@ -313,22 +395,20 @@ public class QueryByFilter {
                         if (tmpQuery != null) {
                             query.must(tmpQuery);
                         } else {
-                            query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
-                                    DbFilter.createDatabaseRegex(v)));
+                            query.must(QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
                         }
                     } else {
-                        query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,
-                                DbFilter.createDatabaseRegex(v)));
+                        query.must(QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
                     }
                 } else if (DbFilter.isComparisonValid(v)) {
-                    RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
+                    RangeQueryBuilder q = DbFilter.getRangeQuery(handlePrefix(prefix, p), v);
                     if (q != null) {
                         query.must(q);
                     } else {
-                        query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
+                        query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
                     }
                 } else {
-                    query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v));
+                    query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
                 }
             }
             LOG.trace("Query result. {}", query.toJSON());
@@ -336,4 +416,8 @@ public class QueryByFilter {
         }
     }
 
+    private static String handlePrefix(String prefix, String p) {
+        return (prefix != null ? prefix : "") + p;
+    }
+
 }