enhance(rtc): generate migration new classes client-ops when rtc-start

This commit is contained in:
rcmerci
2025-03-08 22:17:49 +08:00
committed by Tienson Qin
parent bd14a8c6e4
commit 7fa9e689ed
3 changed files with 61 additions and 20 deletions

View File

@@ -134,17 +134,27 @@
db-before db-after e->a->v->add?->t rtc-const/ignore-attrs-when-syncing)
same-entity-datoms-coll))
(defn- generate-rtc-ops-from-entities
[ents]
(let [db (d/entity-db (first ents))
id->same-entity-datoms
(into {}
(map (fn [ent]
(let [e (:db/id ent)
datoms (d/datoms db :eavt e)]
[e datoms])))
ents)
e->a->v->add?->t (update-vals id->same-entity-datoms entity-datoms=>a->add?->v->t)]
(generate-rtc-ops db db (vals id->same-entity-datoms) e->a->v->add?->t)))
(defn generate-rtc-ops-from-property-entities
[property-entities]
(when (seq property-entities)
(assert (every? ldb/property? property-entities))
(let [db (d/entity-db (first property-entities))
id->same-entity-datoms
(into {}
(map (fn [prop-ent]
(let [e (:db/id prop-ent)
datoms (d/datoms db :eavt e)]
[e datoms])))
property-entities)
e->a->v->add?->t (update-vals id->same-entity-datoms entity-datoms=>a->add?->v->t)]
(generate-rtc-ops db db (vals id->same-entity-datoms) e->a->v->add?->t))))
[property-ents]
(when (seq property-ents)
(assert (every? ldb/property? property-ents))
(generate-rtc-ops-from-entities property-ents)))
(defn generate-rtc-ops-from-class-entities
[class-ents]
(when (seq class-ents)
(assert (every? ldb/class? class-ents))
(generate-rtc-ops-from-entities class-ents)))

View File

@@ -23,11 +23,15 @@
(map second)))))
(defn- migration-updates->client-ops
"TODO: support :classes in migration-updates"
"convert :classes, :properties from frontend.worker.db.migrate/schema-version->updates into client-ops"
[db client-schema-version migrate-updates]
(let [property-ks (mapcat :properties migrate-updates)
new-property-entites (keep (fn [k] (d/entity db k)) property-ks)
client-ops (vec (gen-client-op/generate-rtc-ops-from-property-entities new-property-entites))
class-ks (mapcat :classes migrate-updates)
d-entity-fn (partial d/entity db)
new-property-entities (keep d-entity-fn property-ks)
new-class-entities (keep d-entity-fn class-ks)
client-ops (vec (concat (gen-client-op/generate-rtc-ops-from-property-entities new-property-entities)
(gen-client-op/generate-rtc-ops-from-class-entities new-class-entities)))
max-t (apply max 0 (map second client-ops))]
(conj client-ops
[:update-kv-value

View File

@@ -1,5 +1,6 @@
(ns frontend.worker.rtc.gen-client-op-test
(:require [cljs.test :as t :refer [deftest is testing]]
[clojure.set :as set]
[datascript.core :as d]
[frontend.db.conn :as conn]
[frontend.state :as state]
@@ -11,7 +12,8 @@
[frontend.worker.state :as worker-state]
[logseq.db.test.helper :as db-test]
[logseq.outliner.batch-tx :as batch-tx]
[logseq.outliner.core :as outliner-core]))
[logseq.outliner.core :as outliner-core]
[meander.epsilon :as me]))
(t/use-fixtures :each
test-helper/db-based-start-and-destroy-db-map-fixture
@@ -160,6 +162,31 @@
(deftest generate-rtc-ops-from-property-entity-test
(let [repo (state/get-current-repo)
db (conn/get-db repo true)
ent (d/entity db :logseq.property.view/feature-type)]
(is (= #{:move :update-page :update}
(set (map first (subject/generate-rtc-ops-from-property-entities [ent])))))))
ent (d/entity db :logseq.property.view/feature-type)
av-coll-attrs #{:logseq.property/type :logseq.property/built-in?
:logseq.property/public? :logseq.property/hide?
:block/tags :block/title :db/cardinality}]
#_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
(is (->> (me/find (subject/generate-rtc-ops-from-property-entities [ent])
([:move _ {:block-uuid ?block-uuid}]
[:update-page _ {:block-uuid ?block-uuid}]
[:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
!av-coll-attrs)
set
(set/difference av-coll-attrs)
empty?))))
(deftest generate-rtc-ops-from-class-entity-test
(let [repo (state/get-current-repo)
db (conn/get-db repo true)
ent (d/entity db :logseq.class/Template)
av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property/parent
:block/tags :block/title}]
#_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
(is (->> (me/find (subject/generate-rtc-ops-from-class-entities [ent])
([:update-page _ {:block-uuid ?block-uuid}]
[:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
!av-coll-attrs)
set
(set/difference av-coll-attrs)
empty?))))