chunk method

Stream<List<R>> chunk({
  1. int size = 500,
})

Keyset chunks of projected rows. OFFSET is not used.

Implementation

Stream<List<R>> chunk({int size = 500}) async* {
  if (size <= 0) {
    throw ArgumentError.value(size, 'size', 'Must be positive.');
  }
  final base = _select;
  if (base.ordering.isEmpty) {
    throw StateError(
      'Projection ${projection.name} needs an explicit unique orderBy '
      'before chunk(). The root primary key is not added.',
    );
  }
  MssqlKeyset.requireProjectedColumns(
    base.ordering,
    projection.columns.map((c) => c.alias),
    projection.name,
  );
  final dialect = await _resolvedDialect();
  final orders = base.ordering;
  List<Object?>? after;
  while (true) {
    var query = base;
    if (after != null) {
      query = query.where(MssqlKeyset.after(orders, after));
    }
    final fetched = await query
        .top(size)
        .get(
          session,
          dialect: dialect,
          timeout: timeout,
          cancellationToken: options.cancellationToken,
          options: options,
        );
    if (fetched.isEmpty) return;
    yield fetched.map(_map).toList(growable: false);
    if (fetched.length < size) return;
    after = MssqlKeyset.keysFromRow(fetched.last, orders);
  }
}