Merge pull request #76 from cddr/add-support-for-exists-clause
[#75] Add support for exists
This commit is contained in:
commit
1a4f5c0acd
4 changed files with 27 additions and 7 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -11,4 +11,5 @@ pom.xml*
|
||||||
.nrepl-port
|
.nrepl-port
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
|
.nrepl-port
|
||||||
bin
|
bin
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue