Browse Source

Fix property ordering for large property maps

Fixes #4907. Issue was that we were losing sort order by converting a
linked/sorted map to a normal unsorted map.  Also ensure
properties-order is a vec to simplify edn serialization
Gabriel Horner 3 years ago
parent
commit
b1c98ec09c

+ 2 - 3
deps/graph-parser/src/logseq/graph_parser/block.cljs

@@ -198,7 +198,6 @@
   [format properties user-config]
   (when (seq properties)
     (let [properties (seq properties)
-          properties (into {} properties)
           page-refs (get-page-ref-names-from-properties format properties user-config)
           properties (->> properties
                           (map (fn [[k v]]
@@ -512,7 +511,7 @@
                                 :content content
                                 :level 1
                                 :properties properties
-                                :properties-order properties-order
+                                :properties-order (vec properties-order)
                                 :refs property-refs
                                 :pre-block? true
                                 :unordered true
@@ -548,7 +547,7 @@
                 (assoc :properties (:properties properties))
 
                 (seq (:properties-order properties))
-                (assoc :properties-order (:properties-order properties)))
+                (assoc :properties-order (vec (:properties-order properties))))
         block (if (get-in block [:properties :collapsed])
                 (-> (assoc block :collapsed? true)
                     (update :properties (fn [m] (dissoc m :collapsed)))

+ 27 - 0
deps/graph-parser/test/logseq/graph_parser_test.cljs

@@ -1,5 +1,6 @@
 (ns logseq.graph-parser-test
   (:require [cljs.test :refer [deftest testing is]]
+            [clojure.string :as string]
             [logseq.graph-parser :as graph-parser]
             [logseq.db :as ldb]
             [logseq.graph-parser.block :as gp-block]
@@ -41,3 +42,29 @@
           (catch :default _)))
       (is (= nil @deleted-page)
           "Page should not be deleted when there is unexpected failure"))))
+
+(defn- test-property-order [num-properties]
+  (let [conn (ldb/start-conn)
+        properties (mapv #(keyword (str "p" %)) (range 0 num-properties))
+        text (->> properties
+                  (map #(str (name %) ":: " (name %) "-value"))
+                  (string/join "\n"))
+        ;; Test page properties and block properties
+        body (str text "\n- " text)
+        _ (graph-parser/parse-file conn "foo.md" body {})
+        properties-orders (->> (d/q '[:find (pull ?b [*])
+                                      :in $
+                                      :where [?b :block/content] [(missing? $ ?b :block/name)]]
+                                    @conn)
+                               (map first)
+                               (map :block/properties-order))]
+    (is (every? vector? properties-orders)
+        "Order is persisted as a vec to avoid edn serialization quirks")
+    (is (= [properties properties] properties-orders)
+        "Property order")))
+
+(deftest properties-order
+  (testing "Sort order and persistence of a few properties"
+    (test-property-order 4))
+  (testing "Sort order and persistence of 10 properties"
+    (test-property-order 10)))