getPageByFilterEx method

Future<DataPage<T>> getPageByFilterEx(
  1. String? correlationId,
  2. Map<String, dynamic>? filter,
  3. PagingParams? paging,
  4. Map<String, dynamic>? sort,
)

Gets a page of data items retrieved by a given filter and sorted according to sort parameters.

This method shall be called by a public getPageByFilter method from child class that receives FilterParams and converts them into a filter function.

  • correlationId (optional) transaction id to trace execution through call chain.
  • filter (optional) a filter JSON object
  • paging (optional) paging parameters
  • sort (optional) sorting JSON object Return Future that receives a data page. Throws error

Implementation

Future<DataPage<T>> getPageByFilterEx(
    String? correlationId,
    Map<String, dynamic>? filter,
    PagingParams? paging,
    Map<String, dynamic>? sort) async {
  // Adjust max item count based on configuration
  paging = paging ?? PagingParams();
  var skip = paging.getSkip(-1);
  var take = paging.getTake(maxPageSize);
  var pagingEnabled = paging.total;

  // Configure options
  var query = mngquery.SelectorBuilder();
  if (skip >= 0) query.skip(skip);
  query.limit(take);
  var selector = <String, dynamic>{};
  if (filter != null && filter.isNotEmpty) {
    selector[r'$query'] = filter;
  }
  if (sort != null) {
    selector['orderby'] = sort;
  }
  query.raw(selector);

  var items = <T>[];
  var result = await collection?.find(query).toList();
  for (var item in result ?? []) {
    items.add(convertToPublic(item));
  }
  logger.trace(
      correlationId, 'Retrieved %d from %s', [items.length, collectionName]);
  if (pagingEnabled) {
    var count = await collection?.count(selector) ?? 0;
    return DataPage<T>(items, count);
  } else {
    return DataPage<T>(items, 0);
  }
}