impr: separate DeclarativeBase for views

This commit is contained in:
283375 2023-08-26 01:34:34 +08:00
parent 5744aad8b6
commit b23bd2652a
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk

View File

@ -9,6 +9,7 @@ from .songs import Chart, ChartInfo
__all__ = [ __all__ = [
"ScoresBase", "ScoresBase",
"Score", "Score",
"ScoresViewBase",
"Calculated", "Calculated",
"Best", "Best",
"CalculatedPotential", "CalculatedPotential",
@ -41,7 +42,11 @@ class Score(ScoresBase):
# CC BY-SA 4.0 # CC BY-SA 4.0
class Calculated(ScoresBase): class ScoresViewBase(DeclarativeBase):
pass
class Calculated(ScoresViewBase):
score_id: Mapped[str] score_id: Mapped[str]
song_id: Mapped[str] song_id: Mapped[str]
rating_class: Mapped[int] rating_class: Mapped[int]
@ -98,11 +103,11 @@ class Calculated(ScoresBase):
(Chart.song_id == Score.song_id) (Chart.song_id == Score.song_id)
& (Chart.rating_class == Score.rating_class), & (Chart.rating_class == Score.rating_class),
), ),
metadata=ScoresBase.metadata, metadata=ScoresViewBase.metadata,
) )
class Best(ScoresBase): class Best(ScoresViewBase):
score_id: Mapped[str] score_id: Mapped[str]
song_id: Mapped[str] song_id: Mapped[str]
rating_class: Mapped[int] rating_class: Mapped[int]
@ -125,11 +130,11 @@ class Best(ScoresBase):
.select_from(Calculated) .select_from(Calculated)
.group_by(Calculated.song_id, Calculated.rating_class) .group_by(Calculated.song_id, Calculated.rating_class)
.order_by(Calculated.potential.desc()), .order_by(Calculated.potential.desc()),
metadata=ScoresBase.metadata, metadata=ScoresViewBase.metadata,
) )
class CalculatedPotential(ScoresBase): class CalculatedPotential(ScoresViewBase):
b30: Mapped[float] b30: Mapped[float]
_select_bests_subquery = ( _select_bests_subquery = (
@ -141,5 +146,5 @@ class CalculatedPotential(ScoresBase):
__table__ = create_view( __table__ = create_view(
name="calculated_potential", name="calculated_potential",
selectable=select(func.avg(_select_bests_subquery.c.b30_sum).label("b30")), selectable=select(func.avg(_select_bests_subquery.c.b30_sum).label("b30")),
metadata=ScoresBase.metadata, metadata=ScoresViewBase.metadata,
) )