2019-01-08 04:38:58 +00:00
( ns next.jdbc-test
2019-01-08 07:03:20 +00:00
( :require [ clojure.test :refer [ deftest is testing ] ]
2019-04-01 00:29:40 +00:00
[ next.jdbc :refer :all ] ) )
2019-01-08 04:38:58 +00:00
( deftest a-test
( testing "FIXME, I fail."
( is ( = 0 1 ) ) ) )
2019-04-01 00:29:40 +00:00
( comment
( def db-spec { :dbtype "h2:mem" :dbname "perf" } )
( def db-spec { :dbtype "derby" :dbname "perf" :create true } )
( def db-spec { :dbtype "mysql" :dbname "worldsingles" :user "root" :password "visual" } )
( def con db-spec )
( def con ( get-datasource db-spec ) )
( get-connection con { } )
( def con ( get-connection ( get-datasource db-spec ) { } ) )
( def con ( get-connection db-spec { } ) )
( execute! con [ "DROP TABLE fruit" ] )
;; h2
( execute! con [ "CREATE TABLE fruit (id int default 0, name varchar(32) primary key, appearance varchar(32), cost int, grade real)" ] )
( execute! con [ "INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)" ] )
;; mysql
( execute! con [ "CREATE TABLE fruit (id int auto_increment, name varchar(32), appearance varchar(32), cost int, grade real, primary key (id))" ] )
( execute! con [ "INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)" ]
{ :return-keys true } )
( .close con )
( require ' [ criterium.core :refer [ bench quick-bench ] ] )
;; calibrate
( quick-bench ( reduce + ( take 10 e6 ( range ) ) ) )
;; raw java
( defn select* [ ^ java.sql.Connection con ]
( let [ ps ( doto ( .prepareStatement con "SELECT * FROM fruit WHERE appearance = ?" )
( .setObject 1 "red" ) )
rs ( .executeQuery ps )
_ ( .next rs )
value ( .getObject rs "name" ) ]
( .close ps )
value ) )
( quick-bench ( select* con ) )
;; almost same as the Java example above
( quick-bench
( reduce ( fn [ rs m ] ( reduced ( :name m ) ) )
nil
( reducible! con [ "select * from fruit where appearance = ?" "red" ] ) ) )
( quick-bench
( execute-one! con
[ "select * from fruit where appearance = ?" "red" ]
{ :row-fn :name } ) )
;; simple query
( quick-bench
( execute! con [ "select * from fruit where appearance = ?" "red" ] ) )
( execute! con [ "select * from fruit" ] )
( into [ ] ( map ( partial into { } ) ) ( reducible! con [ "select * from fruit" ] ) )
;; with a prepopulated prepared statement
( with-open [ ps ( prepare con [ "select * from fruit where appearance = ?" "red" ] { } ) ]
( quick-bench
[ ( reduce ( fn [ _ row ] ( reduced ( :name row ) ) )
nil
( reducible! ps ) ) ] ) )
;; same as above but setting parameters inside the benchmark
( with-open [ ps ( prepare con [ "select * from fruit where appearance = ?" ] { } ) ]
( quick-bench
[ ( reduce ( fn [ _ row ] ( reduced ( :name row ) ) )
nil
( reducible! ( prepare/set-parameters ps [ "red" ] ) ) ) ] ) )
;; this takes more than twice the time of the one above which seems strange
( with-open [ ps ( prepare con [ "select * from fruit where appearance = ?" ] { } ) ]
( quick-bench
[ ( reduce ( fn [ _ row ] ( reduced ( :name row ) ) )
nil
( reducible! ( prepare/set-parameters ps [ "red" ] ) ) )
( reduce ( fn [ _ row ] ( reduced ( :name row ) ) )
nil
( reducible! ( prepare/set-parameters ps [ "fuzzy" ] ) ) ) ] ) )
;; full first row
( quick-bench
( execute-one! con [ "select * from fruit where appearance = ?" "red" ] ) )
;; test assoc works
( execute-one! con
[ "select * from fruit where appearance = ?" "red" ]
{ :row-fn # ( assoc % :test :value ) } )
;; test assoc works
( execute! con
[ "select * from fruit where appearance = ?" "red" ]
{ :row-fn # ( assoc % :test :value ) } )
( with-transaction [ t con { :rollback-only? true } ]
( execute! t [ "INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (5,'Pear','green',49,47)" ] )
( execute! t [ "select * from fruit where name = ?" "Pear" ] ) )
( execute! con [ "select * from fruit where name = ?" "Pear" ] )
( execute! con [ "select * from membership" ] ) )