Explorar o código

fix: generate n keys for fractional index

Tienson Qin hai 1 ano
pai
achega
976e5c2f6b

+ 25 - 8
deps/common/src/logseq/common/fractional_index.cljs

@@ -153,11 +153,28 @@
 (defn generate-n-keys-between
   [a b n & {:keys [digits]
             :or {digits base-62-digits}}]
-  (cond
-    (= n 0) []
-    (= n 1) [(generate-key-between a b digits)]
-    :else (let [c (generate-key-between a b digits)]
-            (concat
-             (generate-n-keys-between a c (Math/floor (/ n 2)) digits)
-             [c]
-             (generate-n-keys-between c b (- n (Math/floor (/ n 2)) 1) digits)))))
+  (let [result (cond
+                 (= n 0) []
+                 (= n 1) [(generate-key-between a b digits)]
+                 (nil? b) (reduce
+                           (fn [col _]
+                             (let [k (generate-key-between (or (last col) a) b {:digits digits})]
+                               (conj col k)))
+                           []
+                           (range n))
+                 (nil? a) (->>
+                           (reduce
+                            (fn [col _]
+                              (let [k (generate-key-between a (or (last col) b) {:digits digits})]
+                                (conj col k)))
+                            []
+                            (range n))
+                           (reverse)
+                           (vec))
+                 :else (let [mid (Math/floor (/ n 2))
+                             c (generate-key-between a b digits)]
+                         (concat
+                          (generate-n-keys-between a c mid digits)
+                          [c]
+                          (generate-n-keys-between c b mid digits))))]
+    (vec (take n result))))

+ 67 - 39
deps/common/test/logseq/common/fractional_index_test.cljs

@@ -18,45 +18,73 @@
   (are [x y]
        (= (index/generate-n-keys-between (first x) (second x) 20) y)
     ["ZxV" "Zy7"]
-    ["ZxX"
-     "ZxZ"
-     "Zxd"
-     "Zxf"
-     "Zxh"
-     "Zxl"
-     "Zxn"
-     "Zxp"
-     "Zxt"
-     "Zxx"
-     "Zy"
-     "Zy0V"
-     "Zy1"
-     "Zy2"
-     "Zy3"
-     "Zy4"
-     "Zy4V"
-     "Zy5"
-     "Zy6"
-     "Zy6V"]
+    ["ZxX" "ZxZ" "Zxd" "Zxf" "Zxh" "Zxl" "Zxn" "Zxp" "Zxt" "Zxv" "Zy" "Zy0V" "Zy1" "Zy2" "Zy2V" "Zy3" "Zy4" "Zy4V" "Zy5" "Zy6"]
 
     ["Zy7" "axV"]
-    ["ZyB"
-     "ZyE"
-     "ZyL"
-     "ZyP"
-     "ZyS"
-     "ZyZ"
-     "Zyd"
-     "Zyg"
-     "Zyn"
-     "Zyu"
-     "Zz"
-     "Zz8"
-     "ZzG"
-     "ZzV"
-     "Zzl"
-     "a0"
-     "a0G"
-     "a0V"
+    ["ZyB" "ZyE" "ZyL" "ZyP" "ZyS" "ZyZ" "Zyd" "Zyg" "Zyn" "Zyr" "Zz" "Zz8" "ZzG" "ZzV" "Zzd" "Zzl" "a0" "a0G" "a0V" "a1"]
+
+    [nil "c0a3"]
+    ["aG"
+     "aH"
+     "aI"
+     "aJ"
+     "aK"
+     "aL"
+     "aM"
+     "aN"
+     "aO"
+     "aP"
+     "aQ"
+     "aR"
+     "aS"
+     "aT"
+     "aU"
+     "aV"
+     "aW"
+     "b0X"
+     "bY1"
+     "b2Z"]
+
+    ["c0a3" nil]
+    ["c0a4"
+     "c0a5"
+     "c0a6"
+     "c0a7"
+     "c0a8"
+     "c0a9"
+     "c0aA"
+     "c0aB"
+     "c0aC"
+     "c0aD"
+     "c0aE"
+     "c0aF"
+     "c0aG"
+     "c0aH"
+     "c0aI"
+     "c0aJ"
+     "c0aK"
+     "c0aL"
+     "c0aM"
+     "c0aN"]
+
+    [nil nil]
+    ["a0"
      "a1"
-     "a2"]))
+     "a2"
+     "a3"
+     "a4"
+     "a5"
+     "a6"
+     "a7"
+     "a8"
+     "a9"
+     "aA"
+     "aB"
+     "aC"
+     "aD"
+     "aE"
+     "aF"
+     "aG"
+     "aH"
+     "aI"
+     "aJ"]))