Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 55s
Adds the canonical Phase 10 example from the plan: "Posts about cooking by people I follow (transitively)." dl-demo-cooking-rules defines reach over the follow graph (recursive transitive closure) and cooking-post-by-network joining reach + authored + (tagged P cooking). 3 new demo tests cover transitive network, direct-only follow, and empty-network cases.
96 lines
3.7 KiB
Plaintext
96 lines
3.7 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)))))
|
|
|
|
;; ── Demo 4: cooking-posts (the canonical Phase 10 query) ────────
|
|
;; "Posts about cooking by people I follow (transitively)."
|
|
;; Combines federation (follows + transitive reach), authoring,
|
|
;; tagging — the rose-ash multi-domain join.
|
|
;;
|
|
;; EDB:
|
|
;; (follows ACTOR-A ACTOR-B)
|
|
;; (authored ACTOR POST)
|
|
;; (tagged POST TAG)
|
|
(define
|
|
dl-demo-cooking-rules
|
|
(quote
|
|
((reach Me Them <- (follows Me Them))
|
|
(reach Me Them <- (follows Me X) (reach X Them))
|
|
(cooking-post-by-network Me P
|
|
<-
|
|
(reach Me Author)
|
|
(authored Author P)
|
|
(tagged P cooking)))))
|
|
|
|
;; ── 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)))
|