chunk method
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);
}
}