Migration 0006 ergaenzt folders.path (Materialized Path aus Ordner-IDs, text_pattern_ops-Index) - Teilbaum-Abfragen werden damit zu einem Index-Scan statt einer rekursiven CTE ueber parent_folder_id. Pfad besteht aus IDs, nie aus Namen, daher aendert Umbenennen nie einen Pfad. internal/folder: Create/Get/Rename/Move/Subtree. Move aktualisiert den gesamten Teilbaum in einer einzigen UPDATE-Anweisung (Praefix-Ersetzung) und verhindert Zyklen (Ziel ist der Ordner selbst oder ein eigener Nachfahre). Pruefungen: 1. Zyklus beim Verschieben verhindert (3 faelle: selbst, kind, enkel) 2. Teilbaum-Abfrage bei 10.001 Ordnern: 28,4ms (Budget 500ms) 3. Umbenennen aendert pfad von ordner UND kindern nachweislich nicht Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.2 KiB
DOC-09 – Prüfprotokoll: Ordner- & Kabinettmodell
Stand: 2026-09-17. Testhost 192.168.1.131.
Grundsatzentscheidung: Materialized Path aus IDs, nicht aus Namen
Migration 0006_folders_materialized_path fügt folders.path (Text, z. B. /<id-wurzel>/<id-kind>/)
mit text_pattern_ops-Index hinzu — Teilbaum-Abfragen sind damit ein Index-Scan auf
path LIKE 'präfix%' statt einer rekursiven CTE über parent_folder_id. Der Pfad besteht aus
Ordner-IDs, nie aus Namen — Umbenennen ändert daher nie den Pfad eines Ordners oder seiner
Kinder.
Prüfung 1: Zyklus beim Verschieben wird verhindert
TestMove_PreventsCycle — PASS. Drei Fälle real gegen Postgres geprüft: Wurzel unter ihr eigenes
Kind verschieben, Wurzel unter ihren eigenen Enkel verschieben, Ordner in sich selbst verschieben —
alle drei liefern ErrCycle, Zustand bleibt in allen Fällen unverändert.
Prüfung 2: Abfrage bei 10.000 Ordnern im Zeitbudget
TestSubtree_RemainsFastWith10000Folders — PASS. Echter Baum mit 10.001 Ordnern (100 Zweige × 99
Blätter + 1 Wurzel) real angelegt, Teilbaum-Abfrage über die Wurzel beantwortet in 28,4 ms
(Zeitbudget 500 ms deutlich unterschritten) — der text_pattern_ops-Index trägt hier sichtbar.
Prüfung 3: Umbenennen bricht keine Verweise
TestRename_DoesNotBreakPathReferences — PASS. Nach Umbenennen eines Ordners mit Kind bleiben
sowohl der eigene Pfad als auch der Pfad des Kindes byteweise unverändert; eine Teilbaum-Abfrage
über den (unveränderten) Pfad findet das Kind weiterhin.
Akzeptanzkriterium 2: Verschieben aktualisiert den gesamten Teilbaum
TestMove_UpdatesEntireSubtree — PASS. Ein Ordner mit Kind und Enkel wird unter einen anderen
Wurzelordner verschoben — Kind- UND Enkel-Pfad sind danach nachweislich unter dem neuen Präfix,
eine einzige UPDATE ... WHERE path LIKE $1 || '%'-Anweisung aktualisiert den gesamten Teilbaum
in einem Rutsch (keine rekursive Einzelverarbeitung je Nachfahre nötig).
Regressionsnachweis
go test ./... -p 1 — alle Pakete PASS (Alt-Tabellen-Kollisionen aus vorherigen Smoketest-/
Testläufen bereinigt, keine echte Regression). gofmt -l ., go build ./..., go vet ./... sauber.