76 lines
2.3 KiB
Clojure
76 lines
2.3 KiB
Clojure
(ns honeysql.core
|
|
(:refer-clojure :exclude [group-by format])
|
|
(:require [honeysql.format :as format]
|
|
[honeysql.types :as types]
|
|
[honeysql.helpers :refer [build-clause]]
|
|
#?(:clj [honeysql.util :refer [defalias]])
|
|
[clojure.string :as string]))
|
|
|
|
(#?(:clj defalias :cljs def) call types/call)
|
|
(#?(:clj defalias :cljs def) raw types/raw)
|
|
(#?(:clj defalias :cljs def) param types/param)
|
|
(#?(:clj defalias :cljs def) inline types/inline)
|
|
(#?(:clj defalias :cljs def) format format/format)
|
|
(#?(:clj defalias :cljs def) format-predicate format/format-predicate)
|
|
(#?(:clj defalias :cljs def) quote-identifier format/quote-identifier)
|
|
|
|
(defn qualify
|
|
"Takes one or more keyword or string qualifers and name. Returns
|
|
a keyword of the concatenated qualifiers and name separated by periods.
|
|
|
|
(qualify :foo \"bar\" :baz) => :foo.bar.baz"
|
|
[& qualifiers+name]
|
|
(keyword
|
|
(string/join "."
|
|
(for [s qualifiers+name
|
|
:when (not (nil? s))]
|
|
(if (keyword? s)
|
|
(name s)
|
|
(str s))))))
|
|
|
|
(defn build
|
|
"Takes a series of clause+data pairs and returns a SQL map. Example:
|
|
|
|
(build :select [:a :b]
|
|
:from :bar)
|
|
|
|
Clauses are defined with the honeysql.helpers/build-clause multimethod.
|
|
Built-in clauses include:
|
|
|
|
:select, :merge-select, :un-select
|
|
:from, :merge-from
|
|
:join, :merge-join
|
|
:left-join, :merge-left-join
|
|
:right-join, :merge-right-join
|
|
:full-join, :merge-full-join
|
|
:cross-join, :merge-cross-join
|
|
:where, :merge-where
|
|
:group-by, :merge-group-by
|
|
:having, :merge-having
|
|
:limit
|
|
:offset
|
|
:modifiers, :merge-modifiers
|
|
:insert-into
|
|
:columns, :merge-columns
|
|
:values, :merge-values
|
|
:query-values
|
|
:update
|
|
:set
|
|
:delete-from"
|
|
[& clauses]
|
|
(let [[base clauses] (if (map? (first clauses))
|
|
[(first clauses) (rest clauses)]
|
|
[{} clauses])]
|
|
(reduce
|
|
(fn [sql-map [op args]]
|
|
(build-clause op sql-map args))
|
|
(if (empty? base)
|
|
base
|
|
(apply build (apply concat base)))
|
|
(partition 2 clauses))))
|
|
|
|
(comment
|
|
(require '[honeysql.core :as sql])
|
|
(sql/format {:select [:*] :from [:table] :where [:= :id 1]})
|
|
(sql/format {:select [:*] :from [:table] :where [:= :id 1]} :quoting :mysql)
|
|
,)
|