Skip to content

Commit 1a51363

Browse files
IamDrowsytonsky
authored andcommitted
change implementation to extend type Entity instead of providing new pull/pull-many
1 parent 5a17482 commit 1a51363

2 files changed

Lines changed: 25 additions & 56 deletions

File tree

src/datascript/datafy.cljc

Lines changed: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,42 @@
11
(ns datascript.datafy
22
(:require [clojure.core.protocols :as cp]
33
[datascript.pull-api :as dp]
4-
[clojure.string :as str]))
4+
[datascript.db :as db]
5+
[datascript.impl.entity :as e]))
56

6-
(declare datafy-entity)
77
(declare datafy-entity-seq)
88

9-
(defn- attr<->rattr [attr]
10-
(keyword (namespace attr)
11-
(if (str/starts-with? (name attr) "_")
12-
(subs (name attr) 1)
13-
(str "_" (name attr)))))
14-
159
(defn- pull-pattern [ref-rattrs]
1610
(into ["*"] ref-rattrs))
1711

18-
19-
(defn- navize-entity [db-val entity]
12+
(defn- navize-pulled-entity [db-val pulled-entity]
2013
(let [ref-attrs (:db.type/ref (:rschema db-val))
21-
ref-rattrs (set (map attr<->rattr ref-attrs))
22-
many-attrs (:db.cardinality/many (:rschema db-val))
23-
pull-pattern (into ["*"] ref-rattrs)]
24-
(with-meta entity
14+
ref-rattrs (set (map db/reverse-ref ref-attrs))
15+
many-attrs (:db.cardinality/many (:rschema db-val))]
16+
(with-meta pulled-entity
2517
{`cp/nav (fn [coll k v]
2618
(cond
2719
(or (and (many-attrs k) (ref-attrs k))
2820
(ref-rattrs k))
29-
(datafy-entity-seq db-val
30-
(dp/pull-many db-val pull-pattern (mapv :db/id v)))
21+
(datafy-entity-seq db-val v)
3122
(ref-attrs k)
32-
(datafy-entity db-val (dp/pull db-val pull-pattern (:db/id v)))
23+
(e/entity db-val (:db/id v))
3324
:else v))})))
3425

35-
(defn- navize-entity-seq [db-val entities]
26+
(defn- navize-pulled-entity-seq [db-val entities]
3627
(with-meta entities
3728
{`cp/nav (fn [coll k v]
38-
(datafy-entity db-val v))}))
39-
40-
(defn- datafy-entity [db-val entity]
41-
(with-meta entity
42-
{`cp/datafy (fn [entity]
43-
(navize-entity db-val entity))}))
29+
(e/entity db-val (:db/id v)))}))
4430

4531
(defn- datafy-entity-seq [db-val entities]
4632
(with-meta entities
47-
{`cp/datafy (fn [entities] (navize-entity-seq db-val entities))}))
48-
49-
(defn pull
50-
"Same as `datascript.core/pull` but the returned map implements `datafy/nav` (See [https://clojure.github.io/clojure/clojure.datafy-api.html](https://clojure.github.io/clojure/clojure.datafy-api.html).
51-
52-
This can be used to navigate through the database following ref fields.
53-
54-
Usage:
55-
```
56-
(pull db [:ref, :name] 1)
57-
; => {:db/id 1,
58-
; :name \"Child\",
59-
; :ref {:db/id 2}}
60-
(nav (datafy (pull db [:ref, :name] 1))
61-
:ref
62-
{:db/id 2})
63-
; => {:db/id 2,
64-
; :name \"Parent\",
65-
; :_ref {:db/id 1}}
66-
```
67-
"
68-
[db selector eid]
69-
(datafy-entity db (dp/pull db selector eid)))
70-
71-
(defn pull-many
72-
"Same as [[pull]] but accepts sequence of ids and returns sequence of maps that implements `datafy/nav`."
73-
[db selector eids]
74-
(datafy-entity-seq db (dp/pull-many db selector eids)))
33+
{`cp/datafy (fn [entities] (navize-pulled-entity-seq db-val entities))}))
34+
35+
(extend-protocol cp/Datafiable
36+
datascript.impl.entity.Entity
37+
(datafy [this]
38+
(let [db (.-db this)
39+
ref-attrs (:db.type/ref (:rschema db))
40+
ref-rattrs (set (map db/reverse-ref ref-attrs))
41+
pull-pattern (into ["*"] ref-rattrs)]
42+
(navize-pulled-entity db (dp/pull db pull-pattern (:db/id this))))))

test/datascript/test/datafy.cljc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
(ns datascript.test.datafy
22
(:require
3-
#?(:cljs [cljs.test :as t :refer-macros [is are deftest testing]]
4-
:clj [clojure.test :as t :refer [is are deftest testing]])
3+
#?(:cljs [cljs.test :as t :refer-macros [is are deftest testing]]
4+
:clj [clojure.test :as t :refer [is are deftest testing]])
55
[datascript.datafy :as datafy]
66
[datascript.core :as d]
7-
[clojure.core.protocols :as cp]))
7+
[clojure.core.protocols :as cp]
8+
[datascript.impl.entity :as e]))
89

910
(defn- test-db []
1011
(let [schema {:ref {:db/valueType :db.type/ref}
@@ -31,7 +32,7 @@
3132

3233
(deftest test-navigation
3334
(let [db (test-db)
34-
entity (datafy/pull db [:ref :namespace/ref :many/_ref] 3)]
35+
entity (e/entity db 3)]
3536
(is (= 2 (:db/id (d+n entity [:ref]))))
3637
(is (= 2 (:db/id (d+n entity [:namespace/ref]))))
3738
(is (= 1 (:db/id (d+n entity [:ref :namespace/ref]))))

0 commit comments

Comments
 (0)