fix: get children classes' objects too for a parent class

refactor/add-page-type
Tienson Qin 2024-07-05 22:07:39 +08:00
parent f8894663cc
commit dc456c0c72
8 changed files with 39 additions and 48 deletions

View File

@ -374,7 +374,6 @@
[db property-id]
(:class/_schema.properties (d/entity db property-id)))
(defn get-alias-source-page
"return the source page (page-name) of an alias"
[db alias-id]
@ -540,3 +539,16 @@
(->> (d/datoms db :avet :block/type "property")
(map (fn [d]
(d/entity db (:e d))))))
(defn get-class-parents
[class]
(let [*classes (atom #{})]
(when-let [parent (:class/parent class)]
(loop [current-parent parent]
(when (and
current-parent
(contains? (:block/type parent) "class")
(not (contains? @*classes (:db/id parent))))
(swap! *classes conj (:db/id current-parent))
(recur (:class/parent current-parent)))))
@*classes))

View File

@ -336,18 +336,8 @@
(defn ^:api get-class-parents
[tags]
(let [tags' (filter (fn [tag] (contains? (:block/type tag) "class")) tags)
*classes (atom #{})]
(doseq [tag tags']
(when-let [parent (:class/parent tag)]
(loop [current-parent parent]
(when (and
current-parent
(contains? (:block/type parent) "class")
(not (contains? @*classes (:db/id parent))))
(swap! *classes conj (:db/id current-parent))
(recur (:class/parent current-parent))))))
@*classes))
(let [tags' (filter (fn [tag] (contains? (:block/type tag) "class")) tags)]
(set (mapcat ldb/get-class-parents tags'))))
(defn ^:api get-class-properties
[class]

View File

@ -14,7 +14,7 @@
(defn- get-all-objects
[class]
(->> (:block/_tags class)
(->> (db-model/get-class-objects (state/get-current-repo) (:db/id class))
(map (fn [row] (assoc row :id (:db/id row))))))
(defn- add-new-object!
@ -24,7 +24,7 @@
:properties {:block/tags (:db/id class)}
:edit-block? false})
set-data! (get-in table [:data-fns :set-data!])
_ (set-data! (get-all-objects (db/entity (:db/id class))))]
_ (set-data! (get-all-objects class))]
(editor-handler/edit-block! (db/entity [:block/uuid (:block/uuid block)]) 0 :unknown-container)))
(rum/defc objects-inner < rum/static
@ -34,8 +34,8 @@
columns (views/build-columns config properties)]
(rum/use-effect!
(fn []
(p/let [_result (db-async/<get-tag-objects (state/get-current-repo) (:db/id view-entity))]
(set-data! (get-all-objects (db/entity (:db/id view-entity))))))
(p/let [_result (db-async/<get-tag-objects (state/get-current-repo) (:db/id class))]
(set-data! (get-all-objects class))))
[object-ids])
(views/view view-entity {:data data
:set-data! set-data!
@ -46,7 +46,7 @@
[state class]
[:div.ml-2
(let [config {:container-id (:container-id state)}
object-ids (db-model/get-class-objects (state/get-current-repo) (:db/id class))
object-ids (map :db/id (db-model/get-class-objects (state/get-current-repo) (:db/id class)))
;; TODO: create the default table view for this class
view-entity class]
(objects-inner config class view-entity object-ids))])

View File

@ -338,8 +338,7 @@
(let [e (db/entity [:block/uuid id])]
(when-not (= :logseq.class/Root (:db/ident e))
e)))))
(->> (model/get-class-objects repo (:db/id class))
(keep db/entity))))
(model/get-class-objects repo (:db/id class))))
classes)
:else

View File

@ -244,12 +244,14 @@
(defn <get-tag-objects
[graph tag-id]
(<q graph {:transact-db? true}
'[:find [(pull ?b [*]) ...]
:in $ ?tag-id
:where
[?b :block/tags ?tag-id]]
tag-id))
(let [class-children (db-model/get-class-children graph tag-id)
class-ids (distinct (conj class-children tag-id))]
(<q graph {:transact-db? true}
'[:find [(pull ?b [*]) ...]
:in $ [?tag-id ...]
:where
[?b :block/tags ?tag-id]]
class-ids)))
(defn <get-tags
[graph]

View File

@ -781,28 +781,16 @@ independent of format as format specific heading characters are stripped"
(:class-parent rules/rules))
distinct))
;; FIXME: async query && use d/datoms instead of datalog
(defn get-class-objects
[repo class-id]
(when-let [class (db-utils/entity repo class-id)]
(-> (react/q repo [:frontend.worker.react/objects (:db/id class)]
{:query-fn (fn [_]
(when-let [class (db-utils/entity repo class-id)]
(if (first (:class/_parent class)) ; has children classes
(d/q
'[:find [?object ...]
:in $ % ?parent
:where
(class-parent ?parent ?c)
(or-join [?object ?c]
[?object :block/tags ?parent]
[?object :block/tags ?c])]
(conn/get-db repo)
(:class-parent rules/rules)
class-id)
(map :db/id (:block/_tags class)))))}
nil)
react)))
(if (first (:class/_parent class)) ; has children classes
(let [all-classes (conj (->> (get-class-children repo class-id)
(map #(db-utils/entity repo %)))
class)]
(->> (mapcat :block/_tags all-classes)
distinct))
(:block/_tags class))))
(defn get-all-namespace-relation

View File

@ -42,7 +42,7 @@
_ (test-helper/create-page! "class1" opts)
class (db/get-case-page "class1")
_ (test-helper/save-block! repo fbid "Block 1" {:tags ["class1"]})]
(is (= (model/get-class-objects repo (:db/id class))
(is (= (map :db/id (model/get-class-objects repo (:db/id class)))
[(:db/id (db/entity [:block/uuid fbid]))]))
(testing "classes parent"
@ -52,7 +52,7 @@
(db/transact! [{:db/id (:db/id class2)
:class/parent (:db/id class)}]))
(test-helper/save-block! repo sbid "Block 2" {:tags ["class2"]})
(is (= (model/get-class-objects repo (:db/id class))
(is (= (map :db/id (model/get-class-objects repo (:db/id class)))
[(:db/id (db/entity [:block/uuid fbid]))
(:db/id (db/entity [:block/uuid sbid]))])))))

View File

@ -25,7 +25,7 @@
(docs-graph-helper/docs-graph-assertions db graph-dir (map :file/path files))
(testing "Additional Counts"
(is (= 63706 (count (d/datoms db :eavt))) "Correct datoms count")
(is (= 64476 (count (d/datoms db :eavt))) "Correct datoms count")
(is (= 5946
(ffirst