Implement :inline syntax; allow select call without alias
This commit is contained in:
parent
97531fa4cf
commit
3ce47b92f2
2 changed files with 35 additions and 19 deletions
|
|
@ -101,13 +101,15 @@
|
||||||
|
|
||||||
(defn- format-entity-alias [x]
|
(defn- format-entity-alias [x]
|
||||||
(cond (sequential? x)
|
(cond (sequential? x)
|
||||||
(str (let [s (first x)]
|
(let [s (first x)
|
||||||
(if (map? s)
|
pair? (< 1 (count x))]
|
||||||
|
(when (map? s)
|
||||||
(throw (ex-info "selectable cannot be statement!"
|
(throw (ex-info "selectable cannot be statement!"
|
||||||
{:selectable s}))
|
{:selectable s})))
|
||||||
(format-entity s)))
|
(cond-> (format-entity s)
|
||||||
#_" AS " " "
|
pair?
|
||||||
(format-entity (second x) {:aliased? true}))
|
(str #_" AS " " "
|
||||||
|
(format-entity (second x) {:aliased? true}))))
|
||||||
|
|
||||||
:else
|
:else
|
||||||
(format-entity x)))
|
(format-entity x)))
|
||||||
|
|
@ -118,15 +120,19 @@
|
||||||
|
|
||||||
(sequential? x)
|
(sequential? x)
|
||||||
(let [s (first x)
|
(let [s (first x)
|
||||||
|
pair? (< 1 (count x))
|
||||||
a (second x)
|
a (second x)
|
||||||
[sql & params] (if (map? s)
|
[sql & params] (if (map? s)
|
||||||
(format-dsl s {:nested? true})
|
(format-dsl s {:nested? true})
|
||||||
(format-expr s))
|
(format-expr s))
|
||||||
[sql' & params'] (if (sequential? a)
|
[sql' & params'] (when pair?
|
||||||
|
(if (sequential? a)
|
||||||
(let [[sql params] (format-expr-list a {:aliased? true})]
|
(let [[sql params] (format-expr-list a {:aliased? true})]
|
||||||
(into [(str/join " " sql)] params))
|
(into [(str/join " " sql)] params))
|
||||||
(format-selectable-dsl a {:aliased? true}))]
|
(format-selectable-dsl a {:aliased? true})))]
|
||||||
(-> [(str sql (if as? " AS " " ") sql')]
|
(-> [(cond-> sql
|
||||||
|
pair?
|
||||||
|
(str (if as? " AS " " ") sql'))]
|
||||||
(into params)
|
(into params)
|
||||||
(into params')))
|
(into params')))
|
||||||
|
|
||||||
|
|
@ -401,6 +407,14 @@
|
||||||
(into (vals infix-aliases))
|
(into (vals infix-aliases))
|
||||||
(->> (into #{} (map keyword)))))
|
(->> (into #{} (map keyword)))))
|
||||||
|
|
||||||
|
(defn- sqlize-value [x]
|
||||||
|
(cond
|
||||||
|
(nil? x) "NULL"
|
||||||
|
(string? x) x ; I feel this should be 'single-quoted' but 1.x does not
|
||||||
|
(symbol? x) (name x)
|
||||||
|
(keyword? x) (name x)
|
||||||
|
:else (str x)))
|
||||||
|
|
||||||
(def ^:private special-syntax
|
(def ^:private special-syntax
|
||||||
{:array
|
{:array
|
||||||
(fn [[arr]]
|
(fn [[arr]]
|
||||||
|
|
@ -419,6 +433,9 @@
|
||||||
(fn [[x type]]
|
(fn [[x type]]
|
||||||
(let [[sql & params] (format-expr x)]
|
(let [[sql & params] (format-expr x)]
|
||||||
(into [(str "CAST(" sql " AS " (sql-kw type) ")")] params)))
|
(into [(str "CAST(" sql " AS " (sql-kw type) ")")] params)))
|
||||||
|
:inline
|
||||||
|
(fn [[x]]
|
||||||
|
[(sqlize-value x)])
|
||||||
:interval
|
:interval
|
||||||
(fn [[n units]]
|
(fn [[n units]]
|
||||||
(let [[sql & params] (format-expr n)]
|
(let [[sql & params] (format-expr n)]
|
||||||
|
|
|
||||||
|
|
@ -291,11 +291,10 @@
|
||||||
(format {:dialect :mysql})))))
|
(format {:dialect :mysql})))))
|
||||||
|
|
||||||
(deftest inlined-values-are-stringified-correctly
|
(deftest inlined-values-are-stringified-correctly
|
||||||
(is nil "inline unimplemented")
|
(is (= ["SELECT foo, bar, NULL"]
|
||||||
#_(is (= ["SELECT foo, bar, NULL"]
|
(format {:select [[[:inline "foo"]]
|
||||||
(format {:select [(honeysql.core/inline "foo")
|
[[:inline :bar]]
|
||||||
(honeysql.core/inline :bar)
|
[[:inline nil]]]}))))
|
||||||
(honeysql.core/inline nil)]}))))
|
|
||||||
|
|
||||||
;; Make sure if Locale is Turkish we're not generating queries like İNNER JOIN (dot over the I) because
|
;; Make sure if Locale is Turkish we're not generating queries like İNNER JOIN (dot over the I) because
|
||||||
;; `string/upper-case` is converting things to upper-case using the default Locale. Generated query should be the same
|
;; `string/upper-case` is converting things to upper-case using the default Locale. Generated query should be the same
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue