This commit is contained in:
team3
2026-07-13 02:10:05 +02:00
parent 4fcbefc4a6
commit 7ee425f7fa
2 changed files with 18 additions and 10 deletions

View File

@@ -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,

View File

@@ -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(),
} }