*/
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;
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;
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;
}
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;
}
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";
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);
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());
} 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();
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());
}
}
+ private static String handlePrefix(String prefix, String p) {
+ return (prefix != null ? prefix : "") + p;
+ }
+
}