from typing import cast from pydantic import TypeAdapter from dmp.adapters.db import ReportingRepository from dmp.artists.dtos import Artist, ArtistCriteria from dmp.fandata.models import FansByArtistAccountDbt ArtistList = TypeAdapter(list[Artist]) class ArtistRepository(ReportingRepository[FansByArtistAccountDbt]): def find_by_criteria( self, criteria: ArtistCriteria, *, limit: int | None = None, offset: int | None = None, ) -> list[Artist]: template_name = "artist/get-artists.sql" query = self.db.query_from_template( template_name, context={ "criteria": criteria, "limit": limit, "offset": offset, }, ) result = self.db.session.execute(query) return ArtistList.validate_python( result.mappings(), ) def count_by_criteria(self, criteria: ArtistCriteria) -> int: template_name = "artist/get-artists-count.sql" query = self.db.query_from_template( template_name, context={ "criteria": criteria, }, ) result = self.db.session.execute(query) return cast(int, result.scalar_one())