api
This commit is contained in:
parent
40d25c8726
commit
06443cd1dd
1 changed files with 149 additions and 1 deletions
|
|
@ -1 +1,149 @@
|
|||
(ns honeysql.core)
|
||||
(ns honeysql.core
|
||||
(:refer-clojure :exclude [group-by])
|
||||
(:require [honeysql.format :as format]))
|
||||
|
||||
(def format-sql format/format-sql)
|
||||
|
||||
(defn select [& fields]
|
||||
(let [[m fields] (if (map? (first fields))
|
||||
[(first fields) (rest fields)]
|
||||
[{} fields])]
|
||||
(assoc m :select fields)))
|
||||
|
||||
(defn merge-select [sql-map & fields]
|
||||
(update-in sql-map [:select] concat fields))
|
||||
|
||||
(defn from [& tables]
|
||||
(let [[m tables] (if (map? (first tables))
|
||||
[(first tables) (rest tables)]
|
||||
[{} tables])]
|
||||
(assoc m :from tables)))
|
||||
|
||||
(defn merge-from [sql-map & tables]
|
||||
(update-in sql-map [:from] concat tables))
|
||||
|
||||
(defn where [& preds]
|
||||
(let [[m preds] (if (map? (first preds))
|
||||
[(first preds) (rest preds)]
|
||||
[{} preds])]
|
||||
(assoc m :where (if (= 1 (count preds))
|
||||
(first preds)
|
||||
(vec (cons :and preds))))))
|
||||
|
||||
(defn merge-where [sql-map & preds]
|
||||
(if (empty? preds)
|
||||
sql-map
|
||||
(let [[merge-op preds] (if (keyword? (first preds))
|
||||
[(first preds) (rest preds)]
|
||||
[:and preds])]
|
||||
(assoc sql-map :where (if (contains? sql-map :where)
|
||||
(vec (concat [merge-op (:where sql-map)] preds))
|
||||
(vec (if (= 1 (count preds))
|
||||
(first preds)
|
||||
(cons merge-op preds))))))))
|
||||
|
||||
(defn join [& clauses]
|
||||
(let [[m clauses] (if (map? (first clauses))
|
||||
[(first clauses) (rest clauses)]
|
||||
[{} clauses])
|
||||
clauses (if (not (coll? (first clauses)))
|
||||
[clauses]
|
||||
clauses)]
|
||||
(assoc m :join clauses)))
|
||||
|
||||
(defn merge-join [sql-map & clauses]
|
||||
(let [clauses (if (not (coll? (first clauses)))
|
||||
[clauses]
|
||||
clauses)]
|
||||
(update-in sql-map [:join] concat clauses)))
|
||||
|
||||
(defn group-by [& fields]
|
||||
(let [[m fields] (if (map? (first fields))
|
||||
[(first fields) (rest fields)]
|
||||
[{} fields])]
|
||||
(assoc m :group-by fields)))
|
||||
|
||||
(defn merge-group-by [sql-map & fields]
|
||||
(update-in sql-map [:group-by] concat fields))
|
||||
|
||||
(defn having [& preds]
|
||||
(let [[m preds] (if (map? (first preds))
|
||||
[(first preds) (rest preds)]
|
||||
[{} preds])]
|
||||
(assoc m :having (if (= 1 (count preds))
|
||||
(first preds)
|
||||
(vec (cons :and preds))))))
|
||||
|
||||
(defn merge-having [sql-map & preds]
|
||||
(if (empty? preds)
|
||||
sql-map
|
||||
(let [[merge-op preds] (if (keyword? (first preds))
|
||||
[(first preds) (rest preds)]
|
||||
[:and preds])]
|
||||
(assoc sql-map :having (if (contains? sql-map :having)
|
||||
(vec (concat [merge-op (:having sql-map)] preds))
|
||||
(vec (if (= 1 (count preds))
|
||||
(first preds)
|
||||
(cons merge-op preds))))))))
|
||||
|
||||
(defn order-by [& fields]
|
||||
(let [[m fields] (if (map? (first fields))
|
||||
[(first fields) (rest fields)]
|
||||
[{} fields])]
|
||||
(assoc m :order-by fields)))
|
||||
|
||||
(defn merge-order-by [sql-map & fields]
|
||||
(update-in sql-map [:order-by] concat fields))
|
||||
|
||||
(defn limit
|
||||
([l]
|
||||
(limit {} l))
|
||||
([sql-map l]
|
||||
(assoc sql-map :limit l)))
|
||||
|
||||
(defn offset
|
||||
([o]
|
||||
(offset {} o))
|
||||
([sql-map o]
|
||||
(assoc sql-map :offset o)))
|
||||
|
||||
(def ^:private handlers
|
||||
{:select select
|
||||
:from from
|
||||
:where where
|
||||
:join join
|
||||
:group-by group-by
|
||||
:having having
|
||||
:order-by order-by
|
||||
:limit limit
|
||||
:offset offset})
|
||||
|
||||
(def ^:private merge-handlers
|
||||
{:select merge-select
|
||||
:from merge-from
|
||||
:where merge-where
|
||||
:join merge-join
|
||||
:group-by merge-group-by
|
||||
:having merge-having
|
||||
:order-by merge-order-by
|
||||
:limit limit
|
||||
:offset offset})
|
||||
|
||||
(defn- build-sql [handlers clauses]
|
||||
(let [[base clauses] (if (map? (first clauses))
|
||||
[(first clauses) (rest clauses)]
|
||||
[{} clauses])]
|
||||
(reduce
|
||||
(fn [sql-map [op args]]
|
||||
(let [handler (handlers op)]
|
||||
(if (or (#{:where :having} op) (not (coll? args)))
|
||||
(handler sql-map args)
|
||||
(apply handler sql-map args))))
|
||||
base
|
||||
(partition 2 clauses))))
|
||||
|
||||
(defn sql [& clauses]
|
||||
(build-sql handlers clauses))
|
||||
|
||||
(defn merge-sql [& clauses]
|
||||
(build-sql merge-handlers clauses))
|
||||
|
|
|
|||
Loading…
Reference in a new issue