From fef4e896e17ef88037db714c196aa09ca84c046c Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 24 Apr 2024 19:13:48 +0800 Subject: [PATCH] fix: use existing property pair if exists --- .../logseq/db/frontend/property/build.cljs | 4 +-- deps/db/src/logseq/db/sqlite/common_db.cljs | 4 ++- deps/db/src/logseq/db/sqlite/util.cljs | 18 ++++++++--- .../src/logseq/graph_parser/whiteboard.cljs | 19 ++++++----- deps/outliner/src/logseq/outliner/core.cljs | 4 +-- .../logseq/tasks/db_graph/create_graph.cljs | 1 + .../frontend/handler/db_based/property.cljs | 23 ++++++------- src/main/frontend/handler/whiteboard.cljs | 32 ++++++------------- src/main/frontend/worker/rtc/core.cljs | 2 +- 9 files changed, 53 insertions(+), 54 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/property/build.cljs b/deps/db/src/logseq/db/frontend/property/build.cljs index 327d750be4..b967cbcc11 100644 --- a/deps/db/src/logseq/db/frontend/property/build.cljs +++ b/deps/db/src/logseq/db/frontend/property/build.cljs @@ -11,7 +11,7 @@ :block/format :markdown :block/uuid block-id :block/page page-id - :block/properties [(sqlite-util/build-property-pair :logseq.property/created-from-property (:db/ident property))] + :block/properties [(sqlite-util/build-property-pair nil :logseq.property/created-from-property (:db/ident property))] :block/schema {:value value} :block/parent page-id}) @@ -25,7 +25,7 @@ (assoc :db/ident db-ident) icon - (update :block/properties conj (sqlite-util/build-property-pair :logseq.property/icon icon)) + (update :block/properties conj (sqlite-util/build-property-pair nil :logseq.property/icon icon)) ;; For now, only closed values with :db/ident are built-in? (and db-ident (keyword? db-ident)) diff --git a/deps/db/src/logseq/db/sqlite/common_db.cljs b/deps/db/src/logseq/db/sqlite/common_db.cljs index 0dfdf18159..7612195b66 100644 --- a/deps/db/src/logseq/db/sqlite/common_db.cljs +++ b/deps/db/src/logseq/db/sqlite/common_db.cljs @@ -31,7 +31,9 @@ (->> (d/datoms db :avet :block/name) (keep (fn [e] (when-not (contains? exclude-page-ids (:e e)) - (d/pull db '[:db/id :db/ident :block/uuid :block/name :block/original-name :block/alias :block/type] (:e e))))))) + (d/pull db '[:db/id :db/ident :block/uuid :block/name :block/original-name :block/alias :block/type + :block/created-at :block/updated-at] + (:e e))))))) (defn get-all-files [db] diff --git a/deps/db/src/logseq/db/sqlite/util.cljs b/deps/db/src/logseq/db/sqlite/util.cljs index 7ec7bee047..9cc9bab386 100644 --- a/deps/db/src/logseq/db/sqlite/util.cljs +++ b/deps/db/src/logseq/db/sqlite/util.cljs @@ -121,12 +121,22 @@ (nil? (:block/page block)))) (defn build-property-pair - [db-ident value] + [block db-ident value] + (assert (or (de/entity? block) (nil? block)) "build-property-pair `block` should be a db entity or nil") (block-with-timestamps - {:property/pair-property {:db/ident db-ident} - db-ident value})) + (if-let [pair (when block (db-property/get-pair-e block db-ident))] + {:db/id (:db/id pair) + db-ident value + :block/created-at (:block/created-at pair)} + {:property/pair-property {:db/ident db-ident} + db-ident value}))) + +(defn build-properties + [block properties-map] + (assert (or (de/entity? block) (nil? block)) "build-property-pair `block` should be a db entity or nil") + (mapv (fn [[db-ident value]] (build-property-pair block db-ident value)) properties-map)) (defn mark-block-as-built-in "Marks built-in blocks as built-in? including pages, classes, properties and closed values" [block] - (update block :block/properties conj (build-property-pair :logseq.property/built-in? true))) + (update block :block/properties conj (build-property-pair block :logseq.property/built-in? true))) diff --git a/deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs b/deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs index d2a4c5c351..00d9ae4f3e 100644 --- a/deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs @@ -1,7 +1,8 @@ (ns logseq.graph-parser.whiteboard "Whiteboard related parser utilities" (:require [logseq.db.frontend.property.util :as db-property-util] - [logseq.db.sqlite.util :as sqlite-util])) + [logseq.db.sqlite.util :as sqlite-util] + [datascript.core :as d])) (defn block->shape [block] (get-in block [:block/properties :logseq.tldraw.shape])) @@ -79,13 +80,15 @@ (when (nil? (:block/format block)) {:block/format :markdown}) ;; TODO: read from config {:block/page page-id}))) -(defn shape->block [repo shape page-id] - (let [properties (if (sqlite-util/db-based-graph? repo) - [(sqlite-util/build-property-pair :logseq.property/ls-type :whiteboard-shape) - (sqlite-util/build-property-pair :logseq.property.tldraw/shape shape)] - {(db-property-util/get-pid repo :logseq.property/ls-type) :whiteboard-shape - (db-property-util/get-pid repo :logseq.property.tldraw/shape) shape}) - block {:block/uuid (if (uuid? (:id shape)) (:id shape) (uuid (:id shape))) +(defn shape->block [repo db shape page-id] + (let [block-uuid (if (uuid? (:id shape)) (:id shape) (uuid (:id shape))) + block (when block-uuid (d/entity db [:block/uuid block-uuid])) + properties-map {(db-property-util/get-pid repo :logseq.property/ls-type) :whiteboard-shape + (db-property-util/get-pid repo :logseq.property.tldraw/shape) shape} + properties (if (sqlite-util/db-based-graph? repo) + (sqlite-util/build-properties block properties-map) + properties-map) + block {:block/uuid block-uuid :block/page page-id :block/parent page-id} block' (assoc block :block/properties properties) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index e2ad9efc0a..46300e25a6 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -325,7 +325,7 @@ (swap! txs-state into [[:db/retractEntity (:db/id pair)]])) (cond-> m matched-status-id - (update :block/properties conj (sqlite-util/build-property-pair (:db/ident property) matched-status-id)) + (update :block/properties conj (sqlite-util/build-property-pair block-entity (:db/ident property) matched-status-id)) matched-status-id (update :block/content (fn [content] @@ -652,7 +652,7 @@ list? ((fn [b] (if db-based? - (update b :block/properties conj (sqlite-util/build-property-pair :logseq.property/order-list-type list-type)) + (update b :block/properties conj (sqlite-util/build-property-pair block :logseq.property/order-list-type list-type)) (update b :block/properties assoc (db-property-util/get-pid repo :logseq.property/order-list-type) list-type)))) (not db-based?) diff --git a/scripts/src/logseq/tasks/db_graph/create_graph.cljs b/scripts/src/logseq/tasks/db_graph/create_graph.cljs index a920362b86..92a5e97f93 100644 --- a/scripts/src/logseq/tasks/db_graph/create_graph.cljs +++ b/scripts/src/logseq/tasks/db_graph/create_graph.cljs @@ -76,6 +76,7 @@ (mapv (fn [[prop-name val]] (sqlite-util/build-property-pair + nil (get-ident all-idents prop-name) ;; set indicates a :many value (if (set? val) diff --git a/src/main/frontend/handler/db_based/property.cljs b/src/main/frontend/handler/db_based/property.cljs index 526495523e..2067942bc5 100644 --- a/src/main/frontend/handler/db_based/property.cljs +++ b/src/main/frontend/handler/db_based/property.cljs @@ -33,13 +33,7 @@ (build-property-value-tx-data block property-id value (= property-id :logseq.task/status))) ([block property-id value status?] (when (some? value) - (let [property-pair-e (db-property/get-pair-e block property-id) - property-tx-data (outliner-core/block-with-updated-at - (if property-pair-e - {:db/id (:db/id property-pair-e) - property-id value} - {:db/id (:db/id block) - :block/properties (sqlite-util/build-property-pair property-id value)})) + (let [property-tx-data (sqlite-util/build-property-pair block property-id value) block-tx-data (cond-> (outliner-core/block-with-updated-at {:db/id (:db/id block)}) status? (assoc :block/tags :logseq.class/task))] @@ -496,12 +490,12 @@ (assoc :block/type #{"hidden"} :block/format :markdown :block/properties - (sqlite-util/build-property-pair :logseq.property/source-page (:db/id property))))) + (sqlite-util/build-property-pair nil :logseq.property/source-page (:db/id property))))) page-tx (when-not page-entity page) page-id [:block/uuid (:block/uuid page)] parent-id (db/new-block-id) - from-block-pair (when (:db/id block) (sqlite-util/build-property-pair :logseq.property/created-from-block (:db/id block))) - from-property-pair (when (:db/id property) (sqlite-util/build-property-pair :logseq.property/created-from-property (:db/id property))) + from-block-pair (when (:db/id block) (sqlite-util/build-property-pair block :logseq.property/created-from-block (:db/id block))) + from-property-pair (when (:db/id property) (sqlite-util/build-property-pair block :logseq.property/created-from-property (:db/id property))) parent (-> {:block/uuid parent-id :block/format :markdown :block/content "" @@ -551,7 +545,7 @@ (assoc :block/type #{"hidden"} :block/format :markdown :block/properties - (sqlite-util/build-property-pair :logseq.property/source-page (:db/id property))))) + (sqlite-util/build-property-pair nil :logseq.property/source-page (:db/id property))))) page-tx (when-not page-entity page) page-id [:block/uuid (:block/uuid page)] block-id (db/new-block-id) @@ -564,9 +558,10 @@ :block/left (or (when page-entity (model/get-block-last-direct-child-id (db/get-db) (:db/id page-entity))) page-id) :block/properties - [(sqlite-util/build-property-pair :logseq.property/created-from-block [:block/uuid (:block/uuid block)]) - (sqlite-util/build-property-pair :logseq.property/created-from-property (:db/id property)) - (sqlite-util/build-property-pair :logseq.property/created-from-template [:block/uuid (:block/uuid template)])]} + (sqlite-util/build-properties nil + {:logseq.property/created-from-block [:block/uuid (:block/uuid block)] + :logseq.property/created-from-property (:db/id property) + :logseq.property/created-from-template [:block/uuid (:block/uuid template)]})} sqlite-util/block-with-timestamps)] {:page page-tx :blocks [new-block]})) diff --git a/src/main/frontend/handler/whiteboard.cljs b/src/main/frontend/handler/whiteboard.cljs index f0910827aa..97c662cec5 100644 --- a/src/main/frontend/handler/whiteboard.cljs +++ b/src/main/frontend/handler/whiteboard.cljs @@ -26,7 +26,7 @@ (defn- shape->block [shape page-id] (let [repo (state/get-current-repo)] - (gp-whiteboard/shape->block repo shape page-id))) + (gp-whiteboard/shape->block repo (db/get-db repo) shape page-id))) (defn- build-shapes [page-block blocks] @@ -66,8 +66,9 @@ {:block/original-name page-name :block/name (util/page-name-sanity-lc page-name) :block/type "whiteboard" - :block/properties [(sqlite-util/build-property-pair :logseq.property/ls-type :whiteboard-page) - (sqlite-util/build-property-pair :logseq.property.tldraw/page tldraw-page)] + :block/properties (sqlite-util/build-properties page-entity + {:logseq.property/ls-type :whiteboard-page + :logseq.property.tldraw/page tldraw-page}) :block/updated-at (util/time-ms) :block/created-at (or (:block/created-at page-entity) (util/time-ms))})) @@ -127,14 +128,6 @@ (remove nil?))) deleted-shapes-tx (mapv (fn [id] [:db/retractEntity [:block/uuid (uuid id)]]) deleted-ids) upserted-blocks (->> upsert-shapes - (remove (fn [shape] - (when-let [id (if (uuid? (:id shape)) (:id shape) (uuid (:id shape)))] - (let [block (db/entity [:block/uuid id])] - (= (:nonce shape) - (:nonce - (pu/get-block-property-value - block - :logseq.property.tldraw/shape))))))) (map #(shape->block % (:db/id page-entity))) (map sqlite-util/block-with-timestamps)) page-name (or (:block/original-name page-entity) (str page-uuid)) @@ -159,15 +152,10 @@ (let [tl-page ^js (second (first (.-pages app))) shapes (.-shapes ^js tl-page) page-block (model/get-page page-uuid) - prev-page-metadata (pu/get-block-property-value page-block :logseq.property.tldraw/page) - prev-shapes-index (:shapes-index prev-page-metadata) - shape-id->prev-index (zipmap prev-shapes-index (range (count prev-shapes-index))) - new-id-nonces (set (map-indexed (fn [idx shape] + new-id-nonces (set (map-indexed (fn [_idx shape] (let [id (.-id shape)] {:id id - :nonce (if (= idx (get shape-id->prev-index id)) - (.-nonce shape) - (js/Date.now))})) shapes)) + :nonce (or (.-nonce shape) (js/Date.now))})) shapes)) repo (state/get-current-repo) db-id-nonces (or (get-in @*last-shapes-nonce [repo page-uuid]) @@ -213,11 +201,11 @@ :bindings {}, :nonce 1, :assets []} + properties-map {(pu/get-pid :logseq.property/ls-type) :whiteboard-page, + (pu/get-pid :logseq.property.tldraw/page) tldraw-page} properties (if db-based? - [(sqlite-util/build-property-pair :logseq.property/ls-type :whiteboard-page) - (sqlite-util/build-property-pair :logseq.property.tldraw/page tldraw-page)] - {(pu/get-pid :logseq.property/ls-type) :whiteboard-page, - (pu/get-pid :logseq.property.tldraw/page) tldraw-page}) + (sqlite-util/build-properties nil properties-map) + properties-map) m #:block{:uuid id :name (util/page-name-sanity-lc page-name), :original-name page-name diff --git a/src/main/frontend/worker/rtc/core.cljs b/src/main/frontend/worker/rtc/core.cljs index c3152f840a..80815bcc2c 100644 --- a/src/main/frontend/worker/rtc/core.cljs +++ b/src/main/frontend/worker/rtc/core.cljs @@ -357,7 +357,7 @@ (get properties* shape-property-id))] (assert (some? page-name) local-parent) (assert (some? shape) properties*) - (transact-db! :upsert-whiteboard-block conn [(gp-whiteboard/shape->block repo shape page-name)]))))) + (transact-db! :upsert-whiteboard-block conn [(gp-whiteboard/shape->block repo db shape page-name)]))))) (defn- need-update-block? [conn block-uuid op-value]