fix(rtc): consider non built-in schemas as well when upload-graph

experiment/tanstack-table
rcmerci 2024-05-23 17:55:39 +08:00
parent 1cfc426486
commit 64eccea7d4
2 changed files with 32 additions and 8 deletions

View File

@ -4,7 +4,8 @@
[frontend.schema-register :include-macros true :as sr]
[frontend.worker.db-listener :as db-listener]
[frontend.worker.rtc.op-mem-layer :as op-mem-layer]
[logseq.db :as ldb]))
[logseq.db :as ldb]
[clojure.string :as string]))
(defn- latest-add?->v->t
[add?->v->t]
@ -23,8 +24,12 @@
:block/tags :block/type :block/schema :block/link :block/journal-day})
(defn- watched-attr?
;; TODO: class related attrs?
[attr]
(contains? watched-attrs attr))
(or (contains? watched-attrs attr)
(let [ns (namespace attr)]
(or (= "logseq.task" ns) ;e.g. :logseq.task/status
(string/ends-with? ns ".property"))))) ; :logseq.property/xxx, :user.property/xxx
(defn- ref-attr?
[db attr]

View File

@ -9,7 +9,6 @@
[frontend.worker.state :as worker-state]
[frontend.worker.util :as worker-util]
[logseq.db :as ldb]
[logseq.db.frontend.schema :as db-schema]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.outliner.pipeline :as outliner-pipeline]
[malli.core :as ma]
@ -17,7 +16,6 @@
[missionary.core :as m]
[promesa.core :as p]))
(def ^:private normalized-remote-block-schema
"Blocks stored in remote have some differences in format from the client's.
Use this schema's coercer to decode."
@ -49,9 +47,30 @@
(ma/coercer [:sequential normalized-remote-block-schema]
(mt/transformer {:name :custom} mt/string-transformer)))
(defn- schema->ref-type-attrs
[db-schema]
(set
(keep
(fn [[attr-name attr-body-map]]
(when (= :db.type/ref (:db/valueType attr-body-map))
attr-name))
db-schema)))
(defn- schema->card-many-attrs
[db-schema]
(set
(keep
(fn [[attr-name attr-body-map]]
(when (= :db.cardinality/many (:db/cardinality attr-body-map))
attr-name))
db-schema)))
(defn- export-as-blocks
[db]
(let [datoms (d/datoms db :eavt)]
(let [datoms (d/datoms db :eavt)
db-schema (d/schema db)
card-many-attrs (schema->card-many-attrs db-schema)
ref-type-attrs (schema->ref-type-attrs db-schema)]
(->> datoms
(partition-by :e)
(keep (fn [datoms]
@ -62,8 +81,8 @@
(not (pos-int? (:v datom))))
(throw (ex-info "invalid block data" {:datom datom})))
(let [a (:a datom)
card-many? (contains? db-schema/card-many-attributes a)
ref? (contains? db-schema/ref-type-attributes a)]
card-many? (contains? card-many-attrs a)
ref? (contains? ref-type-attrs a)]
(case [ref? card-many?]
[true true]
(update r a conj (str (:v datom)))
@ -157,7 +176,7 @@
[all-blocks repo graph-uuid]
(let [{:keys [t blocks]} all-blocks
blocks (worker-util/profile :normalize-remote-blocks
(normalized-remote-blocks-coercer blocks))
(normalized-remote-blocks-coercer blocks))
blocks-with-page-id (fill-block-fields blocks)
tx-data (concat blocks-with-page-id
[{:db/ident :logseq.kv/graph-uuid :graph/uuid graph-uuid}])