datalog

2026-03-07T05:27:49.623069Z

how might i convert this sql query to datalog (using datalevin)? my execute! function wraps the next.jdbc execute, using {:return-keys true :builder-fn rs/as-kebab-keys} so each row is a map.

(defn get-rows []
  (-> (h/select :games/year :games/city :sports/name :events/name :events/url
                :results/date :results/athlete :results/country :results/medal)
      (h/from :results)
      (h/join :games [:= :games/id :results/game-id])
      (h/join :sports [:= :sports/id :results/sport-id])
      (h/join :events [:= :events/id :results/event-id])
      (execute!)))

✅ 1
2026-03-10T14:43:39.217499Z

i have ended up with this, which isn't ideal but works for me!

(defn get-rows []
  (into []
    (comp (mapcat identity)
      (map #(-> %
              (merge (:result/game %) (:result/sport %) (:result/event %))
              (dissoc :result/game :result/sport :result/event))))
    (d/q '[:find (pull ?e [:result/winner :result/country :result/medal
                           :result/year :result/month :result/day
                           {:result/game [:game/year :game/city]
                            :result/sport [:sport/name]
                            :result/event [:event/name :event/url]}])
           :where [?e :result/medal _]]
      (d/db conn))))

2026-03-07T05:28:50.280109Z

my schema matches, except i've made it "datalog"-y: :result/game, :result/sport, :result/event, etc