From 26353019514617eb596c4e883cfe91441116edd2 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 26 Jun 2025 18:20:29 +0800 Subject: [PATCH] fix: invalid blocks caused by separating classes and properties --- src/main/frontend/worker/db/migrate.cljs | 10 ++- src/main/frontend/worker/db/validate.cljs | 104 +++++++++++++++------- 2 files changed, 81 insertions(+), 33 deletions(-) diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index 083daf0afd..0d500cb71b 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -239,9 +239,17 @@ tag-properties (->> (d/datoms db :avet :logseq.property.class/properties id) (mapcat (fn [d] [[:db/retract (:e d) (:a d) (:v d)] - [:db/add (:e d) (:a d) [:block/uuid (:block/uuid new-property)]]])))] + [:db/add (:e d) (:a d) [:block/uuid (:block/uuid new-property)]]]))) + other-properties-tx (mapcat + (fn [ident] + (->> (d/datoms db :avet ident id) + (mapcat (fn [d] + [[:db/retract (:e d) (:a d) (:v d)] + [:db/add (:e d) (:a d) [:block/uuid (:block/uuid new-property)]]])))) + [:logseq.property.view/group-by-property :logseq.property.table/pinned-columns])] (concat [new-property] tag-properties + other-properties-tx retract-property-attrs (mapcat (fn [d] diff --git a/src/main/frontend/worker/db/validate.cljs b/src/main/frontend/worker/db/validate.cljs index 6fdf1c535c..c5d095c737 100644 --- a/src/main/frontend/worker/db/validate.cljs +++ b/src/main/frontend/worker/db/validate.cljs @@ -5,42 +5,82 @@ [logseq.db :as ldb] [logseq.db.frontend.validate :as db-validate])) +(defn- get-property-by-title + [db title] + (when title + (some->> (first (ldb/page-exists? db title [:logseq.class/Property])) + (d/entity db)))) + (defn- fix-invalid-blocks! [conn errors] - (let [tx-data (mapcat - (fn [{:keys [entity dispatch-key]}] - (let [entity (d/entity @conn (:db/id entity))] - (cond - (and (= dispatch-key :block) (nil? (:block/title entity))) - [[:db/retractEntity (:db/id entity)]] - - (and (= dispatch-key :block) (nil? (:block/page entity))) - (let [latest-journal-id (:db/id (first (ldb/get-latest-journals @conn))) - page-id (:db/id (:block/page (:block/parent entity)))] + (let [db @conn + fix-tx-data (mapcat + (fn [{:keys [entity dispatch-key]}] + (let [entity (d/entity db (:db/id entity))] (cond - page-id - [[:db/add (:db/id entity) :block/page page-id]] - latest-journal-id - [[:db/add (:db/id entity) :block/page latest-journal-id] - [:db/add (:db/id entity) :block/parent latest-journal-id]] - :else - (js/console.error (str "Don't know where to put the block " (:db/id entity))))) + (and (= dispatch-key :block) (nil? (:block/title entity))) + [[:db/retractEntity (:db/id entity)]] - (:block.temp/fully-loaded? entity) - [[:db/retract (:db/id entity) :block.temp/fully-loaded?]] - (and (:block/page entity) (not (:block/parent entity))) - [[:db/add (:db/id entity) :block/parent (:db/id (:block/page entity))]] - (and (not (:block/page entity)) (not (:block/parent entity)) (not (:block/name entity))) - [[:db/retractEntity (:db/id entity)]] - (and (= dispatch-key :property-value-block) (:block/title entity)) - [[:db/retract (:db/id entity) :block/title]] - (and (ldb/class? entity) (not (:logseq.property.class/extends entity))) - [[:db/add (:db/id entity) :logseq.property.class/extends :logseq.class/Root]] - (and (or (ldb/class? entity) (ldb/property? entity)) (ldb/internal-page? entity)) - [[:db/retract (:db/id entity) :block/tags :logseq.class/Page]] - :else - nil))) - errors)] + (and (= dispatch-key :block) (nil? (:block/page entity))) + (let [latest-journal-id (:db/id (first (ldb/get-latest-journals db))) + page-id (:db/id (:block/page (:block/parent entity)))] + (cond + page-id + [[:db/add (:db/id entity) :block/page page-id]] + latest-journal-id + [[:db/add (:db/id entity) :block/page latest-journal-id] + [:db/add (:db/id entity) :block/parent latest-journal-id]] + :else + (js/console.error (str "Don't know where to put the block " (:db/id entity))))) + + (and (= dispatch-key :block) + (some (fn [k] (= "user.class" (namespace k))) (keys (:logseq.property.table/sized-columns entity)))) + (let [new-value (->> (keep (fn [[k v]] + (if (= "user.class" (namespace k)) + (when-let [property (get-property-by-title db (:block/title (d/entity db k)))] + [(:db/ident property) v]) + [k v])) + (:logseq.property.table/sized-columns entity)) + (into {}))] + [[:db/add (:db/id entity) :logseq.property.table/sized-columns new-value]]) + + (:block.temp/fully-loaded? entity) + [[:db/retract (:db/id entity) :block.temp/fully-loaded?]] + (and (:block/page entity) (not (:block/parent entity))) + [[:db/add (:db/id entity) :block/parent (:db/id (:block/page entity))]] + (and (not (:block/page entity)) (not (:block/parent entity)) (not (:block/name entity))) + [[:db/retractEntity (:db/id entity)]] + (and (= dispatch-key :property-value-block) (:block/title entity)) + [[:db/retract (:db/id entity) :block/title]] + (and (ldb/class? entity) (not (:logseq.property.class/extends entity))) + [[:db/add (:db/id entity) :logseq.property.class/extends :logseq.class/Root]] + (and (or (ldb/class? entity) (ldb/property? entity)) (ldb/internal-page? entity)) + [[:db/retract (:db/id entity) :block/tags :logseq.class/Page]] + :else + nil))) + errors) + class-as-properties (concat + (mapcat + (fn [ident] + (->> (d/datoms db :avet ident) + (mapcat (fn [d] + (let [entity (d/entity db (:v d))] + (when (ldb/class? entity) + (if-let [property (get-property-by-title db (:block/title entity))] + [[:db/retract (:e d) (:a d) (:v d)] + [:db/add (:e d) (:a d) (:db/id property)]] + [[:db/retract (:e d) (:a d) (:v d)]]))))))) + [:logseq.property.view/group-by-property :logseq.property.table/pinned-columns]) + (->> (d/datoms db :eavt) + (filter (fn [d] (= (namespace (:a d)) "user.class"))) + (mapcat (fn [d] + (let [class-title (:block/title (d/entity db (:a d))) + property (get-property-by-title db class-title)] + (if property + [[:db/retract (:e d) (:a d) (:v d)] + [:db/add (:e d) (:db/ident property) (:v d)]] + [[:db/retract (:e d) (:a d) (:v d)]])))))) + tx-data (concat fix-tx-data class-as-properties)] (when (seq tx-data) (ldb/transact! conn tx-data {:fix-db? true}))))