update
This commit is contained in:
@@ -106,6 +106,7 @@ CREATE TABLE IF NOT EXISTS leitner(
|
|||||||
CREATE TABLE IF NOT EXISTS befunde(
|
CREATE TABLE IF NOT EXISTS befunde(
|
||||||
id INTEGER PRIMARY KEY, run_id INTEGER NOT NULL, ebene TEXT NOT NULL, art TEXT NOT NULL,
|
id INTEGER PRIMARY KEY, run_id INTEGER NOT NULL, ebene TEXT NOT NULL, art TEXT NOT NULL,
|
||||||
item TEXT DEFAULT '', detail TEXT DEFAULT '', status TEXT NOT NULL DEFAULT 'offen');
|
item TEXT DEFAULT '', detail TEXT DEFAULT '', status TEXT NOT NULL DEFAULT 'offen');
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_befunde_run ON befunde(run_id, ebene);
|
||||||
CREATE TABLE IF NOT EXISTS lernstand(
|
CREATE TABLE IF NOT EXISTS lernstand(
|
||||||
topic TEXT NOT NULL, baustein_id INTEGER NOT NULL,
|
topic TEXT NOT NULL, baustein_id INTEGER NOT NULL,
|
||||||
status TEXT NOT NULL DEFAULT 'aktiv', xp INTEGER NOT NULL DEFAULT 0,
|
status TEXT NOT NULL DEFAULT 'aktiv', xp INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -125,6 +125,18 @@ async def lauf_stop(topic: str):
|
|||||||
return {"ok": True}
|
return {"ok": True}
|
||||||
|
|
||||||
|
|
||||||
|
def _befunde_aktuell(topic: str) -> list[dict]:
|
||||||
|
"""Offene Befunde des jeweils jüngsten Laufs je Ebene — in zwei billigen Pässen."""
|
||||||
|
neueste = db.query(
|
||||||
|
"SELECT b.ebene, MAX(b.run_id) AS run_id FROM befunde b"
|
||||||
|
" JOIN runs r ON r.id=b.run_id WHERE r.topic=? GROUP BY b.ebene", (topic,))
|
||||||
|
out: list[dict] = []
|
||||||
|
for ne in neueste:
|
||||||
|
out += db.query("SELECT * FROM befunde WHERE run_id=? AND ebene=?"
|
||||||
|
" AND status='offen' ORDER BY id", (ne["run_id"], ne["ebene"]))
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
@app.get("/api/topics/{topic}/state")
|
@app.get("/api/topics/{topic}/state")
|
||||||
def state(topic: str):
|
def state(topic: str):
|
||||||
t = db.one("SELECT * FROM topics WHERE name=?", (topic,))
|
t = db.one("SELECT * FROM topics WHERE name=?", (topic,))
|
||||||
@@ -153,16 +165,11 @@ def state(topic: str):
|
|||||||
"bausteine": db.query(
|
"bausteine": db.query(
|
||||||
"SELECT b.*, s.stage FROM bausteine b LEFT JOIN sections s ON s.baustein_id=b.id"
|
"SELECT b.*, s.stage FROM bausteine b LEFT JOIN sections s ON s.baustein_id=b.id"
|
||||||
" WHERE b.topic=? ORDER BY b.ord", (topic,)),
|
" WHERE b.topic=? ORDER BY b.ord", (topic,)),
|
||||||
# Je Ebene nur der JÜNGSTE Messstand: offene Befunde älterer Läufe sind
|
# Je Ebene nur der JÜNGSTE Messstand (veraltete Läufe sind Momentaufnahmen).
|
||||||
# veraltete Momentaufnahmen (aak: 1244 Anker-Leichen bei 0 echten) — der
|
# ENTKORRELIERT: erst MAX(run_id) je Ebene, dann gezielte Lookups — der
|
||||||
# letzte Lauf, der die Ebene gemessen hat, ist die Wahrheit.
|
# korrelierte Subquery brauchte 874 ms und staute hinter db._lock den
|
||||||
"befunde": db.query(
|
# ganzen Server (state wird bei jedem Poll/WS-Push gerufen).
|
||||||
"SELECT b.* FROM befunde b JOIN runs r ON r.id=b.run_id"
|
"befunde": _befunde_aktuell(topic),
|
||||||
" WHERE r.topic=? AND b.status='offen'"
|
|
||||||
" AND b.run_id = (SELECT MAX(b2.run_id) FROM befunde b2"
|
|
||||||
" JOIN runs r2 ON r2.id=b2.run_id"
|
|
||||||
" WHERE r2.topic=? AND b2.ebene=b.ebene)"
|
|
||||||
" ORDER BY b.id", (topic, topic)),
|
|
||||||
"agenten": agents.aktive_agenten(),
|
"agenten": agents.aktive_agenten(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user