A barebone implementation of hierarchical object structures using EdgeDB.
Very rudimentary and only provisionally tested. Has no indexes yet, doesn't use links, and probably other inefficiencies.
Use at your own peril.
| module tree { | |
| type Closure { | |
| required property parent -> uuid; | |
| required property child -> uuid; | |
| required property depth -> int64; | |
| } | |
| type Node {} | |
| } |
| with module tree, | |
| C := (select Closure filter .parent = <uuid>$nodeId) | |
| delete Closure filter .child in C.child; |
| with module tree, | |
| NID := <uuid>$nodeId, | |
| PID := <optional uuid>$parentId, | |
| N := (insert Closure { parent := NID, child := NID, depth := 0 }), | |
| P := (select Closure filter .child = PID), | |
| C := ( | |
| for C in (select (P.parent, N.child, P.depth + N.depth + 1)) | |
| union (insert Closure { parent := C.0, child := C.1, depth := C.2}) | |
| ) | |
| select N union C; |
| with module tree, | |
| NID := <uuid>$nodeId, | |
| PID := <uuid>$newParentId, | |
| N := (select Closure filter .child = NID and .parent = NID), | |
| P := (select Closure filter .child = NID and .parent != .child), | |
| C := (select Closure filter .parent = NID), | |
| NP := (select Closure filter .child = PID), | |
| D := (delete Closure filter .child = C.child and .parent = P.parent), | |
| T := ( | |
| for X in (select (NP.parent, C.child, NP.depth + C.depth + 1)) | |
| union (insert Closure { parent := X.0, child := X.1, depth := X.2}) | |
| ) | |
| select (select N union T) { parent, child, depth }; |
| with module tree, | |
| NID := <uuid>$nodeId, | |
| DEPTH := <optional int64>$maxDepth, | |
| P := ( | |
| select Closure filter all({ | |
| .child = NID, | |
| .parent != NID, | |
| .depth <= DEPTH, | |
| }) | |
| ) | |
| select Node filter .id = P.parent; |
| with module tree, | |
| NID := <uuid>$nodeId, | |
| DEPTH := <optional int64>$maxDepth, | |
| C := ( | |
| select Closure filter all({ | |
| .child != NID, | |
| .parent = NID, | |
| .depth <= DEPTH, | |
| }) | |
| ) | |
| select Node filter .id = C.child; |