浏览代码

fix: migrate for using properties as tags

Tienson Qin 4 月之前
父节点
当前提交
170b0a9a81
共有 2 个文件被更改,包括 42 次插入15 次删除
  1. 1 1
      deps/db/src/logseq/db/frontend/schema.cljs
  2. 41 14
      src/main/frontend/worker/db/migrate.cljs

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

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

+ 41 - 14
src/main/frontend/worker/db/migrate.cljs

@@ -193,6 +193,22 @@
          move-top-parents-to-library
          update-children-parent-and-order)))))
 
+(defn- retract-property-attributes
+  [id]
+  [[:db/retract id :block/tags :logseq.class/Property]
+   [:db/retract id :logseq.property/type]
+   [:db/retract id :db/cardinality]
+   [:db/retract id :db/valueType]
+   [:db/retract id :db/index]
+   [:db/retract id :logseq.property/classes]
+   [:db/retract id :logseq.property/hide?]
+   [:db/retract id :logseq.property/public?]
+   [:db/retract id :logseq.property/view-context]
+   [:db/retract id :logseq.property/ui-position]
+   [:db/retract id :logseq.property/default-value]
+   [:db/retract id :logseq.property/hide-empty-value]
+   [:db/retract id :logseq.property/enable-history?]])
+
 (defn separate-classes-and-properties
   [conn _sqlite-db]
   ;; find all properties that're classes, create new properties to separate them
@@ -218,19 +234,7 @@
                                                              :logseq.property/view-context :logseq.property/ui-position
                                                              :logseq.property/default-value :logseq.property/hide-empty-value :logseq.property/enable-history?])
                                          {:logseq.property/classes id})})
-             retract-property-attrs [[:db/retract id :block/tags :logseq.class/Property]
-                                     [:db/retract id :logseq.property/type]
-                                     [:db/retract id :db/cardinality]
-                                     [:db/retract id :db/valueType]
-                                     [:db/retract id :db/index]
-                                     [:db/retract id :logseq.property/classes]
-                                     [:db/retract id :logseq.property/hide?]
-                                     [:db/retract id :logseq.property/public?]
-                                     [:db/retract id :logseq.property/view-context]
-                                     [:db/retract id :logseq.property/ui-position]
-                                     [:db/retract id :logseq.property/default-value]
-                                     [:db/retract id :logseq.property/hide-empty-value]
-                                     [:db/retract id :logseq.property/enable-history?]]
+             retract-property-attrs (retract-property-attributes id)
              datoms (if (:db/index class)
                       (d/datoms db :avet ident)
                       (filter (fn [d] (= ident (:a d))) (d/datoms db :eavt)))
@@ -288,6 +292,28 @@
           [:db/retract id :block/path-refs :logseq.class/Page]]))
      class-ids)))
 
+(defn fix-using-properties-as-tags
+  [conn _sqlite-db]
+  ;; find all properties that're tags
+  (let [db @conn
+        property-ids (->>
+                      (d/q
+                       '[:find ?b ?i
+                         :where
+                         [?b :block/tags :logseq.class/Tag]
+                         [?b :db/ident ?i]]
+                       db)
+                      (filter (fn [[_ ident]] (= "user.property" (namespace ident))))
+                      (map first))]
+    (mapcat
+     (fn [id]
+       (let [property (d/entity @conn id)
+             title (:block/title property)]
+         (into (retract-property-attributes id)
+               [[:db/retract id :logseq.property/parent]
+                [:db/add id :db/ident (db-class/create-user-class-ident-from-name db title)]])))
+     property-ids)))
+
 (def schema-version->updates
   "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
@@ -295,7 +321,8 @@
   [["65.0" {:fix separate-classes-and-properties}]
    ["65.1" {:fix fix-rename-parent-to-extends}]
    ["65.2" {:fix fix-tag-properties}]
-   ["65.3" {:fix add-missing-db-ident-for-tags}]])
+   ["65.3" {:fix add-missing-db-ident-for-tags}]
+   ["65.4" {:fix fix-using-properties-as-tags}]])
 
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
                                      schema-version->updates)))]