外部加入Clojure

Gor*_*vic 9 clojure outer-join

与此问题类似:内部加入clojure

是否有任何Clojure库中的地图集合执行外连接(左,右和完全)的功能?

我想这可以通过修改代码来完成,clojure.set/join但这似乎是一个很常见的要求,因此检查它是否已经存在是值得的.

像这样的东西:

(def s1 #{{:a 1, :b 2, :c 3}
          {:a 2, :b 2}})

(def s2 #{{:a 2, :b 3, :c 5}
          {:a 3, :b 8}})


;=> (full-join s1 s2 {:a :a})
;
;   #{{:a 1, :b 2, :c 3}
;     {:a 2, :b 3, :c 5}
;     {:a 3, :b 8}}
Run Code Online (Sandbox Code Playgroud)

左右外连接的适当函数,即包括nil左,右或两侧的连接键没有值(或值)的条目.

Nie*_*lsK 5

Sean Devlin(Full Disclojure成名)table-utils具有以下连接类型:

  • 内部联接
  • 左外连接
  • 右外连接
  • 全外连接
  • 自然联接
  • 交叉联接

它暂时没有更新,但工作在1.3,1.4和1.5.要使它在没有任何外部依赖性的情况下工作:

  • 替换fn-tuplejuxt
  • (:use )ns 替换ns声明中的整个子句(require [clojure.set :refer [intersection union]])
  • 从下面添加函数map-vals:

(defn map-vals
  [f coll]
  (into {} (map (fn [[k v]] {k (f v)}) coll)))
Run Code Online (Sandbox Code Playgroud)

或者对于Clojure 1.5及以上版本

(defn map-vals
  [f coll]
  (reduce-kv (fn [acc k v] (assoc acc k (f v))) {} coll))
Run Code Online (Sandbox Code Playgroud)

该库的用法是连接类型,两个集合(两组映射,如上例,或两个sql结果集)和至少一个连接fn.由于关键字是地图上的函数,通常只有连接键才足够:

=> (full-outer-join s1 s2 :a :a)
   ({:a 1, :c 3, :b 2}
    {:a 2, :c 5, :b 3}
    {:b 8, :a 3})
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,Sean试图在不久前将table-utils用于contrib,但这种情况从未解决过.太糟糕了,它从来没有得到它自己的项目(在github/clojars上).Stackoverflow或Clojure Google小组会不时出现像这样的库的问题.

另一种选择可能是使用datomic中的数据记录库来查询clojure数据结构.Stuart Halloway 在他的要点中有一些 例子.