Address #60 by adding two new schema formats

Still considering what #61 might need.
This commit is contained in:
Sean Corfield 2019-09-08 17:05:07 -07:00
parent da01eb843a
commit 7a110f15ce
2 changed files with 45 additions and 2 deletions

View file

@ -9,6 +9,10 @@ The following changes have been committed to the **master** branch since the 1.0
* Added test for using `any(?)` and arrays in PostgreSQL for `IN (?,,,?)` style queries. Added a **Tips & Tricks** section to **Friendly SQL Functions** with database-specific suggestions, that starts with this one.
* Improved documentation in several areas.
The following changes have been committed to the **issue-60** branch since the 1.0.6 release:
* Address #60 by allowing for additional schema entry formats: `:table/column` is equivalent to the old `[:table :column :one]` and `[:table/column]` is equivalent to the old `[:table :column :many]`. I'm still evaluating what might be needed for #61 before settling on a suitable format for schema extensions.
## Stable Builds
* 2019-08-24 -- 1.0.6

View file

@ -620,6 +620,44 @@
(when table
[(keyword table) :id])))
(defn- expand-schema
"Given a (possibly nil) schema entry, return it expanded to a triple of:
[table fk cardinality]
Possibly schema entry input formats are:
* [table fk] => cardinality :one
* [table fk cardinality] -- no change
* :table/fk => [:table :fk :one]
* [:table/fk] => [:table :fk :many]"
[k entry]
(when entry
(if-let [mapping
(cond
(keyword? entry)
[(keyword (namespace entry)) (keyword (name entry)) :one]
(coll? entry)
(let [[table fk cardinality] entry]
(cond (and table fk cardinality)
entry
(and table fk)
[table fk :one]
(keyword? table)
[(keyword (namespace table)) (keyword (name table)) :many])))]
mapping
(throw (ex-info (str "Invalid schema entry for: " (name k)) {:entry entry})))))
(comment
(expand-schema :user/statusid nil)
(expand-schema :user/statusid :status/id)
(expand-schema :user/statusid [:status :id])
(expand-schema :user/email [:deliverability :email :many])
(expand-schema :user/email [:deliverability/email]))
(defn- navize-row
"Given a connectable object, return a function that knows how to turn a row
into a `nav`igable object.
@ -642,8 +680,9 @@
(with-meta row
{`core-p/nav (fn [coll k v]
(try
(let [[table fk cardinality] (or (get-in opts [:schema k])
(default-schema k))]
(let [[table fk cardinality]
(expand-schema k (or (get-in opts [:schema k])
(default-schema k)))]
(if fk
(let [entity-fn (:table-fn opts identity)
exec-fn! (if (= :many cardinality)