Files
romm/backend/handler/database/stats_handler.py
2025-12-12 17:05:12 -05:00

82 lines
2.2 KiB
Python

from sqlalchemy import distinct, func, select
from sqlalchemy.orm import Session
from decorators.database import begin_session
from models.assets import Save, Screenshot, State
from models.rom import Rom, RomFile
from .base_handler import DBBaseHandler
class DBStatsHandler(DBBaseHandler):
@begin_session
def get_platforms_count(
self,
session: Session = None, # type: ignore
) -> int:
"""Get the number of platforms with any roms."""
return (
session.scalar(
select(func.count(distinct(Rom.platform_id))).select_from(Rom)
)
or 0
)
@begin_session
def get_roms_count(
self,
session: Session = None, # type: ignore
) -> int:
return session.scalar(select(func.count()).select_from(Rom)) or 0
@begin_session
def get_saves_count(
self,
session: Session = None, # type: ignore
) -> int:
return session.scalar(select(func.count()).select_from(Save)) or 0
@begin_session
def get_states_count(
self,
session: Session = None, # type: ignore
) -> int:
return session.scalar(select(func.count()).select_from(State)) or 0
@begin_session
def get_screenshots_count(
self,
session: Session = None, # type: ignore
) -> int:
return session.scalar(select(func.count()).select_from(Screenshot)) or 0
@begin_session
def get_total_filesize(
self,
session: Session = None, # type: ignore
) -> int:
"""Get the total filesize of all roms in the database, in bytes."""
return (
session.scalar(
select(func.sum(RomFile.file_size_bytes)).select_from(RomFile)
)
or 0
)
@begin_session
def get_platform_filesize(
self,
platform_id: int,
session: Session = None, # type: ignore
) -> int:
"""Get the total filesize of all roms in the database, in bytes."""
return (
session.scalar(
select(func.sum(RomFile.file_size_bytes))
.select_from(RomFile)
.join(Rom)
.filter(Rom.platform_id == platform_id)
)
or 0
)