瀏覽代碼

enhance: give partial exports reliable page sort order

Could be useful as partial exports are used more often
Gabriel Horner 6 月之前
父節點
當前提交
99331545c4
共有 2 個文件被更改,包括 33 次插入23 次删除
  1. 17 13
      deps/db/src/logseq/db/sqlite/export.cljs
  2. 16 10
      deps/db/test/logseq/db/sqlite/export_test.cljs

+ 17 - 13
deps/db/src/logseq/db/sqlite/export.cljs

@@ -395,12 +395,26 @@
      :classes (apply merge (map :classes uuid-block-pages))
      :pages-and-blocks (mapv #(select-keys % [:page :blocks]) uuid-block-pages)}))
 
+(defn sort-pages-and-blocks
+  "Provide a reliable sort order since this tends to be large. Helps with diffing
+   and readability"
+  [pages-and-blocks]
+  (vec
+   (sort-by #(or (get-in % [:page :block/title])
+                 (some-> (get-in % [:page :build/journal]) str)
+                 (str (get-in % [:page :block/uuid])))
+            pages-and-blocks)))
+
 (defn- finalize-export-maps
-  "Given final export maps, merges them, adds any missing class parents and merges those in"
+  "Given final export maps, merges them, adds any missing class parents and merges those in.
+   If :pages-and-blocks exist, sorts them in order to have reliable sort order"
   [db & export-maps]
   (let [final-export* (apply merge-export-maps export-maps)
-        class-parents-export (some->> (:classes final-export*) (build-class-parents-export db))]
-    (merge-export-maps final-export* class-parents-export)))
+        class-parents-export (some->> (:classes final-export*) (build-class-parents-export db))
+        merged-map (merge-export-maps final-export* class-parents-export)]
+    (cond-> merged-map
+      (:pages-and-blocks merged-map)
+      (update :pages-and-blocks sort-pages-and-blocks))))
 
 (defn- build-block-export
   "Exports block for given block eid"
@@ -660,16 +674,6 @@
                            :blocks (sqlite-build/update-each-block blocks remove-uuid-if-not-ref)})
                         pages-and-blocks))))))
 
-(defn sort-pages-and-blocks
-  "Provide a reliable sort order since this tends to be large. Helps with diffing
-   and readability"
-  [pages-and-blocks]
-  (vec
-   (sort-by #(or (get-in % [:page :block/title])
-                 (some-> (get-in % [:page :build/journal]) str)
-                 (str (get-in % [:page :block/uuid])))
-            pages-and-blocks)))
-
 (defn- add-ontology-for-include-namespaces
   "Adds :properties to export for given namespace parents. Current use case is for :exclude-namespaces
    so no need to add :classes yet"

+ 16 - 10
deps/db/test/logseq/db/sqlite/export_test.cljs

@@ -57,17 +57,21 @@
     (sqlite-export/build-export @import-conn {:export-type :page :page-id (:db/id page2)})))
 
 (defn- import-second-time-assertions [conn conn2 page-title original-data
-                                      & {:keys [transform-expected-blocks]
+                                      & {:keys [transform-expected-blocks build-journal]
                                          :or {transform-expected-blocks (fn [bs] (into bs bs))}}]
   (let [page (db-test/find-page-by-title @conn2 page-title)
         imported-page (export-page-and-import-to-another-graph conn conn2 page-title)
         updated-page (db-test/find-page-by-title @conn2 page-title)
         expected-page-and-blocks
-        (update-in (:pages-and-blocks original-data) [0 :blocks] transform-expected-blocks)]
+        (update-in (:pages-and-blocks original-data) [0 :blocks] transform-expected-blocks)
+        filter-imported-page (if build-journal
+                               #(= build-journal (get-in % [:page :build/journal]))
+                               #(= (get-in % [:page :block/title]) page-title))]
 
+    (assert (first expected-page-and-blocks))
     ;; Assume first page is one being imported for now
     (is (= (first expected-page-and-blocks)
-           (first (:pages-and-blocks imported-page)))
+           (first (filter filter-imported-page (:pages-and-blocks imported-page))))
         "Blocks are appended to existing page")
     (is (= (:block/created-at page) (:block/created-at updated-page))
         "Existing page didn't get re-created")
@@ -323,7 +327,8 @@
     (is (= (-> (:pages-and-blocks original-data)
                (medley/dissoc-in [1 :blocks 0 :build/properties])
                ;; shallow block means this page doesn't get included
-               butlast)
+               butlast
+               sort-pages-and-blocks)
            (:pages-and-blocks imported-page))
         "Page's blocks are imported")
 
@@ -412,7 +417,7 @@
     (is (= (:pages-and-blocks original-data) (:pages-and-blocks imported-page))
         "Page's blocks are imported")
 
-    (import-second-time-assertions conn conn2 journal-title original-data)))
+    (import-second-time-assertions conn conn2 journal-title original-data {:build-journal 20250210})))
 
 (deftest import-page-with-different-property-types
   (let [block-object-uuid (random-uuid)
@@ -458,7 +463,8 @@
         "Page's classes are imported")
     (is (= (-> (:pages-and-blocks original-data)
                ;; adjust shallow block
-               (medley/dissoc-in [1 :blocks 0 :build/tags]))
+               (medley/dissoc-in [1 :blocks 0 :build/tags])
+               sort-pages-and-blocks)
            (:pages-and-blocks imported-page))
         "Page's blocks are imported")
 
@@ -527,7 +533,7 @@
         imported-nodes (sqlite-export/build-export @conn2 {:export-type :view-nodes
                                                            :node-ids (get-node-ids @conn2)})]
 
-    (is (= (:pages-and-blocks original-data) (:pages-and-blocks imported-nodes)))
+    (is (= (sort-pages-and-blocks (:pages-and-blocks original-data)) (:pages-and-blocks imported-nodes)))
     (is (= (expand-properties (:properties original-data)) (:properties imported-nodes)))
     (is (= (expand-classes (:classes original-data)) (:classes imported-nodes)))))
 
@@ -562,9 +568,9 @@
         _ (validate-db @conn2)
         imported-nodes (sqlite-export/build-export @conn2 {:export-type :selected-nodes :node-ids (get-node-ids @conn2)})]
 
-    (is (= (set (->> (:pages-and-blocks original-data)
-                     (map #(if (= (get-in % [:page :block/title]) "page2") (dissoc % :blocks) %))))
-           (set (:pages-and-blocks imported-nodes))))
+    (is (= (->> (:pages-and-blocks original-data)
+                (map #(if (= (get-in % [:page :block/title]) "page2") (dissoc % :blocks) %)))
+           (:pages-and-blocks imported-nodes)))
     (is (= (expand-properties (:properties original-data)) (:properties imported-nodes)))
     (is (= (expand-classes (:classes original-data)) (:classes imported-nodes)))))