Files
nexarch/dms/docs/DOC-09-PRUEFPROTOKOLL.md
T
patrickandClaude Sonnet 5 51edffedb7 DOC-09: Ordner- & Kabinettmodell (Materialized Path)
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>
2026-09-17 20:10:49 +02:00

2.2 KiB
Raw Blame History

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.