浏览代码

fix: missing db/ident for inline tags

Tienson Qin 6 月之前
父节点
当前提交
9bb6842b1e

+ 7 - 5
deps/db/src/logseq/db/frontend/class.cljs

@@ -136,17 +136,19 @@
 (defn create-user-class-ident-from-name
 (defn create-user-class-ident-from-name
   "Creates a class :db/ident for a default user namespace.
   "Creates a class :db/ident for a default user namespace.
    NOTE: Only use this when creating a db-ident for a new class."
    NOTE: Only use this when creating a db-ident for a new class."
-  [class-name]
-  (db-ident/create-db-ident-from-name "user.class" class-name))
+  [db class-name]
+  (let [db-ident (db-ident/create-db-ident-from-name "user.class" class-name)]
+    (if db
+      (db-ident/ensure-unique-db-ident db db-ident)
+      db-ident)))
 
 
 (defn build-new-class
 (defn build-new-class
   "Builds a new class with a unique :db/ident. Also throws exception for user
   "Builds a new class with a unique :db/ident. Also throws exception for user
   facing messages when name is invalid"
   facing messages when name is invalid"
   [db page-m]
   [db page-m]
   {:pre [(string? (:block/title page-m))]}
   {:pre [(string? (:block/title page-m))]}
-  (let [db-ident (create-user-class-ident-from-name (:block/title page-m))
-        db-ident' (db-ident/ensure-unique-db-ident db db-ident)]
-    (sqlite-util/build-new-class (assoc page-m :db/ident db-ident'))))
+  (let [db-ident (create-user-class-ident-from-name db (:block/title page-m))]
+    (sqlite-util/build-new-class (assoc page-m :db/ident db-ident))))
 
 
 (defonce logseq-class "logseq.class")
 (defonce logseq-class "logseq.class")
 
 

+ 1 - 1
deps/db/src/logseq/db/frontend/schema.cljs

@@ -37,7 +37,7 @@
          (map (juxt :major :minor)
          (map (juxt :major :minor)
               [(parse-schema-version x) (parse-schema-version y)])))
               [(parse-schema-version x) (parse-schema-version y)])))
 
 
-(def version (parse-schema-version "65.2"))
+(def version (parse-schema-version "65.3"))
 
 
 (defn major-version
 (defn major-version
   "Return a number.
   "Return a number.

+ 1 - 1
deps/db/src/logseq/db/sqlite/build.cljs

@@ -407,7 +407,7 @@
                                         (if graph-namespace
                                         (if graph-namespace
                                           (db-ident/create-db-ident-from-name (str (name graph-namespace) ".class")
                                           (db-ident/create-db-ident-from-name (str (name graph-namespace) ".class")
                                                                               (name %))
                                                                               (name %))
-                                          (db-class/create-user-class-ident-from-name (name %)))))
+                                          (db-class/create-user-class-ident-from-name nil (name %)))))
                           (into {}))
                           (into {}))
         _ (assert (= (count (set (vals class-idents))) (count classes)) "All class db-idents must be unique")
         _ (assert (= (count (set (vals class-idents))) (count classes)) "All class db-idents must be unique")
         all-idents (merge property-idents class-idents)]
         all-idents (merge property-idents class-idents)]

+ 18 - 2
deps/outliner/src/logseq/outliner/core.cljs

@@ -12,6 +12,7 @@
             [logseq.db :as ldb]
             [logseq.db :as ldb]
             [logseq.db.common.order :as db-order]
             [logseq.db.common.order :as db-order]
             [logseq.db.file-based.schema :as file-schema]
             [logseq.db.file-based.schema :as file-schema]
+            [logseq.db.frontend.class :as db-class]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.sqlite.create-graph :as sqlite-create-graph]
             [logseq.db.sqlite.create-graph :as sqlite-create-graph]
             [logseq.db.sqlite.util :as sqlite-util]
             [logseq.db.sqlite.util :as sqlite-util]
@@ -222,6 +223,16 @@
          (map (fn [tag]
          (map (fn [tag]
                 [:db/retract (:db/id block) :block/tags (:db/id tag)])))))
                 [:db/retract (:db/id block) :block/tags (:db/id tag)])))))
 
 
+(defn- add-missing-tag-idents
+  [db tags]
+  (mapcat
+   (fn [t]
+     (when-not (:db/ident t)
+       (let [eid [:block/uuid (:block/uuid t)]]
+         [[:db/add eid :db/ident (db-class/create-user-class-ident-from-name db (:block/title t))]
+          [:db/retract eid :block/tags :logseq.class/Page]])))
+   tags))
+
 (extend-type Entity
 (extend-type Entity
   otree/INode
   otree/INode
   (-save [this *txs-state db repo _date-formatter {:keys [retract-attributes? retract-attributes outliner-op]
   (-save [this *txs-state db repo _date-formatter {:keys [retract-attributes? retract-attributes outliner-op]
@@ -314,9 +325,14 @@
         (swap! *txs-state conj
         (swap! *txs-state conj
                (dissoc m :db/other-tx)))
                (dissoc m :db/other-tx)))
 
 
-      ;; delete tags when title changed
       (when (and db-based? (:block/tags block-entity) block-entity)
       (when (and db-based? (:block/tags block-entity) block-entity)
-        (let [tx-data (remove-tags-when-title-changed block-entity (:block/title m))]
+        (let [;; delete tags when title changed
+              tx-data (remove-tags-when-title-changed block-entity (:block/title m))]
+          (when (seq tx-data)
+            (swap! *txs-state (fn [txs] (concat txs tx-data))))))
+
+      (when db-based?
+        (let [tx-data (add-missing-tag-idents db (:block/tags m))]
           (when (seq tx-data)
           (when (seq tx-data)
             (swap! *txs-state (fn [txs] (concat txs tx-data))))))
             (swap! *txs-state (fn [txs] (concat txs tx-data))))))
 
 

+ 20 - 1
src/main/frontend/worker/db/migrate.cljs

@@ -270,13 +270,32 @@
          tag-properties))
          tag-properties))
      class-ids)))
      class-ids)))
 
 
+(defn add-missing-db-ident-for-tags
+  [conn _sqlite-db]
+  (let [db @conn
+        class-ids (d/q
+                   '[:find [?b ...]
+                     :where
+                     [?b :block/tags :logseq.class/Tag]
+                     [(missing? $ ?b :db/ident)]]
+                   db)]
+    (mapcat
+     (fn [id]
+       (let [title (:block/title (d/entity db id))]
+         [[:db/add id :db/ident (db-class/create-user-class-ident-from-name db title)]
+          [:db/retract id :block/tags :logseq.class/Page]
+          [:db/retract id :block/refs :logseq.class/Page]
+          [:db/retract id :block/path-refs :logseq.class/Page]]))
+     class-ids)))
+
 (def schema-version->updates
 (def schema-version->updates
   "A vec of tuples defining datascript migrations. Each tuple consists of the
   "A vec of tuples defining datascript migrations. Each tuple consists of the
    schema version integer and a migration map. A migration map can have keys of :properties, :classes
    schema version integer and a migration map. A migration map can have keys of :properties, :classes
    and :fix."
    and :fix."
   [["65.0" {:fix separate-classes-and-properties}]
   [["65.0" {:fix separate-classes-and-properties}]
    ["65.1" {:fix fix-rename-parent-to-extends}]
    ["65.1" {:fix fix-rename-parent-to-extends}]
-   ["65.2" {:fix fix-tag-properties}]])
+   ["65.2" {:fix fix-tag-properties}]
+   ["65.3" {:fix add-missing-db-ident-for-tags}]])
 
 
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
                                      schema-version->updates)))]
                                      schema-version->updates)))]

+ 17 - 0
src/test/frontend/modules/outliner/core_test.cljs

@@ -13,6 +13,7 @@
             [frontend.test.helper :as test-helper :refer [load-test-files]]
             [frontend.test.helper :as test-helper :refer [load-test-files]]
             [frontend.worker.db-listener :as worker-db-listener]
             [frontend.worker.db-listener :as worker-db-listener]
             [logseq.db :as ldb]
             [logseq.db :as ldb]
+            [logseq.db.test.helper :as db-test]
             [logseq.graph-parser.block :as gp-block]
             [logseq.graph-parser.block :as gp-block]
             [logseq.outliner.core :as outliner-core]
             [logseq.outliner.core :as outliner-core]
             [logseq.outliner.transaction :as outliner-tx]))
             [logseq.outliner.transaction :as outliner-tx]))
@@ -515,6 +516,22 @@
                                                     (state/get-date-formatter)
                                                     (state/get-date-formatter)
                                                     block)))
                                                     block)))
 
 
+(deftest save-inline-tag
+  (let [conn (db-test/create-conn-with-blocks
+              [{:page {:block/title "page1"} :blocks [{:block/title "test"}]}])
+        block (db-test/find-block-by-content @conn "test")
+        _ (outliner-core/save-block! "logseq_db_test" conn
+                                     "MMM do, yyyy"
+                                     {:block/uuid (:block/uuid block)
+                                      :block/refs '({:block/name "audio", :block/title "audio", :block/uuid #uuid "6852be3e-6e80-4245-b72c-0d586f1fd007", :block/created-at 1750253118663, :block/updated-at 1750253118663, :block/tags [:logseq.class/Page]}),
+                                      :block/tags '({:block/name "audio", :block/title "audio", :block/uuid #uuid "6852be3e-6e80-4245-b72c-0d586f1fd007", :block/created-at 1750253118663, :block/updated-at 1750253118663, :block/tags [:logseq.class/Tag]}),
+                                      :block/title "test #[[6852be3e-6e80-4245-b72c-0d586f1fd007]]",
+                                      :db/id (:db/id block)})
+        audio-tag (ldb/get-page @conn "audio")]
+    (is (some? (:db/ident audio-tag)) "#audio doesn't have db/ident")
+    (is (= [:logseq.class/Tag] (map :db/ident (:block/tags audio-tag)))
+        "#audio has wrong tags")))
+
 (deftest save-test
 (deftest save-test
   (load-test-files [{:file/path "pages/page1.md"
   (load-test-files [{:file/path "pages/page1.md"
                      :file/content "alias:: foo, bar
                      :file/content "alias:: foo, bar