batchKeys function

List<List<MssqlRelationKey>> batchKeys(
  1. List<MssqlRelationKey> keys,
  2. int columnsPerKey, {
  3. int extraParameters = 0,
})

Splits keys into batches that stay under the parameter ceiling.

Hitting the ceiling would otherwise surface as a server error on whichever customer happened to have too many orders.

Implementation

List<List<MssqlRelationKey>> batchKeys(
  List<MssqlRelationKey> keys,
  int columnsPerKey, {
  int extraParameters = 0,
}) {
  if (columnsPerKey <= 0) {
    throw ArgumentError.value(
      columnsPerKey,
      'columnsPerKey',
      'A relation key needs at least one column.',
    );
  }
  final budget = (relationParameterCeiling - extraParameters).clamp(
    1,
    relationParameterCeiling,
  );
  final perBatch = (budget ~/ columnsPerKey).clamp(1, 100000);
  final out = <List<MssqlRelationKey>>[];
  for (var start = 0; start < keys.length; start += perBatch) {
    final end = start + perBatch < keys.length ? start + perBatch : keys.length;
    out.add(keys.sublist(start, end));
  }
  return out;
}