Coverage for bc/kwai-bc-club/src/kwai_bc_club/repositories/coach_db_query.py: 100%
38 statements
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
1"""Module that implements the coach query interface for a database."""
3from dataclasses import dataclass
4from typing import Self
6from kwai_core.db.database import Database
7from kwai_core.db.database_query import DatabaseQuery
8from kwai_core.db.table_row import JoinedTableRow
9from kwai_core.domain.value_objects.unique_id import UniqueId
10from sql_smith.functions import alias, on
12from kwai_bc_club.domain.club_coach import ClubCoachEntity, ClubCoachIdentifier
13from kwai_bc_club.domain.member import MemberIdentifier
14from kwai_bc_club.repositories._tables import (
15 CoachRow,
16 ContactRow,
17 CountryRow,
18 MemberRow,
19 PersonRow,
20 UserRow,
21)
22from kwai_bc_club.repositories.coach_query import CoachQuery
25@dataclass(kw_only=True, frozen=True, slots=True)
26class CoachQueryRow(JoinedTableRow):
27 """A datatransfer object for the coach query."""
29 coach: CoachRow
30 member: MemberRow
31 person: PersonRow
32 nationality: CountryRow
33 contact: ContactRow
34 country: CountryRow
35 user: UserRow
37 def create_entity(self) -> ClubCoachEntity:
38 """Create a club coach entity from a query row."""
39 return self.coach.create_entity(
40 member=self.member.create_entity(
41 person=self.person.create_entity(
42 nationality=self.nationality.create_country(),
43 contact=self.contact.create_entity(
44 country=self.country.create_country()
45 ),
46 ),
47 user=self.user.create_user(),
48 )
49 )
52class CoachDBQuery(DatabaseQuery, CoachQuery):
53 """A coach query implementation using a database."""
55 def __init__(self, database: Database):
56 super().__init__(database)
58 def init(self):
59 (
60 self._query.from_(CoachRow.__table_name__)
61 .inner_join(
62 MemberRow.__table_name__,
63 on(MemberRow.column("id"), CoachRow.column("member_id")),
64 )
65 .inner_join(
66 PersonRow.__table_name__,
67 on(PersonRow.column("id"), MemberRow.column("person_id")),
68 )
69 ).inner_join(
70 alias(CountryRow.__table_name__, "nationality"),
71 on(
72 "nationality.id",
73 PersonRow.column("nationality_id"),
74 ),
75 ).inner_join(
76 ContactRow.__table_name__,
77 on(ContactRow.column("id"), PersonRow.column("contact_id")),
78 ).inner_join(
79 CountryRow.__table_name__,
80 on(CountryRow.column("id"), ContactRow.column("country_id")),
81 ).left_join(
82 UserRow.__table_name__,
83 on(UserRow.column("id"), MemberRow.column("user_id")),
84 )
86 @property
87 def count_column(self):
88 return CoachRow.column("id")
90 @property
91 def columns(self):
92 return CoachQueryRow.get_aliases()
94 def filter_by_id(self, id_: ClubCoachIdentifier) -> Self:
95 self._query.and_where(CoachRow.field("id").eq(id_.value))
96 return self
98 def filter_by_active(self) -> Self:
99 self._query.and_where(CoachRow.field("active").eq(1))
100 return self
102 def filter_by_user_uuid(self, uuid: UniqueId) -> Self:
103 self._query.and_where(UserRow.field("uuid").eq(str(uuid)))
104 return self
106 def filter_by_member(self, member_id: MemberIdentifier) -> Self:
107 self._query.and_where(MemberRow.field("id").eq(member_id))
108 return self