Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 41s
New lib/datalog/demo.sx with three Datalog-as-query-language demos
over synthetic rose-ash data:
Federation: (mutual A B), (reachable A B), (foaf A C) over a
follows graph.
Content: (post-likes P N) via count aggregation, (popular P)
for likes >= 3, (interesting Me P) joining follows
+ authored + popular.
Permissions: (in-group A G) over transitive subgroup chains,
(can-access A R).
10 tests run each program against in-memory EDB tuples loaded via
dl-program-data.
Wiring to PostgreSQL and exposing as a service endpoint (/internal
/datalog) is out of scope for this loop — both would require
edits outside lib/datalog/. Programs above document the EDB shape
a real loader would populate.
76 lines
3.1 KiB
Plaintext
76 lines
3.1 KiB
Plaintext
;; lib/datalog/demo.sx — example programs over rose-ash-shaped data.
|
|
;;
|
|
;; Phase 10 prototypes Datalog as a rose-ash query language. Wiring
|
|
;; the EDB to actual PostgreSQL is out of scope for this loop (it
|
|
;; would touch service code outside lib/datalog/), but the programs
|
|
;; below show the shape of queries we want, and the test suite runs
|
|
;; them against synthetic in-memory tuples loaded via dl-program-data.
|
|
;;
|
|
;; Three thematic demos:
|
|
;;
|
|
;; 1. Federation — follow graph, transitive reach, mutuals.
|
|
;; 2. Content — posts, tags, likes, popularity, "for you" feed.
|
|
;; 3. Permissions — group membership and resource access.
|
|
|
|
;; ── Demo 1: federation follow graph ─────────────────────────────
|
|
;; EDB: (follows ACTOR-A ACTOR-B) — A follows B.
|
|
;; IDB:
|
|
;; (mutual A B) — A follows B and B follows A
|
|
;; (reachable A B) — transitive follow closure
|
|
;; (foaf A C) — friend of a friend (mutual filter)
|
|
(define
|
|
dl-demo-federation-rules
|
|
(quote
|
|
((mutual A B <- (follows A B) (follows B A))
|
|
(reachable A B <- (follows A B))
|
|
(reachable A C <- (follows A B) (reachable B C))
|
|
(foaf A C <- (follows A B) (follows B C) (!= A C)))))
|
|
|
|
;; ── Demo 2: content recommendation ──────────────────────────────
|
|
;; EDB:
|
|
;; (authored ACTOR POST)
|
|
;; (tagged POST TAG)
|
|
;; (liked ACTOR POST)
|
|
;; IDB:
|
|
;; (post-likes POST N) — count of likes per post
|
|
;; (popular POST) — posts with >= 3 likes
|
|
;; (tagged-by-mutual ACTOR POST) — post tagged TOPIC by someone
|
|
;; A's mutuals follow.
|
|
(define
|
|
dl-demo-content-rules
|
|
(quote
|
|
((post-likes P N <- (authored Author P) (count N L (liked L P)))
|
|
(popular P <- (authored Author P) (post-likes P N) (>= N 3))
|
|
(interesting Me P
|
|
<-
|
|
(follows Me Buddy)
|
|
(authored Buddy P)
|
|
(popular P)))))
|
|
|
|
;; ── Demo 3: role-based permissions ──────────────────────────────
|
|
;; EDB:
|
|
;; (member ACTOR GROUP)
|
|
;; (subgroup CHILD PARENT)
|
|
;; (allowed GROUP RESOURCE)
|
|
;; IDB:
|
|
;; (in-group ACTOR GROUP) — direct or via subgroup chain
|
|
;; (can-access ACTOR RESOURCE) — actor inherits group permission
|
|
(define
|
|
dl-demo-perm-rules
|
|
(quote
|
|
((in-group A G <- (member A G))
|
|
(in-group A G <- (member A H) (subgroup-trans H G))
|
|
(subgroup-trans X Y <- (subgroup X Y))
|
|
(subgroup-trans X Z <- (subgroup X Y) (subgroup-trans Y Z))
|
|
(can-access A R <- (in-group A G) (allowed G R)))))
|
|
|
|
;; ── Loader stub ──────────────────────────────────────────────────
|
|
;; Wiring to PostgreSQL would replace these helpers with calls into
|
|
;; rose-ash's internal HTTP RPC (fetch_data → /internal/data/...).
|
|
;; The shape returned by dl-load-from-edb! is the same in either case.
|
|
(define
|
|
dl-demo-make
|
|
(fn
|
|
(facts rules)
|
|
(dl-program-data facts rules)))
|