import 'package:drift/drift.dart'; import '../../sources/models.dart' as models; import '../database.dart'; part 'library_dao.g.dart'; typedef AristListItem = ({models.Artist artist, int? albumCount}); @DriftAccessor(include: {'../tables.drift'}) class LibraryDao extends DatabaseAccessor with _$LibraryDaoMixin { LibraryDao(super.db); Future> listAlbums({ required int sourceId, required int limit, required int offset, }) { final query = albums.select() ..where( (f) => f.sourceId.equals(sourceId), ) ..limit(limit, offset: offset); return query.get(); } Future> listArtists({ required int sourceId, required int limit, required int offset, }) async { final albumCount = albums.id.count(); final query = artists.select().join([ leftOuterJoin( albums, albums.artistId.equalsExp(artists.id), ), ]) ..addColumns([albumCount]) ..where( artists.sourceId.equals(sourceId) & albums.sourceId.equals(sourceId), ) ..groupBy([artists.sourceId, artists.id]) ..orderBy([OrderingTerm.asc(artists.name)]) ..limit(limit, offset: offset); return (await query.get()) .map( (row) => ( artist: row.readTable(artists), albumCount: row.read(albumCount) ?? 0, ), ) .toList(); } }