Skip to content

Instantly share code, notes, and snippets.

@Chort409
Created November 26, 2014 03:33
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Chort409/eb46f4d95261d9af51e9 to your computer and use it in GitHub Desktop.
Save Chort409/eb46f4d95261d9af51e9 to your computer and use it in GitHub Desktop.
Sql like join in clojure
(ns sql-like-join
(:require [clojure.set :refer [difference
intersection
union]]))
(defn inner-join
[left-keys right-keys]
(intersection (set left-keys) (set right-keys)))
(defn outer-join
[left-keys right-keys]
(union (difference (set left-keys) (set right-keys)) (difference (set right-keys) (set left-keys))))
(defn full-join
[left-keys right-keys]
(union (set left-keys) (set right-keys)))
(defn left-join
[left-keys right-keys]
left-keys)
(defn map-combine [group1 group2 dumy-map]
(for [map1 group1
map2 group2]
(merge-with #(or %2 %1) dumy-map map2 map1)))
(defn joiner [left-coll right-coll left-fn right-fn join-type keys-fn & args]
(let [left-idx (group-by left-fn left-coll)
right-idx (group-by right-fn right-coll)
join-keys (set (join-type (keys left-idx) (keys right-idx)))]
(apply concat
(map #(map-combine (get left-idx % [{}])
(get right-idx % [{}])
(zipmap (set (union (keys (first left-coll)) (keys (first right-coll))))(repeat nil)) ) join-keys))))
(def one
[{:foo "bar" :key1 "test1"}
{:foo "test" :key1 "test2"}])
(def two
[{:bar "foo" :foo1 "bar"}
{:bar "bar1" :foo1 "foo1"}])
#_(joiner one two :foo :foo1 left-join)
@rbxbx
Copy link

rbxbx commented Feb 8, 2018

Saved me today - thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment