Skip to content

Instantly share code, notes, and snippets.

@polymeris
Created June 28, 2016 08:18
Show Gist options
  • Save polymeris/8fbd7822324b84c69144a54f6f85156b to your computer and use it in GitHub Desktop.
Save polymeris/8fbd7822324b84c69144a54f6f85156b to your computer and use it in GitHub Desktop.
(defn- parse-cron-part-range
[p]
(let [ab (split p #"-")
a (read-string (first ab))
b (read-string (second ab))]
(assert (< a b))
(range a (inc b))))
(defn- parse-cron-part
[p]
(cond (nil? p) nil
(contains? #{"*" "?"} p) nil
(.contains p ",") (flatten (for [sp (split p #",")]
(parse-cron-part sp)))
(.contains p "-") (parse-cron-part-range p)
:else [(read-string p)]))
(defn- parse-cron
[c]
(let [parts (split c #"\s+")
dows (parse-cron-part (get parts 4))]
(assert (<= 5 (count parts) 6))
{:minute (parse-cron-part (get parts 0))
:hour (parse-cron-part (get parts 1))
:day (parse-cron-part (get parts 2))
:month (parse-cron-part (get parts 3))
:dow (if dows (map #(mod % 7) dows)
nil)
:year (parse-cron-part (get parts 5))}))
(defn- psql-list
[values]
(->> (join "," values)
(format "(%s)")))
(defn- psql-sentence
[k field list]
(format "EXTRACT(%s FROM %s) IN %s" (name k) field list))
(defn- generate-query
[spec field]
(->> (for [[k v] spec]
(when v (->> (psql-list v)
(psql-sentence k field))))
(filter not-empty)
(join " AND ")
(format "(%s)")))
(defn cron->psql
[cron field]
(-> (parse-cron cron)
(generate-query field)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment