Skip to content

Commit dca637d

Browse files
committed
Add implied grouping for project/let
1 parent dea9f66 commit dca637d

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

src/com/wotbrew/cinq/plan.clj

+23
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,14 @@
235235

236236
_ (throw (ex-info "Not sure how to get columns from ra" {:ra ra}))))
237237

238+
(defn grouped? [ra]
239+
(boolean (some #{%count-sym} (columns ra))))
240+
241+
(def aggregate-keywords
242+
#{::count ::max ::min ::avg ::sum})
243+
244+
(defn uses-aggregate? [expr] (boolean (some aggregate-keywords (tree-seq seqable? seq expr))))
245+
238246
(defn dependent-cols* [cmap expr]
239247
(let [dmap (atom {})]
240248
((fn ! [expr]
@@ -1025,8 +1033,23 @@
10251033
r/attempt
10261034
r/top-down))
10271035

1036+
(def imply-grouping
1037+
(-> (r/match
1038+
(m/and [::project ?ra ?bindings]
1039+
(m/guard (some (fn [[_ expr]] (uses-aggregate? expr)) ?bindings))
1040+
(m/guard (not (grouped? ?ra))))
1041+
[::project [::group-by ?ra []] ?bindings]
1042+
1043+
(m/and [::let ?ra ?bindings]
1044+
(m/guard (some (fn [[_ expr]] (uses-aggregate? expr)) ?bindings))
1045+
(m/guard (not (grouped? ?ra))))
1046+
[::let [::group-by ?ra []] ?bindings])
1047+
r/attempt
1048+
r/top-down))
1049+
10281050
(defn rewrite [ra]
10291051
(-> ra
1052+
imply-grouping
10301053
unique-ify-sub-queries
10311054
unique-ify
10321055
rewrite-sub-queries
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(ns com.wotbrew.cinq.implicit-group-test
2+
(:require [clojure.test :refer :all]
3+
[com.wotbrew.cinq :as c]))
4+
5+
(deftest groups-are-added-for-top-level-project-test
6+
(is (= [4] (vec (c/q [a [1 2 3 4]] (c/count)))))
7+
(is (= [3] (vec (c/q [a [1 2 3 nil]] (c/count a)))))
8+
(is (= [3] (vec (c/q [a [1 2]] (c/sum a)))))
9+
(is (= [1] (vec (c/q [a [2 1]] (c/min a)))))
10+
(is (= [2] (vec (c/q [a [1 2]] (c/max a)))))
11+
(is (= [3/2] (vec (c/q [a [1 2]] (c/avg a))))))
12+
13+
(deftest groups-added-to-let-test
14+
(is (= [1] (vec (c/q [a [] :let [n (+ 1 (c/count))]] n)))))

todo.txt

-8
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,6 @@ Like create-index, these functions create and return an index. In the case of fo
4242

4343
---
4444

45-
Implicit group
46-
47-
(q [f foo] (c/count))
48-
49-
if let/proj/where/join/scan-src/group-expr/order-expr expr expects grouping, add it if is not already present
50-
51-
---
52-
5345
Spilling
5446

5547
spilled merge join

0 commit comments

Comments
 (0)