Created
November 26, 2014 03:33
-
-
Save Chort409/eb46f4d95261d9af51e9 to your computer and use it in GitHub Desktop.
Sql like join in clojure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Saved me today - thanks!