Browse Source

enhance: detect and add properties to imported classes

fixes LOG-3069
Gabriel Horner 1 year ago
parent
commit
9669755cab

+ 2 - 1
deps/graph-parser/script/db_import.cljs

@@ -59,7 +59,8 @@
     (println "Importing" (count files) "files ...")
     (p/do!
      (gp-exporter/import-logseq-files conn logseq-files <read-file {:notify-user prn})
-     (gp-exporter/import-from-doc-files! conn doc-files <read-file import-options))))
+     (gp-exporter/import-from-doc-files! conn doc-files <read-file import-options)
+     (gp-exporter/import-class-properties conn conn))))
 
 (defn- resolve-path
   "If relative path, resolve with $ORIGINAL_PWD"

+ 30 - 0
deps/graph-parser/src/logseq/graph_parser/exporter.cljs

@@ -14,6 +14,7 @@
             [logseq.db.sqlite.util :as sqlite-util]
             [logseq.db :as ldb]
             [logseq.db.frontend.rules :as rules]
+            [logseq.db.frontend.class :as db-class]
             [logseq.common.util.page-ref :as page-ref]
             [promesa.core :as p]))
 
@@ -723,3 +724,32 @@
                                :level :error
                                :ex-data {:error err}})
                  (edn/read-string default-config)))))
+
+(defn import-class-properties
+  [conn repo-or-conn]
+  (let [user-classes (->> (d/q '[:find (pull ?b [:db/id :block/name])
+                                 :where [?b :block/type "class"]] @conn)
+                          (map first)
+                          (remove #(db-class/built-in-classes (keyword (:block/name %)))))
+        class-to-prop-uuids
+        (->> (d/q '[:find ?t ?prop-name ?prop-uuid #_?class
+                    :in $ ?user-classes
+                    :where
+                    [?b :block/tags ?t]
+                    [?t :block/name ?class]
+                    [(contains? ?user-classes ?class)]
+                    [?b :block/properties ?bp]
+                    [?prop-b :block/name ?prop-name]
+                    [?prop-b :block/uuid ?prop-uuid]
+                    [(get ?bp ?prop-uuid) ?_v]]
+                  @conn
+                  (set (map :block/name user-classes)))
+             (remove #(db-property/built-in-properties-keys-str (second %)))
+             (reduce (fn [acc [class-id _prop-name prop-uuid]]
+                       (update acc class-id (fnil conj #{}) prop-uuid))
+                     {}))
+        tx (mapv (fn [[class-id prop-ids]]
+                   {:db/id class-id
+                    :block/schema {:properties (vec prop-ids)}})
+                 class-to-prop-uuids)]
+    (ldb/transact! repo-or-conn tx)))

+ 1 - 0
src/main/frontend/components/imports.cljs

@@ -387,6 +387,7 @@
       (async/<! (import-from-asset-files! asset-files))
       (async/<! (p->c (gp-exporter/import-from-doc-files! db-conn doc-files <read-file import-options)))
       (async/<! (p->c (import-favorites-from-config-edn! db-conn repo config-file)))
+      (async/<! (p->c (gp-exporter/import-class-properties db-conn repo)))
       (log/info :import-file-graph {:msg (str "Import finished in " (/ (t/in-millis (t/interval start-time (t/now))) 1000) " seconds")})
       (state/set-state! :graph/importing nil)
       (state/set-state! :graph/importing-state nil)