-
Notifications
You must be signed in to change notification settings - Fork 28
/
window.clj
30 lines (23 loc) · 1.06 KB
/
window.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(ns zero-one.geni.window
(:require
[zero-one.geni.column :refer [->col-array]]
[zero-one.geni.utils :refer [ensure-coll]])
(:import
(org.apache.spark.sql.expressions Window)))
(defn- new-window []
(Window/partitionBy (->col-array [])))
(defn- set-partition-by [window-spec exprs]
(.partitionBy window-spec (->col-array exprs)))
(defn- set-order-by [window-spec exprs]
(.orderBy window-spec (->col-array exprs)))
(defn- set-range-between [window-spec range-map]
(.rangeBetween window-spec (:start range-map) (:end range-map)))
(defn- set-rows-between [window-spec range-map]
(.rowsBetween window-spec (:start range-map) (:end range-map)))
(defn window [{:keys [partition-by order-by range-between rows-between]}]
(-> (new-window)
(cond-> partition-by (set-partition-by (ensure-coll partition-by)))
(cond-> order-by (set-order-by (ensure-coll order-by)))
(cond-> range-between (set-range-between range-between))
(cond-> rows-between (set-rows-between rows-between))))
(defn over [column window-spec] (.over column window-spec))