Merge pull request #76 from cddr/add-support-for-exists-clause

[#75] Add support for exists
This commit is contained in:
Michael Blume 2015-05-08 14:00:49 -07:00
commit 1a4f5c0acd
4 changed files with 27 additions and 7 deletions

1
.gitignore vendored
View file

@ -11,4 +11,5 @@ pom.xml*
.nrepl-port .nrepl-port
.classpath .classpath
.project .project
.nrepl-port
bin bin

View file

@ -1,5 +1,6 @@
## 0.5.3 In development ## 0.5.3 In development
* Support exists syntax (@cddr)
* Support locking selects (@dball) * Support locking selects (@dball)
* Add sql array type and reader literal (@loganmhb) * Add sql array type and reader literal (@loganmhb)
* Allow user to specify where in sort order NULLs fall (@mishok13) * Allow user to specify where in sort order NULLs fall (@mishok13)

View file

@ -350,13 +350,18 @@
(to-sql pred) (to-sql pred)
(let [[op & args] pred (let [[op & args] pred
op-name (name op)] op-name (name op)]
(if (= "not" op-name) (case op-name
(str "NOT " (format-predicate* (first args))) "not" (str "NOT " (format-predicate* (first args)))
(if (#{"and" "or" "xor"} op-name)
(paren-wrap ("and" "or" "xor")
(string/join (str " " (string/upper-case op-name) " ") (paren-wrap
(map format-predicate* args))) (string/join (str " " (string/upper-case op-name) " ")
(to-sql (apply call pred))))))) (map format-predicate* args)))
"exists"
(str "EXISTS " (to-sql (first args)))
(to-sql (apply call pred))))))
(defmulti format-clause (defmulti format-clause
"Takes a map entry representing a clause and returns an SQL string" "Takes a map entry representing a clause and returns an SQL string"
@ -370,6 +375,9 @@
(defmethod format-clause :default [& _] (defmethod format-clause :default [& _]
"") "")
(defmethod format-clause :exists [[_ table-expr] _]
(str "EXISTS " (to-sql table-expr)))
(defmethod format-clause :select [[_ fields] sql-map] (defmethod format-clause :select [[_ fields] sql-map]
(str "SELECT " (str "SELECT "
(when (:modifiers sql-map) (when (:modifiers sql-map)

View file

@ -34,6 +34,16 @@
(is (= (format-clause (first {:insert-into [[:foo [:a :b :c]] {:select [:d :e :f] :from [:baz]}]}) nil) (is (= (format-clause (first {:insert-into [[:foo [:a :b :c]] {:select [:d :e :f] :from [:baz]}]}) nil)
"INSERT INTO foo (a, b, c) SELECT d, e, f FROM baz"))) "INSERT INTO foo (a, b, c) SELECT d, e, f FROM baz")))
(deftest exists-test
(is (= (format {:exists {:select [:a] :from [:foo]}})
["EXISTS (SELECT a FROM foo)"]))
(is (= (format {:select [:id]
:from [:foo]
:where [:exists {:select [1]
:from [:bar]
:where :deleted}]})
["SELECT id FROM foo WHERE EXISTS (SELECT 1 FROM bar WHERE deleted)"])))
(deftest array-test (deftest array-test
(is (= (format {:insert-into :foo (is (= (format {:insert-into :foo
:columns [:baz] :columns [:baz]