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
|
||||
.classpath
|
||||
.project
|
||||
.nrepl-port
|
||||
bin
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
## 0.5.3 In development
|
||||
|
||||
* Support exists syntax (@cddr)
|
||||
* Support locking selects (@dball)
|
||||
* Add sql array type and reader literal (@loganmhb)
|
||||
* Allow user to specify where in sort order NULLs fall (@mishok13)
|
||||
|
|
|
|||
|
|
@ -350,13 +350,18 @@
|
|||
(to-sql pred)
|
||||
(let [[op & args] pred
|
||||
op-name (name op)]
|
||||
(if (= "not" op-name)
|
||||
(str "NOT " (format-predicate* (first args)))
|
||||
(if (#{"and" "or" "xor"} op-name)
|
||||
(paren-wrap
|
||||
(string/join (str " " (string/upper-case op-name) " ")
|
||||
(map format-predicate* args)))
|
||||
(to-sql (apply call pred)))))))
|
||||
(case op-name
|
||||
"not" (str "NOT " (format-predicate* (first args)))
|
||||
|
||||
("and" "or" "xor")
|
||||
(paren-wrap
|
||||
(string/join (str " " (string/upper-case op-name) " ")
|
||||
(map format-predicate* args)))
|
||||
|
||||
"exists"
|
||||
(str "EXISTS " (to-sql (first args)))
|
||||
|
||||
(to-sql (apply call pred))))))
|
||||
|
||||
(defmulti format-clause
|
||||
"Takes a map entry representing a clause and returns an SQL string"
|
||||
|
|
@ -370,6 +375,9 @@
|
|||
(defmethod format-clause :default [& _]
|
||||
"")
|
||||
|
||||
(defmethod format-clause :exists [[_ table-expr] _]
|
||||
(str "EXISTS " (to-sql table-expr)))
|
||||
|
||||
(defmethod format-clause :select [[_ fields] sql-map]
|
||||
(str "SELECT "
|
||||
(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)
|
||||
"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
|
||||
(is (= (format {:insert-into :foo
|
||||
:columns [:baz]
|
||||
|
|
|
|||
Loading…
Reference in a new issue