-
Notifications
You must be signed in to change notification settings - Fork 7
/
util.clj
50 lines (39 loc) · 1.07 KB
/
util.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(ns com.verybigthings.penkala.util
(:require [clojure.string :as str]
[camel-snake-kebab.core :refer [->kebab-case-string]]))
(def joins
{:left "LEFT OUTER JOIN"
:left-lateral "LEFT JOIN LATERAL"
:right "RIGHT OUTER JOIN"
:inner "INNER JOIN"
:inner-lateral "INNER JOIN LATERAL"
:full "FULL OUTER JOIN"
:cross "CROSS JOIN"})
(def join-separator "__")
(def join-separator-re #"__")
(defn path-prefix-join [path]
(str/join join-separator path))
(defn path-prefix-split [str]
(str/split str join-separator-re))
(defn str-quote [s]
(str "\"" (if (keyword? s) (name s) s) "\""))
(def q str-quote)
(defn select-keys-with-default [m ks default]
(reduce
(fn [acc k]
(assoc acc k (get m k default)))
{}
ks))
(defn as-vec [val]
(when val
(if (sequential? val) (vec val) [val])))
(defn expand-join-path [path]
(mapcat (fn [v] [:joins (keyword v) :relation]) path))
(def vec-conj (fnil conj []))
(defn col->alias [col]
(->> col
name
path-prefix-split
(map ->kebab-case-string)
path-prefix-join
keyword))