mirror of
https://github.com/logseq/logseq.git
synced 2026-05-27 14:14:24 +00:00
enhance(rtc): generate migration new classes client-ops when rtc-start
This commit is contained in:
@@ -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)))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?))))
|
||||
|
||||
Reference in New Issue
Block a user