Skip to content

Commit

Permalink
maps use query builder
Browse files Browse the repository at this point in the history
  • Loading branch information
arily committed Dec 5, 2023
1 parent dae4420 commit 8e5a8ac
Showing 1 changed file with 39 additions and 63 deletions.
102 changes: 39 additions & 63 deletions app/repositories/maps.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import app.state.services
from app._typing import _UnsetSentinel
from app._typing import UNSET
from app.query_builder import build as bq

# +--------------+------------------------+------+-----+---------+-------+
# | Field | Type | Null | Key | Default | Extra |
Expand Down Expand Up @@ -183,21 +184,15 @@ async def fetch_one(
if id is None and md5 is None and filename is None:
raise ValueError("Must provide at least one parameter.")

query = f"""\
SELECT {READ_PARAMS}
FROM maps
WHERE id = COALESCE(:id, id)
AND md5 = COALESCE(:md5, md5)
AND filename = COALESCE(:filename, filename)
"""
params: dict[str, Any] = {
"id": id,
"md5": md5,
"filename": filename,
}
map = await app.state.services.database.fetch_one(query, params)
query, params = bq(
f"SELECT {READ_PARAMS} FROM maps WHERE 1 = 1",
(id, "AND id = :id"),
(md5, "AND md5 = :md5"),
(filename, "AND filename = :filename"),
)

return cast(Map, dict(map._mapping)) if map is not None else None
result = await app.state.services.database.fetch_one(query, params)
return cast(Map, dict(result._mapping)) if result is not None else None


async def fetch_count(
Expand All @@ -211,29 +206,19 @@ async def fetch_count(
frozen: bool | None = None,
) -> int:
"""Fetch the number of maps in the database."""
query = """\
SELECT COUNT(*) AS count
FROM maps
WHERE server = COALESCE(:server, server)
AND set_id = COALESCE(:set_id, set_id)
AND status = COALESCE(:status, status)
AND artist = COALESCE(:artist, artist)
AND creator = COALESCE(:creator, creator)
AND filename = COALESCE(:filename, filename)
AND mode = COALESCE(:mode, mode)
AND frozen = COALESCE(:frozen, frozen)

"""
params: dict[str, Any] = {
"server": server,
"set_id": set_id,
"status": status,
"artist": artist,
"creator": creator,
"filename": filename,
"mode": mode,
"frozen": frozen,
}
query, params = bq(
"SELECT COUNT(*) count FROM maps WHERE 1 = 1",
(server, "AND server = :server"),
(set_id, "AND set_id = :set_id"),
(status, "AND status = :status"),
(artist, "AND artist = :artist"),
(creator, "AND creator = :creator"),
(filename, "AND filename = :filename"),
(mode, "AND mode = :mode"),
(frozen, "AND frozen = :frozen"),
)

rec = await app.state.services.database.fetch_one(query, params)
assert rec is not None
return cast(int, rec._mapping["count"])
Expand All @@ -252,28 +237,18 @@ async def fetch_many(
page_size: int | None = None,
) -> list[Map]:
"""Fetch a list of maps from the database."""
query = f"""\
SELECT {READ_PARAMS}
FROM maps
WHERE server = COALESCE(:server, server)
AND set_id = COALESCE(:set_id, set_id)
AND status = COALESCE(:status, status)
AND artist = COALESCE(:artist, artist)
AND creator = COALESCE(:creator, creator)
AND filename = COALESCE(:filename, filename)
AND mode = COALESCE(:mode, mode)
AND frozen = COALESCE(:frozen, frozen)
"""
params: dict[str, Any] = {
"server": server,
"set_id": set_id,
"status": status,
"artist": artist,
"creator": creator,
"filename": filename,
"mode": mode,
"frozen": frozen,
}

query, params = bq(
f"SELECT {READ_PARAMS} FROM maps WHERE 1 = 1",
(server, "AND server = :server"),
(set_id, "AND set_id = :set_id"),
(status, "AND status = :status"),
(artist, "AND artist = :artist"),
(creator, "AND creator = :creator"),
(filename, "AND filename = :filename"),
(mode, "AND mode = :mode"),
(frozen, "AND frozen = :frozen"),
)

if page is not None and page_size is not None:
query += """\
Expand Down Expand Up @@ -359,11 +334,12 @@ async def update(
if not isinstance(diff, _UnsetSentinel):
update_fields["diff"] = diff

query = f"""\
UPDATE maps
SET {",".join(f"{k} = COALESCE(:{k}, {k})" for k in update_fields)}
WHERE id = :id
"""
query = (
"UPDATE maps SET",
",".join(f"{k} = :{k}" for k in update_fields),
"WHERE id = :id",
)

values = {"id": id} | update_fields
await app.state.services.database.execute(query, values)

Expand Down

0 comments on commit 8e5a8ac

Please sign in to comment.