2012-07-13 12:50:20 +00:00
|
|
|
(ns honeysql.core
|
2012-07-13 14:53:19 +00:00
|
|
|
(:refer-clojure :exclude [group-by format])
|
|
|
|
|
(:require [honeysql.format :as format]
|
2012-07-13 16:43:18 +00:00
|
|
|
[honeysql.types :as types]
|
2012-08-24 20:50:56 +00:00
|
|
|
[honeysql.helpers :refer [build-clause]]
|
2015-06-14 19:58:51 +00:00
|
|
|
#?(:clj [honeysql.util :refer [defalias]])
|
2012-08-25 01:52:36 +00:00
|
|
|
[clojure.string :as string]))
|
2012-07-13 12:50:20 +00:00
|
|
|
|
2015-06-14 19:58:51 +00:00
|
|
|
(#?(:clj defalias :cljs def) call types/call)
|
|
|
|
|
(#?(:clj defalias :cljs def) raw types/raw)
|
|
|
|
|
(#?(:clj defalias :cljs def) param types/param)
|
2017-07-18 18:27:39 +00:00
|
|
|
(#?(:clj defalias :cljs def) inline types/inline)
|
2015-06-14 19:58:51 +00:00
|
|
|
(#?(: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)
|
2012-07-13 12:50:20 +00:00
|
|
|
|
2012-08-25 01:52:36 +00:00
|
|
|
(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
|
2015-01-27 23:54:35 +00:00
|
|
|
(string/join "."
|
|
|
|
|
(for [s qualifiers+name
|
|
|
|
|
:when (not (nil? s))]
|
|
|
|
|
(if (keyword? s)
|
|
|
|
|
(name s)
|
|
|
|
|
(str s))))))
|
2012-08-25 01:52:36 +00:00
|
|
|
|
|
|
|
|
(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
|
2012-10-19 16:41:26 +00:00
|
|
|
:left-join, :merge-left-join
|
|
|
|
|
:right-join, :merge-right-join
|
2014-11-05 21:04:21 +00:00
|
|
|
:full-join, :merge-full-join
|
2020-05-29 23:01:49 +00:00
|
|
|
:cross-join, :merge-cross-join
|
2012-08-25 01:52:36 +00:00
|
|
|
:where, :merge-where
|
|
|
|
|
:group-by, :merge-group-by
|
|
|
|
|
:having, :merge-having
|
|
|
|
|
:limit
|
|
|
|
|
:offset
|
2013-09-06 14:18:05 +00:00
|
|
|
:modifiers, :merge-modifiers
|
|
|
|
|
:insert-into
|
2013-12-12 02:35:38 +00:00
|
|
|
:columns, :merge-columns
|
2013-09-06 16:19:13 +00:00
|
|
|
:values, :merge-values
|
2013-12-12 02:35:38 +00:00
|
|
|
:query-values
|
2013-09-06 14:18:05 +00:00
|
|
|
:update
|
|
|
|
|
:set
|
|
|
|
|
:delete-from"
|
2012-08-25 01:52:36 +00:00
|
|
|
[& clauses]
|
2012-07-13 12:50:20 +00:00
|
|
|
(let [[base clauses] (if (map? (first clauses))
|
|
|
|
|
[(first clauses) (rest clauses)]
|
|
|
|
|
[{} clauses])]
|
|
|
|
|
(reduce
|
|
|
|
|
(fn [sql-map [op args]]
|
2012-08-24 20:50:56 +00:00
|
|
|
(build-clause op sql-map args))
|
2012-08-24 21:08:22 +00:00
|
|
|
(if (empty? base)
|
|
|
|
|
base
|
|
|
|
|
(apply build (apply concat base)))
|
2013-09-06 22:29:41 +00:00
|
|
|
(partition 2 clauses))))
|
2021-02-02 00:24:19 +00:00
|
|
|
|
|
|
|
|
(comment
|
|
|
|
|
(require '[honeysql.core :as sql])
|
|
|
|
|
(sql/format {:select [:*] :from [:table] :where [:= :id 1]})
|
|
|
|
|
(sql/format {:select [:*] :from [:table] :where [:= :id 1]} :quoting :mysql)
|
|
|
|
|
,)
|