chunkById method

  1. @override
Future<void> chunkById(
  1. int size,
  2. Future<void> callback(
    1. List<T> items
    ), {
  3. String column = 'id',
  4. String? alias,
})
override

Process results in chunks by ID (more efficient for large datasets)

Implementation

@override
Future<void> chunkById(
  int size,
  Future<void> Function(List<T> items) callback, {
  String column = 'id',
  String? alias,
}) async {
  dynamic lastId;
  List<T> results;
  do {
    final q = clone();

    if (lastId != null) {
      q.where(alias ?? column, '>', lastId);
    }

    q.orderBy(alias ?? column, direction: 'ASC');
    q.limit(size);

    results = await q.get();

    if (results.isNotEmpty) {
      await callback(results);

      final lastItem = results.last;
      final key = alias ?? column;

      if (lastItem is Map) {
        lastId = lastItem[key];
      } else if (lastItem is KhademModel) {
        lastId = (lastItem as KhademModel).getAttribute(key);
      } else {
        try {
          lastId = (lastItem as dynamic)[key];
        } catch (_) {
          throw Exception(
            'Could not determine the value of the chunk column "$key" from the result.',
          );
        }
      }
    }
  } while (results.length == size);
}