Skip to content

Instantly share code, notes, and snippets.

View camsaul's full-sized avatar
💭
I am Cam

Cam Saul camsaul

💭
I am Cam
View GitHub Profile
@camsaul
camsaul / multischema.clj
Created July 12, 2019 17:47
Multimethod schemas
(def Apple
{::type (s/eq :apple)
:color (s/enum :red :yellow :green)})
(def Orange
{::type (s/eq :orange)
:color (s/eq :orange)})
(def Fruit
(s/conditional
@camsaul
camsaul / util.clj
Created June 13, 2019 17:07
Mongo driver ideas
(defn- normalize-details [details]
(let [{:keys [dbname host port user pass ssl authdb tunnel-host tunnel-user tunnel-pass additional-options]
:or {port 27017, pass "", ssl false}} details
;; ignore empty :user and :pass strings
user (when (seq user)
user)
pass (when (seq pass)
pass)
authdb (if (seq authdb)
authdb
@camsaul
camsaul / graph.edn
Last active May 29, 2019 21:31
Code used to profile performance improvements to ns-tracker transitive
{:dependencies
{metabase.query-processor
#{metabase.query-processor.middleware.expand-macros metabase.query-processor.middleware.bind-effective-timezone metabase.query-processor.middleware.resolve-joins
metabase.query-processor.middleware.driver-specific metabase.query-processor.middleware.catch-exceptions metabase.query-processor.middleware.splice-params-in-response schema.core
metabase.query-processor.middleware.async metabase.query-processor.middleware.format-rows metabase.query-processor.middleware.add-row-count-and-status
metabase.query-processor.middleware.add-implicit-joins metabase.query-processor.middleware.resolve-fields metabase.query-processor.middleware.normalize-query
metabase.query-processor.middleware.validate metabase.driver metabase.query-processor.middleware.resolve-source-table metabase.query-processor.middleware.annotate
metabase.query-processor.middleware.process-userland-query metabase.query-processor.middleware.reconcile-breakout-and-order-by-bucketing metabase.q
@camsaul
camsaul / log_bindings.clj
Created May 17, 2019 20:00
Clojure macro to log bindings
(defmacro logged-binding {:style/indent 1} [[symb val] & body]
`(do
(let [val# ~val]
(println
(colorize.core/magenta
(format ~(format "[%s:%d] BOUND %s -> %%s" (ns-name *ns*) (:line (meta &form)) (str symb)) val#)))
(let [result# (binding [~symb val#]
~@body)]
(println
(colorize.core/red
@camsaul
camsaul / docker-cleanup.sh
Created May 15, 2019 00:12
Docker cleanup
docker system prune -a
@camsaul
camsaul / joins.clj
Last active May 9, 2019 21:06
MBQL join syntax
(def JoinStrategy
"Strategy that should be used to perform the equivalent of a SQL `JOIN` against another table or a nested query.
These correspond 1:1 to features of the same name in driver features lists; e.g. you should check that the current
driver supports `:outer-join` before generating a Join clause using that strategy."
(s/enum :left-join :right-join :inner-join :outer-join))
(def Join
"Perform the equivalent of a SQL `JOIN` with another Table or nested `:source-query`. JOINs are either explicitly
specified in the incoming query, or implicitly generated when one uses a `:fk->` clause.
@camsaul
camsaul / break_coins_core_logic.clj
Created March 28, 2019 01:55
break-coins-with-core-logic.clj
(ns my-coins-project.core
(:require [clojure.core.logic :as l]
[clojure.core.logic.fd :as fd]))
(def ^:private coins
{:penny 1, :nickel 5, :dime 10, :quarter 25})
(defn- fd-sum
"Like fd/+ but for more than 2 lvars."
[[lv1 lv2 & more] total]
@camsaul
camsaul / break_coins.clj
Created March 28, 2019 01:54
break-coins.clj
(ns my-coins-project.core)
;; Return all the different ways you can make change for a given amount of cents.
;; Basic idea is to start with number of pennies and then successively apply `apply-coin` for each coin in order from
;; largest to smallest. `apply-coin` will take a lazy seq of existing combinations and return a new lazy seq that includes
;; a new combination with each possible quantity of the coin in question for each existing combination.
;;
;; (apply-coin [:quarter 25] [{:penny 60}])
;; ;; -> [{:quarter 0, :penny 60}, {:quarter 1, :penny 35}, {:quarter 2, :penny 10}]
;;
@camsaul
camsaul / server.clj
Last active March 7, 2019 03:00
Test server & client for doing things like benchmarking Clojure HTTP servers or various endpoints. Tweak as needed
(ns metabase.server
(:require [ring.adapter.jetty :as ring-jetty])
(:import org.eclipse.jetty.server.Server
org.eclipse.jetty.server.handler.AbstractHandler))
(defn- ^AbstractHandler async-default [handler]
(#'ring-jetty/async-proxy-handler handler 0))
(defn- create-server
^Server [handler options]
@camsaul
camsaul / changelog_to_sql.clj
Created February 20, 2019 01:25
Get the SQL for a Liquibase changeset
(defn changeset->sql [^Liquibase liquibase, ^String changelog-file, ^String author, ^String id]
(let [database (.getDatabase liquibase)
sql-generator-factory (liquibase.sqlgenerator.SqlGeneratorFactory/getInstance)]
(for [change (-> liquibase
.getDatabaseChangeLog
(.getChangeSet changelog-file author id)
.getChanges)
statement (.generateStatements change database)
sql (.generateSql sql-generator-factory statement database)]
(.toSql sql))))