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 / sparksql_connection_test.clj
Created February 16, 2022 19:27
Tree Shaking the Hive JDBC Driver
(ns metabase.driver.sparksql-connection-test
(:require [clojure.java.jdbc :as jdbc]
[clojure.test :refer :all]))
(deftest connection-test
(println (pr-str (Class/forName "org.apache.hive.jdbc.HiveConnection")))
(is (some? (Class/forName "org.apache.hive.jdbc.HiveConnection")))
(println (pr-str (require 'metabase.driver.hive-like.fixed-hive-connection)))
(is (nil? (require 'metabase.driver.hive-like.fixed-hive-connection)))
@camsaul
camsaul / h2.clj
Created February 18, 2022 02:17
Custom Liquibase Table SQL Generator in Clojure
(ns metabase.db.liquibase.h2
"Loading this namespace will replace the default `H2Database` implementation with our custom subclass that uppercases
all identifiers."
(:require [metabase.util :as u]
[clojure.string :as str])
(:import liquibase.database.DatabaseFactory
liquibase.database.jvm.JdbcConnection
liquibase.change.ChangeMetaData
liquibase.change.core.CreateTableChange
liquibase.change.ChangeFactory
@camsaul
camsaul / asm.clj
Created March 10, 2022 23:09
ASM
(ns asm
(:import liquibase.database.core.H2Database
liquibase.database.jvm.JdbcConnection
[org.objectweb.asm Opcodes ClassWriter Type]
[org.objectweb.asm.commons Method GeneratorAdapter]))
(defn x ^ClassWriter []
(let [flags 0
classwriter (org.objectweb.asm.ClassWriter. flags)]
;; define the Class
@camsaul
camsaul / defenterprise.clj
Last active April 20, 2022 20:12
defenterprise macro PoC
(ns metabase.public-settings.premium-features.defenterprise
(:require [clojure.string :as str]
[metabase.plugins.classloader :as classloader]
[metabase.public-settings.premium-features :as premium-features]
[metabase.util :as u]))
;;; Map of (qualified) function name -> {:oss <oss/fallback fn>
;;; :ee <ee fn>}
(defonce ^:private registry
(atom {}))
@camsaul
camsaul / x.clj
Created June 3, 2022 17:52
Metabase Query Processor Demo Stuff
(ns metabase.x
(:require [clojure.test :refer :all]
dev.debug-qp
[metabase.models.database :refer [Database]]
[metabase.query-processor :as qp]
[metabase.test :as mt]
[metabase.query-processor.context :as qp.context]
[metabase.query-processor.context.default :as context.default]
[clojure.pprint :as pprint]
[metabase.driver.sql.query-processor :as sql.qp]
@camsaul
camsaul / custom_methods.clj
Last active July 15, 2022 01:42
≈ example tests
(deftest custom-unify-methods
(is (≈ {[String java.time.temporal.Temporal]
(fn [_next-method expected actual]
(let [actual-str (u.date/format actual)]
(when-not (= expected actual-str)
(list 'not= expected (symbol "#t") actual-str))))}
"2022-07-14"
#t "2022-07-14"))
(is (≈ {[String String]
@camsaul
camsaul / pom.xml
Created November 8, 2022 20:20
Athena driver pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Athena</groupId>
<artifactId>AthenaJDBC${env.JDBC_V}</artifactId>
<version>${env.MAJOR_V}.${env.MINOR_V}.${env.REVISION_V}.${env.BUILD_V}</version>
<packaging>jar</packaging>
<name>AthenaJDBC${env.JDBC_V}</name>
<url>http://maven.apache.org</url>
@camsaul
camsaul / x.clj
Created November 29, 2022 20:27
Sample Dataset Profiling (ZIP/JAR vs file)
(ns metabase.x
(:require
[metabase.sync :as sync]
[toucan.db :as db]))
(defmulti ^:private info
{:arglists '([location])}
keyword)
(defmethod info :jar
@camsaul
camsaul / db.clj
Created December 7, 2022 17:40
Dynamic app DB
(ns waterfront.db
(:require
[waterfront.config :as config]
[waterfront.db.migrations :as db.migrations]
[toucan.db :as t.db])
(:import
(com.mchange.v2.c3p0 DataSources)))
(set! *warn-on-reflection* true)
@camsaul
camsaul / test-data.sql
Last active January 20, 2023 21:52
Postgres test data (SQL
DROP TABLE IF EXISTS checkins;
DROP TABLE IF EXISTS venues;
DROP TABLE IF EXISTS categories;
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id serial PRIMARY KEY NOT NULL,