Skip to content

Commit f74eb0e

Browse files
Ian Bishopkriyative
Ian Bishop
authored andcommitted
Add support for inner joins, joining on select statements (#10)
1 parent 6de0c26 commit f74eb0e

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

src/sqly/core.clj

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,24 @@
259259
{:separator " "
260260
:emitters {:map emit-where-map}})))
261261

262+
(declare emit-select)
263+
262264
(defn emit-join-clause [clause content]
263265
(when (not-empty content)
264266
(->> content
265267
(map
266-
(fn [{:keys [type from on]}]
268+
(fn [{:keys [type from on select as] :as join}]
267269
(str/join " "
268270
[(cond
269-
(#{:left :right :full} type)
271+
(#{:left :right :full :inner} type)
270272
(str (name type) " join")
271273
:else "join")
272-
(emit-idents (ensure-seq from))
274+
(if select
275+
(let [s (emit-select (select-keys join [:select :distinct? :from :group-by :order-by :limit]))]
276+
(str "(" s ")"
277+
(when as
278+
(str " as " (name as)))))
279+
(emit-idents (ensure-seq from)))
273280
(emit-where-clause "on" on)])))
274281
(str/join " "))))
275282

test/sqly/core_test.clj

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@
161161
" AS purchases_per_offer_loads"])
162162
(sql/sql
163163
'{:with {:get-offer (sql
164-
{:select {:count (count 1)}
165-
:from :myapp.cues
166-
:where (= :cue "myapp.get-offer")})
164+
{:select {:count (count 1)}
165+
:from :myapp.cues
166+
:where (= :cue "myapp.get-offer")})
167167
:purchase (sql
168168
{:select {:count (count 1)}
169169
:from :myapp.cues
@@ -390,3 +390,27 @@
390390
:from :a_events
391391
:where {:id ["foo" "bar"]
392392
:name "baz"}}))))
393+
394+
395+
(deftest select-join-test
396+
(is (= (canon
397+
["select b1.id1 as id1 from a_events as b1"
398+
" inner join (select distinct id1 as id1,id2 as id2,max(id3) as id3"
399+
" from a_events group by id1,id2) as b2"
400+
" on (b1.id1 = b2.id1)"
401+
" and (b1.id2 = b2.id2)"
402+
" and (b1.id3 = b2.id3)"])
403+
(sql/sql
404+
'{:select {:id1 :b1/id1}
405+
:from {:b1 :a_events}
406+
:join [{:type :inner
407+
:select {:id1 :id1
408+
:id2 :id2
409+
:id3 (max :id3)}
410+
:distinct? true
411+
:from :a_events
412+
:group-by [:id1 :id2]
413+
:on {:b1/id1 :b2/id1
414+
:b1/id2 :b2/id2
415+
:b1/id3 :b2/id3}
416+
:as :b2}]}))))

0 commit comments

Comments
 (0)