XTDB 0 failures!
Signed-off-by: Sean Corfield <sean@corfield.org>
This commit is contained in:
parent
564c43bc79
commit
05cfe1f3fa
7 changed files with 112 additions and 98 deletions
|
|
@ -275,6 +275,10 @@
|
||||||
:qualifier-fn ->kebab-case
|
:qualifier-fn ->kebab-case
|
||||||
:label-fn ->kebab-case)))
|
:label-fn ->kebab-case)))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(->kebab-case "_id") ;;=> "id"!!
|
||||||
|
)
|
||||||
|
|
||||||
(defn as-unqualified-kebab-maps
|
(defn as-unqualified-kebab-maps
|
||||||
"Given a `ResultSet` and options, return a `RowBuilder` / `ResultSetBuilder`
|
"Given a `ResultSet` and options, return a `RowBuilder` / `ResultSetBuilder`
|
||||||
that produces bare vectors of hash map rows, with simple, kebab-case keys."
|
that produces bare vectors of hash map rows, with simple, kebab-case keys."
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,10 @@
|
||||||
[clojure.test :refer [deftest is testing use-fixtures]]
|
[clojure.test :refer [deftest is testing use-fixtures]]
|
||||||
[next.jdbc.optional :as opt]
|
[next.jdbc.optional :as opt]
|
||||||
[next.jdbc.protocols :as p]
|
[next.jdbc.protocols :as p]
|
||||||
[next.jdbc.test-fixtures :refer [with-test-db ds column
|
[next.jdbc.test-fixtures :refer [col-kw column default-options ds index
|
||||||
default-options]])
|
with-test-db]])
|
||||||
(:import (java.sql ResultSet ResultSetMetaData)))
|
(:import
|
||||||
|
(java.sql ResultSet ResultSetMetaData)))
|
||||||
|
|
||||||
(set! *warn-on-reflection* true)
|
(set! *warn-on-reflection* true)
|
||||||
|
|
||||||
|
|
@ -17,7 +18,7 @@
|
||||||
(deftest test-map-row-builder
|
(deftest test-map-row-builder
|
||||||
(testing "default row builder"
|
(testing "default row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 1]
|
[(str "select * from fruit where " (index) " = ?") 1]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn opt/as-maps))]
|
:builder-fn opt/as-maps))]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
|
|
@ -26,7 +27,7 @@
|
||||||
(is (= "Apple" ((column :FRUIT/NAME) row)))))
|
(is (= "Apple" ((column :FRUIT/NAME) row)))))
|
||||||
(testing "unqualified row builder"
|
(testing "unqualified row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 2]
|
[(str "select * from fruit where " (index) " = ?") 2]
|
||||||
{:builder-fn opt/as-unqualified-maps})]
|
{:builder-fn opt/as-unqualified-maps})]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (not (contains? row (column :COST))))
|
(is (not (contains? row (column :COST))))
|
||||||
|
|
@ -34,23 +35,23 @@
|
||||||
(is (= "Banana" ((column :NAME) row)))))
|
(is (= "Banana" ((column :NAME) row)))))
|
||||||
(testing "lower-case row builder"
|
(testing "lower-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 3]
|
[(str "select * from fruit where " (index) " = ?") 3]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn opt/as-lower-maps))]
|
:builder-fn opt/as-lower-maps))]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (not (contains? row :fruit/appearance)))
|
(is (not (contains? row (col-kw :fruit/appearance))))
|
||||||
(is (= 3 (:fruit/id row)))
|
(is (= 3 ((col-kw :fruit/id) row)))
|
||||||
(is (= "Peach" (:fruit/name row)))))
|
(is (= "Peach" ((col-kw :fruit/name) row)))))
|
||||||
(testing "unqualified lower-case row builder"
|
(testing "unqualified lower-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 4]
|
[(str "select * from fruit where " (index) " = ?") 4]
|
||||||
{:builder-fn opt/as-unqualified-lower-maps})]
|
{:builder-fn opt/as-unqualified-lower-maps})]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (= 4 (:id row)))
|
(is (= 4 ((col-kw :id) row)))
|
||||||
(is (= "Orange" (:name row)))))
|
(is (= "Orange" ((col-kw :name) row)))))
|
||||||
(testing "custom row builder"
|
(testing "custom row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 3]
|
[(str "select * from fruit where " (index) " = ?") 3]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn opt/as-modified-maps
|
:builder-fn opt/as-modified-maps
|
||||||
:label-fn str/lower-case
|
:label-fn str/lower-case
|
||||||
|
|
@ -67,7 +68,7 @@
|
||||||
(deftest test-map-row-adapter
|
(deftest test-map-row-adapter
|
||||||
(testing "default row builder"
|
(testing "default row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 1]
|
[(str "select * from fruit where " (index) " = ?") 1]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn (opt/as-maps-adapter
|
:builder-fn (opt/as-maps-adapter
|
||||||
opt/as-maps
|
opt/as-maps
|
||||||
|
|
@ -78,7 +79,7 @@
|
||||||
(is (= "Apple" ((column :FRUIT/NAME) row)))))
|
(is (= "Apple" ((column :FRUIT/NAME) row)))))
|
||||||
(testing "unqualified row builder"
|
(testing "unqualified row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 2]
|
[(str "select * from fruit where " (index) " = ?") 2]
|
||||||
{:builder-fn (opt/as-maps-adapter
|
{:builder-fn (opt/as-maps-adapter
|
||||||
opt/as-unqualified-maps
|
opt/as-unqualified-maps
|
||||||
default-column-reader)})]
|
default-column-reader)})]
|
||||||
|
|
@ -88,27 +89,27 @@
|
||||||
(is (= "Banana" ((column :NAME) row)))))
|
(is (= "Banana" ((column :NAME) row)))))
|
||||||
(testing "lower-case row builder"
|
(testing "lower-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 3]
|
[(str "select * from fruit where " (index) " = ?") 3]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn (opt/as-maps-adapter
|
:builder-fn (opt/as-maps-adapter
|
||||||
opt/as-lower-maps
|
opt/as-lower-maps
|
||||||
default-column-reader)))]
|
default-column-reader)))]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (not (contains? row :fruit/appearance)))
|
(is (not (contains? row (col-kw :fruit/appearance))))
|
||||||
(is (= 3 (:fruit/id row)))
|
(is (= 3 ((col-kw :fruit/id) row)))
|
||||||
(is (= "Peach" (:fruit/name row)))))
|
(is (= "Peach" ((col-kw :fruit/name) row)))))
|
||||||
(testing "unqualified lower-case row builder"
|
(testing "unqualified lower-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 4]
|
[(str "select * from fruit where " (index) " = ?") 4]
|
||||||
{:builder-fn (opt/as-maps-adapter
|
{:builder-fn (opt/as-maps-adapter
|
||||||
opt/as-unqualified-lower-maps
|
opt/as-unqualified-lower-maps
|
||||||
default-column-reader)})]
|
default-column-reader)})]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (= 4 (:id row)))
|
(is (= 4 ((col-kw :id) row)))
|
||||||
(is (= "Orange" (:name row)))))
|
(is (= "Orange" ((col-kw :name) row)))))
|
||||||
(testing "custom row builder"
|
(testing "custom row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
["select * from fruit where id = ?" 3]
|
[(str "select * from fruit where " (index) " = ?") 3]
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn (opt/as-maps-adapter
|
:builder-fn (opt/as-maps-adapter
|
||||||
opt/as-modified-maps
|
opt/as-modified-maps
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
[next.jdbc.plan :as plan]
|
[next.jdbc.plan :as plan]
|
||||||
[next.jdbc.specs :as specs]
|
[next.jdbc.specs :as specs]
|
||||||
[next.jdbc.test-fixtures
|
[next.jdbc.test-fixtures
|
||||||
:refer [with-test-db ds]]
|
:refer [with-test-db ds col-kw index]]
|
||||||
[clojure.string :as str]))
|
[clojure.string :as str]))
|
||||||
|
|
||||||
(set! *warn-on-reflection* true)
|
(set! *warn-on-reflection* true)
|
||||||
|
|
@ -17,56 +17,56 @@
|
||||||
(specs/instrument)
|
(specs/instrument)
|
||||||
|
|
||||||
(deftest select-one!-tests
|
(deftest select-one!-tests
|
||||||
(is (= {:id 1}
|
(is (= {(col-kw :id) 1}
|
||||||
(plan/select-one! (ds) [:id] ["select * from fruit order by id"])))
|
(plan/select-one! (ds) [(col-kw :id)] [(str "select * from fruit order by " (index))])))
|
||||||
(is (= 1
|
(is (= 1
|
||||||
(plan/select-one! (ds) :id ["select * from fruit order by id"])))
|
(plan/select-one! (ds) (col-kw :id) [(str "select * from fruit order by " (index))])))
|
||||||
(is (= "Banana"
|
(is (= "Banana"
|
||||||
(plan/select-one! (ds) :name ["select * from fruit where id = ?" 2])))
|
(plan/select-one! (ds) :name [(str "select * from fruit where " (index) " = ?") 2])))
|
||||||
(is (= [1 "Apple"]
|
(is (= [1 "Apple"]
|
||||||
(plan/select-one! (ds) (juxt :id :name)
|
(plan/select-one! (ds) (juxt (col-kw :id) :name)
|
||||||
["select * from fruit order by id"])))
|
[(str "select * from fruit order by " (index))])))
|
||||||
(is (= {:id 1 :name "Apple"}
|
(is (= {(col-kw :id) 1 :name "Apple"}
|
||||||
(plan/select-one! (ds) #(select-keys % [:id :name])
|
(plan/select-one! (ds) #(select-keys % [(col-kw :id) :name])
|
||||||
["select * from fruit order by id"]))))
|
[(str "select * from fruit order by " (index))]))))
|
||||||
|
|
||||||
(deftest select-vector-tests
|
(deftest select-vector-tests
|
||||||
(is (= [{:id 1} {:id 2} {:id 3} {:id 4}]
|
(is (= [{(col-kw :id) 1} {(col-kw :id) 2} {(col-kw :id) 3} {(col-kw :id) 4}]
|
||||||
(plan/select! (ds) [:id] ["select * from fruit order by id"])))
|
(plan/select! (ds) [(col-kw :id)] [(str "select * from fruit order by " (index))])))
|
||||||
(is (= [1 2 3 4]
|
(is (= [1 2 3 4]
|
||||||
(plan/select! (ds) :id ["select * from fruit order by id"])))
|
(plan/select! (ds) (col-kw :id) [(str "select * from fruit order by " (index))])))
|
||||||
(is (= ["Banana"]
|
(is (= ["Banana"]
|
||||||
(plan/select! (ds) :name ["select * from fruit where id = ?" 2])))
|
(plan/select! (ds) :name [(str "select * from fruit where " (index) " = ?") 2])))
|
||||||
(is (= [[2 "Banana"]]
|
(is (= [[2 "Banana"]]
|
||||||
(plan/select! (ds) (juxt :id :name)
|
(plan/select! (ds) (juxt (col-kw :id) :name)
|
||||||
["select * from fruit where id = ?" 2])))
|
[(str "select * from fruit where " (index) " = ?") 2])))
|
||||||
(is (= [{:id 2 :name "Banana"}]
|
(is (= [{(col-kw :id) 2 :name "Banana"}]
|
||||||
(plan/select! (ds) [:id :name]
|
(plan/select! (ds) [(col-kw :id) :name]
|
||||||
["select * from fruit where id = ?" 2]))))
|
[(str "select * from fruit where " (index) " = ?") 2]))))
|
||||||
|
|
||||||
(deftest select-set-tests
|
(deftest select-set-tests
|
||||||
(is (= #{{:id 1} {:id 2} {:id 3} {:id 4}}
|
(is (= #{{(col-kw :id) 1} {(col-kw :id) 2} {(col-kw :id) 3} {(col-kw :id) 4}}
|
||||||
(plan/select! (ds) [:id] ["select * from fruit order by id"]
|
(plan/select! (ds) [(col-kw :id)] [(str "select * from fruit order by " (index))]
|
||||||
{:into #{}})))
|
{:into #{}})))
|
||||||
(is (= #{1 2 3 4}
|
(is (= #{1 2 3 4}
|
||||||
(plan/select! (ds) :id ["select * from fruit order by id"]
|
(plan/select! (ds) (col-kw :id) [(str "select * from fruit order by " (index))]
|
||||||
{:into #{}}))))
|
{:into #{}}))))
|
||||||
|
|
||||||
(deftest select-map-tests
|
(deftest select-map-tests
|
||||||
(is (= {1 "Apple", 2 "Banana", 3 "Peach", 4 "Orange"}
|
(is (= {1 "Apple", 2 "Banana", 3 "Peach", 4 "Orange"}
|
||||||
(plan/select! (ds) (juxt :id :name) ["select * from fruit order by id"]
|
(plan/select! (ds) (juxt (col-kw :id) :name) [(str "select * from fruit order by " (index))]
|
||||||
{:into {}}))))
|
{:into {}}))))
|
||||||
|
|
||||||
(deftest select-issue-227
|
(deftest select-issue-227
|
||||||
(is (= ["Apple"]
|
(is (= ["Apple"]
|
||||||
(plan/select! (ds) :name ["select * from fruit where id = ?" 1]
|
(plan/select! (ds) :name [(str "select * from fruit where " (index) " = ?") 1]
|
||||||
{:column-fn #(str/replace % "-" "_")})))
|
{:column-fn #(str/replace % "-" "_")})))
|
||||||
(is (= ["Apple"]
|
(is (= ["Apple"]
|
||||||
(plan/select! (ds) :foo/name ["select * from fruit where id = ?" 1]
|
(plan/select! (ds) :foo/name [(str "select * from fruit where " (index) " = ?") 1]
|
||||||
{:column-fn #(str/replace % "-" "_")})))
|
{:column-fn #(str/replace % "-" "_")})))
|
||||||
(is (= ["Apple"]
|
(is (= ["Apple"]
|
||||||
(plan/select! (ds) #(get % "name") ["select * from fruit where id = ?" 1]
|
(plan/select! (ds) #(get % "name") [(str "select * from fruit where " (index) " = ?") 1]
|
||||||
{:column-fn #(str/replace % "-" "_")})))
|
{:column-fn #(str/replace % "-" "_")})))
|
||||||
(is (= [["Apple"]]
|
(is (= [["Apple"]]
|
||||||
(plan/select! (ds) (juxt :name) ["select * from fruit where id = ?" 1]
|
(plan/select! (ds) (juxt :name) [(str "select * from fruit where " (index) " = ?") 1]
|
||||||
{:column-fn #(str/replace % "-" "_")}))))
|
{:column-fn #(str/replace % "-" "_")}))))
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,9 @@
|
||||||
(testing "default schema"
|
(testing "default schema"
|
||||||
(let [connectable (ds)
|
(let [connectable (ds)
|
||||||
test-row (rs/datafiable-row {:TABLE/FRUIT_ID 1} connectable
|
test-row (rs/datafiable-row {:TABLE/FRUIT_ID 1} connectable
|
||||||
(default-options))
|
(cond-> (default-options)
|
||||||
|
(xtdb?)
|
||||||
|
(assoc :schema-opts {:pk "_id"})))
|
||||||
data (d/datafy test-row)
|
data (d/datafy test-row)
|
||||||
v (get data :TABLE/FRUIT_ID)]
|
v (get data :TABLE/FRUIT_ID)]
|
||||||
;; check datafication is sane
|
;; check datafication is sane
|
||||||
|
|
@ -40,7 +42,10 @@
|
||||||
(let [connectable (ds)
|
(let [connectable (ds)
|
||||||
test-row (rs/datafiable-row {:foo/bar 2} connectable
|
test-row (rs/datafiable-row {:foo/bar 2} connectable
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:schema {:foo/bar :fruit/id}))
|
:schema {:foo/bar
|
||||||
|
(if (xtdb?)
|
||||||
|
:fruit/_id
|
||||||
|
:fruit/id)}))
|
||||||
data (d/datafy test-row)
|
data (d/datafy test-row)
|
||||||
v (get data :foo/bar)]
|
v (get data :foo/bar)]
|
||||||
;; check datafication is sane
|
;; check datafication is sane
|
||||||
|
|
@ -53,7 +58,10 @@
|
||||||
(let [connectable (ds)
|
(let [connectable (ds)
|
||||||
test-row (rs/datafiable-row {:foo/bar 3} connectable
|
test-row (rs/datafiable-row {:foo/bar 3} connectable
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:schema {:foo/bar [:fruit/id]}))
|
:schema {:foo/bar
|
||||||
|
[(if (xtdb?)
|
||||||
|
:fruit/_id
|
||||||
|
:fruit/id)]}))
|
||||||
data (d/datafy test-row)
|
data (d/datafy test-row)
|
||||||
v (get data :foo/bar)]
|
v (get data :foo/bar)]
|
||||||
;; check datafication is sane
|
;; check datafication is sane
|
||||||
|
|
@ -67,7 +75,7 @@
|
||||||
(let [connectable (ds)
|
(let [connectable (ds)
|
||||||
test-row (rs/datafiable-row {:foo/bar 2} connectable
|
test-row (rs/datafiable-row {:foo/bar 2} connectable
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:schema {:foo/bar [:fruit :id]}))
|
:schema {:foo/bar [:fruit (col-kw :id)]}))
|
||||||
data (d/datafy test-row)
|
data (d/datafy test-row)
|
||||||
v (get data :foo/bar)]
|
v (get data :foo/bar)]
|
||||||
;; check datafication is sane
|
;; check datafication is sane
|
||||||
|
|
@ -79,7 +87,7 @@
|
||||||
(let [connectable (ds)
|
(let [connectable (ds)
|
||||||
test-row (rs/datafiable-row {:foo/bar 3} connectable
|
test-row (rs/datafiable-row {:foo/bar 3} connectable
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:schema {:foo/bar [:fruit :id :many]}))
|
:schema {:foo/bar [:fruit (col-kw :id) :many]}))
|
||||||
data (d/datafy test-row)
|
data (d/datafy test-row)
|
||||||
v (get data :foo/bar)]
|
v (get data :foo/bar)]
|
||||||
;; check datafication is sane
|
;; check datafication is sane
|
||||||
|
|
@ -123,17 +131,17 @@
|
||||||
(assoc (default-options)
|
(assoc (default-options)
|
||||||
:builder-fn rs/as-lower-maps))]
|
:builder-fn rs/as-lower-maps))]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (contains? row :fruit/appearance))
|
(is (contains? row (col-kw :fruit/appearance)))
|
||||||
(is (nil? (:fruit/appearance row)))
|
(is (nil? ((col-kw :fruit/appearance) row)))
|
||||||
(is (= 3 (:fruit/id row)))
|
(is (= 3 ((col-kw :fruit/id) row)))
|
||||||
(is (= "Peach" (:fruit/name row)))))
|
(is (= "Peach" ((col-kw :fruit/name) row)))))
|
||||||
(testing "unqualified lower-case row builder"
|
(testing "unqualified lower-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
[(str "select * from fruit where " (index) " = ?") 4]
|
[(str "select * from fruit where " (index) " = ?") 4]
|
||||||
{:builder-fn rs/as-unqualified-lower-maps})]
|
{:builder-fn rs/as-unqualified-lower-maps})]
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (= 4 (:id row)))
|
(is (= 4 ((col-kw :id) row)))
|
||||||
(is (= "Orange" (:name row)))))
|
(is (= "Orange" ((col-kw :name) row)))))
|
||||||
(testing "kebab-case row builder"
|
(testing "kebab-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
[(str "select " (index) ",name,appearance as looks_like from fruit where " (index) " = ?") 3]
|
[(str "select " (index) ",name,appearance as looks_like from fruit where " (index) " = ?") 3]
|
||||||
|
|
@ -142,7 +150,8 @@
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (contains? row (col-kw :fruit/looks-like)))
|
(is (contains? row (col-kw :fruit/looks-like)))
|
||||||
(is (nil? ((col-kw :fruit/looks-like) row)))
|
(is (nil? ((col-kw :fruit/looks-like) row)))
|
||||||
(is (= 3 ((col-kw :fruit/id) row)))
|
;; kebab-case strips leading _ from _id (XTDB):
|
||||||
|
(is (= 3 ((if (xtdb?) :id :fruit/id) row)))
|
||||||
(is (= "Peach" ((col-kw :fruit/name) row)))))
|
(is (= "Peach" ((col-kw :fruit/name) row)))))
|
||||||
(testing "unqualified kebab-case row builder"
|
(testing "unqualified kebab-case row builder"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
|
|
@ -151,7 +160,7 @@
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (contains? row :looks-like))
|
(is (contains? row :looks-like))
|
||||||
(is (= "juicy" (:looks-like row)))
|
(is (= "juicy" (:looks-like row)))
|
||||||
(is (= 4 ((col-kw :id) row)))
|
(is (= 4 (:id row)))
|
||||||
(is (= "Orange" (:name row)))))
|
(is (= "Orange" (:name row)))))
|
||||||
(testing "custom row builder 1"
|
(testing "custom row builder 1"
|
||||||
(let [row (p/-execute-one (ds)
|
(let [row (p/-execute-one (ds)
|
||||||
|
|
@ -176,7 +185,7 @@
|
||||||
(is (map? row))
|
(is (map? row))
|
||||||
(is (contains? row :vegetable/appearance))
|
(is (contains? row :vegetable/appearance))
|
||||||
(is (nil? (:vegetable/appearance row)))
|
(is (nil? (:vegetable/appearance row)))
|
||||||
(is (= 3 (:vegetable/id row)))
|
(is (= 3 ((if (xtdb?) :vegetable/_id :vegetable/id) row)))
|
||||||
(is (= 103 (:vegetable/newid row))) ; constant qualifier here
|
(is (= 103 (:vegetable/newid row))) ; constant qualifier here
|
||||||
(is (= "Peach" (:vegetable/name row)))))
|
(is (= "Peach" (:vegetable/name row)))))
|
||||||
(testing "adapted row builder"
|
(testing "adapted row builder"
|
||||||
|
|
@ -310,15 +319,15 @@
|
||||||
#(find % :name))) ; get MapEntry works
|
#(find % :name))) ; get MapEntry works
|
||||||
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 2]
|
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 2]
|
||||||
{:builder-fn (constantly nil)}))))
|
{:builder-fn (constantly nil)}))))
|
||||||
(is (= [{:id 3 :name "Peach"}]
|
(is (= [{(col-kw :id) 3 :name "Peach"}]
|
||||||
(into [] (map #(select-keys % [:id :name])) ; select-keys works
|
(into [] (map #(select-keys % [(col-kw :id) :name])) ; select-keys works
|
||||||
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 3]
|
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 3]
|
||||||
{:builder-fn (constantly nil)}))))
|
{:builder-fn (constantly nil)}))))
|
||||||
(is (= [[:orange 4]]
|
(is (= [[:orange 4]]
|
||||||
(into [] (map #(vector (if (contains? % :name) ; contains works
|
(into [] (map #(vector (if (contains? % :name) ; contains works
|
||||||
(keyword (str/lower-case (:name %)))
|
(keyword (str/lower-case (:name %)))
|
||||||
:unnamed)
|
:unnamed)
|
||||||
(get % :id 0))) ; get with not-found works
|
(get % (col-kw :id) 0))) ; get with not-found works
|
||||||
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 4]
|
(p/-execute (ds) [(str "select * from fruit where " (index) " = ?") 4]
|
||||||
{:builder-fn (constantly nil)}))))
|
{:builder-fn (constantly nil)}))))
|
||||||
(is (= [{}]
|
(is (= [{}]
|
||||||
|
|
@ -434,7 +443,7 @@
|
||||||
(valAt [this k] (get this k nil))
|
(valAt [this k] (get this k nil))
|
||||||
(valAt [this k not-found]
|
(valAt [this k not-found]
|
||||||
(case k
|
(case k
|
||||||
:cols [:id :name :appearance :cost :grade]
|
:cols [(col-kw :id) :name :appearance :cost :grade]
|
||||||
:rsmeta rsmeta
|
:rsmeta rsmeta
|
||||||
not-found))))
|
not-found))))
|
||||||
|
|
||||||
|
|
@ -497,10 +506,10 @@ CREATE TABLE CLOBBER (
|
||||||
(testing "get n on bare abstraction over arrays"
|
(testing "get n on bare abstraction over arrays"
|
||||||
(is (= [1 2 3]
|
(is (= [1 2 3]
|
||||||
(into [] (map #(get % 0))
|
(into [] (map #(get % 0))
|
||||||
(p/-execute (ds) [(str "select " (index) " from fruit where " (index) " < ?") 4]
|
(p/-execute (ds) [(str "select " (index) " from fruit where " (index) " < ? order by " (index)) 4]
|
||||||
{:builder-fn rs/as-arrays})))))
|
{:builder-fn rs/as-arrays})))))
|
||||||
(testing "nth on bare abstraction over arrays"
|
(testing "nth on bare abstraction over arrays"
|
||||||
(is (= [1 2 3]
|
(is (= [1 2 3]
|
||||||
(into [] (map #(nth % 0))
|
(into [] (map #(nth % 0))
|
||||||
(p/-execute (ds) [(str "select " (index) " from fruit where " (index) " < ?") 4]
|
(p/-execute (ds) [(str "select " (index) " from fruit where " (index) " < ? order by " (index)) 4]
|
||||||
{:builder-fn rs/as-arrays}))))))
|
{:builder-fn rs/as-arrays}))))))
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
(deftest test-query
|
(deftest test-query
|
||||||
(let [ds-opts (jdbc/with-options (ds) (default-options))
|
(let [ds-opts (jdbc/with-options (ds) (default-options))
|
||||||
rs (sql/query ds-opts ["select * from fruit order by id"])]
|
rs (sql/query ds-opts [(str "select * from fruit order by " (index))])]
|
||||||
(is (= 4 (count rs)))
|
(is (= 4 (count rs)))
|
||||||
(is (every? map? rs))
|
(is (every? map? rs))
|
||||||
(is (every? meta rs))
|
(is (every? meta rs))
|
||||||
|
|
@ -35,10 +35,10 @@
|
||||||
(if (or (mysql?) (sqlite?))
|
(if (or (mysql?) (sqlite?))
|
||||||
{:limit 2 :offset 1}
|
{:limit 2 :offset 1}
|
||||||
{:offset 1 :fetch 2})
|
{:offset 1 :fetch 2})
|
||||||
:columns [:ID
|
:columns [(col-kw :ID)
|
||||||
["CASE WHEN grade > 91 THEN 'ok ' ELSE 'bad' END"
|
["CASE WHEN grade > 91 THEN 'ok ' ELSE 'bad' END"
|
||||||
:QUALITY]]
|
:QUALITY]]
|
||||||
:order-by [:id]))]
|
:order-by [(col-kw :id)]))]
|
||||||
(is (= 2 (count rs)))
|
(is (= 2 (count rs)))
|
||||||
(is (every? map? rs))
|
(is (every? map? rs))
|
||||||
(is (every? meta rs))
|
(is (every? meta rs))
|
||||||
|
|
@ -68,10 +68,11 @@
|
||||||
(is (= 1 count-v)))
|
(is (= 1 count-v)))
|
||||||
(let [count-v (sql/aggregate-by-keys ds-opts :fruit "count(*)" :all)]
|
(let [count-v (sql/aggregate-by-keys ds-opts :fruit "count(*)" :all)]
|
||||||
(is (= 4 count-v)))
|
(is (= 4 count-v)))
|
||||||
(let [max-id (sql/aggregate-by-keys ds-opts :fruit "max(id)" :all)]
|
(let [max-id (sql/aggregate-by-keys ds-opts :fruit (str "max(" (index) ")") :all)]
|
||||||
(is (= 4 max-id)))
|
(is (= 4 max-id)))
|
||||||
|
(when-not (xtdb?) ; XTDB does not support min/max on strings?
|
||||||
(let [min-name (sql/aggregate-by-keys ds-opts :fruit "min(name)" :all)]
|
(let [min-name (sql/aggregate-by-keys ds-opts :fruit "min(name)" :all)]
|
||||||
(is (= "Apple" min-name)))
|
(is (= "Apple" min-name))))
|
||||||
(is (thrown? IllegalArgumentException
|
(is (thrown? IllegalArgumentException
|
||||||
(sql/aggregate-by-keys ds-opts :fruit "count(*)" :all {:columns []})))))
|
(sql/aggregate-by-keys ds-opts :fruit "count(*)" :all {:columns []})))))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@
|
||||||
(defn col-kw [k]
|
(defn col-kw [k]
|
||||||
(if (xtdb?)
|
(if (xtdb?)
|
||||||
(let [n (name k)]
|
(let [n (name k)]
|
||||||
(if (= "id" n) :_id (keyword n)))
|
(if (= "id" (str/lower-case n)) :_id (keyword n)))
|
||||||
k))
|
k))
|
||||||
|
|
||||||
(defn default-options []
|
(defn default-options []
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,7 @@
|
||||||
(is (every? int? (map first (rest rs))))
|
(is (every? int? (map first (rest rs))))
|
||||||
(let [n (max (.indexOf ^java.util.List (first rs) :name) 1)]
|
(let [n (max (.indexOf ^java.util.List (first rs) :name) 1)]
|
||||||
(is (every? string? (map #(nth % n) (rest rs)))))))
|
(is (every? string? (map #(nth % n) (rest rs)))))))
|
||||||
|
(when-not (xtdb?) ; XTDB does not support this yet
|
||||||
(testing "execute! with :max-rows / :maxRows"
|
(testing "execute! with :max-rows / :maxRows"
|
||||||
(let [rs (jdbc/execute!
|
(let [rs (jdbc/execute!
|
||||||
ds-opts
|
ds-opts
|
||||||
|
|
@ -181,7 +182,7 @@
|
||||||
(is (every? meta rs))
|
(is (every? meta rs))
|
||||||
(is (= 2 (count rs)))
|
(is (= 2 (count rs)))
|
||||||
(is (= 1 ((column :FRUIT/ID) (first rs))))
|
(is (= 1 ((column :FRUIT/ID) (first rs))))
|
||||||
(is (= 2 ((column :FRUIT/ID) (last rs)))))))
|
(is (= 2 ((column :FRUIT/ID) (last rs))))))))
|
||||||
(testing "prepare"
|
(testing "prepare"
|
||||||
;; default options do not flow over get-connection
|
;; default options do not flow over get-connection
|
||||||
(let [rs (with-open [con (jdbc/get-connection (ds))
|
(let [rs (with-open [con (jdbc/get-connection (ds))
|
||||||
|
|
@ -211,7 +212,6 @@
|
||||||
(let [rs (with-open [con (jdbc/get-connection (ds))]
|
(let [rs (with-open [con (jdbc/get-connection (ds))]
|
||||||
(jdbc/execute! (prep/statement con (default-options))
|
(jdbc/execute! (prep/statement con (default-options))
|
||||||
[(str "select * from fruit order by " (index))]))]
|
[(str "select * from fruit order by " (index))]))]
|
||||||
(when (xtdb?) (println rs))
|
|
||||||
(is (every? map? rs))
|
(is (every? map? rs))
|
||||||
(is (every? meta rs))
|
(is (every? meta rs))
|
||||||
(is (= 4 (count rs)))
|
(is (= 4 (count rs)))
|
||||||
|
|
@ -221,7 +221,6 @@
|
||||||
(let [rs (with-open [con (jdbc/get-connection (ds))]
|
(let [rs (with-open [con (jdbc/get-connection (ds))]
|
||||||
(jdbc/execute! (prep/statement con (default-options))
|
(jdbc/execute! (prep/statement con (default-options))
|
||||||
[(str "select * from fruit where " (index) " = 4")]))]
|
[(str "select * from fruit where " (index) " = 4")]))]
|
||||||
(when (xtdb?) (println rs))
|
|
||||||
(is (every? map? rs))
|
(is (every? map? rs))
|
||||||
(is (every? meta rs))
|
(is (every? meta rs))
|
||||||
(is (= 1 (count rs)))
|
(is (= 1 (count rs)))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue