Skip to content

Commit 755dafd

Browse files
committed
slice with comparator in btset.cljs
1 parent 68d2d3b commit 755dafd

3 files changed

Lines changed: 56 additions & 50 deletions

File tree

src/datascript/btset.clj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
(ns ^{:no-doc true
22
:author "Nikita Prokopov"}
33
datascript.btset
4-
(:refer-clojure :exclude [iter])
54
(:import
65
[java.util Comparator]
76
[datascript SortedSet]))

src/datascript/btset.cljs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -823,17 +823,17 @@
823823
(defn -seek
824824
"Returns path to first element >= key,
825825
or -1 if all elements in a set < key"
826-
[set key]
826+
[set key comparator]
827827
(loop [node (.-root set)
828828
path empty-path
829829
level (.-shift set)]
830830
(let [keys-l (node-len node)]
831831
(if (== 0 level)
832832
(let [keys (.-keys node)
833-
idx (binary-search-l (.-comparator set) keys (dec keys-l) key)]
833+
idx (binary-search-l comparator keys (dec keys-l) key)]
834834
(if (== keys-l idx) -1 (path-set path 0 idx)))
835835
(let [keys (.-keys node)
836-
idx (binary-search-l (.-comparator set) keys (- keys-l 2) key)]
836+
idx (binary-search-l comparator keys (- keys-l 2) key)]
837837
(recur (da/aget (.-pointers node) idx)
838838
(path-set path level idx)
839839
(- level level-shift)))))))
@@ -842,40 +842,47 @@
842842
"Returns path to the first element that is > key.
843843
If all elements in a set are <= key, returns `(-rpath set) + 1`.
844844
It’s a virtual path that is bigger than any path in a tree"
845-
[set key]
845+
[set key comparator]
846846
(loop [node (.-root set)
847847
path empty-path
848848
level (.-shift set)]
849849
(let [keys-l (node-len node)]
850850
(if (== 0 level)
851851
(let [keys (.-keys node)
852-
idx (binary-search-r (.-comparator set) keys (dec keys-l) key)]
852+
idx (binary-search-r comparator keys (dec keys-l) key)]
853853
(path-set path 0 idx))
854854
(let [keys (.-keys node)
855-
idx (binary-search-r (.-comparator set) keys (- keys-l 2) key)]
855+
idx (binary-search-r comparator keys (- keys-l 2) key)]
856856
(recur (da/aget (.-pointers node) idx)
857857
(path-set path level idx)
858858
(- level level-shift)))))))
859859

860-
(defn -slice [set key-from key-to]
861-
(let [path (-seek set key-from)]
860+
(defn -slice [set key-from key-to comparator]
861+
(let [path (-seek set key-from comparator)]
862862
(when-not (neg? path)
863-
(let [till-path (-rseek set key-to)]
863+
(let [till-path (-rseek set key-to comparator)]
864864
(when (> till-path path)
865865
(Iter. set path till-path (keys-for set path) (path-get path 0)))))))
866866

867867
(defn slice
868868
"When called with single key, returns iterator over set that contains all elements equal to the key.
869869
When called with two keys (range), returns iterator for all X where key-from <= X <= key-to"
870-
([set key] (slice set key key))
870+
([set key]
871+
(-slice set key key (.-comparator set)))
871872
([set key-from key-to]
872-
(-slice set key-from key-to)))
873+
(-slice set key-from key-to (.-comparator set)))
874+
([set key-from key-to comparator]
875+
(-slice set key-from key-to comparator)))
873876

874877
(defn rslice
875878
"`(rslice set from to)` returns backwards iterator for all Xs where from <= X <= to.
876879
`(rslice set from nil)` returns backwards iterator for all Xs where X <= from."
877-
[set key-from key-to]
878-
(some-> (-slice set key-to key-from) rseq))
880+
([set key]
881+
(some-> (-slice set key key (.-comparator set)) rseq))
882+
([set key-from key-to]
883+
(some-> (-slice set key-to key-from (.-comparator set)) rseq))
884+
([set key-from key-to comparator]
885+
(some-> (-slice set key-to key-from comparator) rseq)))
879886

880887
;; public interface
881888

src/datascript/db.cljc

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -438,42 +438,42 @@
438438

439439
ISearch
440440
(-search [db pattern]
441-
(let [[e a v tx] pattern
442-
eavt (.-eavt db)
443-
aevt (.-aevt db)
444-
avet (.-avet db)]
445-
(case-tree [e a (some? v) tx]
446-
[(btset/slice eavt (Datom. e a v tx nil)) ;; e a v tx
447-
(btset/slice eavt (Datom. e a v nil nil)) ;; e a v _
448-
(->> (btset/slice eavt (Datom. e a nil nil nil)) ;; e a _ tx
449-
(filter (fn [^Datom d] (= tx (.-tx d)))))
450-
(btset/slice eavt (Datom. e a nil nil nil)) ;; e a _ _
451-
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ v tx
452-
(filter (fn [^Datom d] (and (= v (.-v d))
453-
(= tx (.-tx d))))))
454-
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ v _
455-
(filter (fn [^Datom d] (= v (.-v d)))))
456-
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ _ tx
457-
(filter (fn [^Datom d] (= tx (.-tx d)))))
458-
(btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ _ _
459-
(if (indexing? db a) ;; _ a v tx
460-
(->> (btset/slice avet (Datom. nil a v nil nil))
461-
(filter (fn [^Datom d] (= tx (.-tx d)))))
462-
(->> (btset/slice aevt (Datom. nil a nil nil nil))
463-
(filter (fn [^Datom d] (and (= v (.-v d))
464-
(= tx (.-tx d)))))))
465-
(if (indexing? db a) ;; _ a v _
466-
(btset/slice avet (Datom. nil a v nil nil))
467-
(->> (btset/slice aevt (Datom. nil a nil nil nil))
468-
(filter (fn [^Datom d] (= v (.-v d))))))
469-
(->> (btset/slice aevt (Datom. nil a nil nil nil)) ;; _ a _ tx
470-
(filter (fn [^Datom d] (= tx (.-tx d)))))
471-
(btset/slice aevt (Datom. nil a nil nil nil)) ;; _ a _ _
472-
(filter (fn [^Datom d] (and (= v (.-v d))
473-
(= tx (.-tx d)))) eavt) ;; _ _ v tx
474-
(filter (fn [^Datom d] (= v (.-v d))) eavt) ;; _ _ v _
475-
(filter (fn [^Datom d] (= tx (.-tx d))) eavt) ;; _ _ _ tx
476-
eavt]))) ;; _ _ _ _
441+
(let [[e a v tx] pattern
442+
eavt (.-eavt db)
443+
aevt (.-aevt db)
444+
avet (.-avet db)]
445+
(case-tree [e a (some? v) tx]
446+
[(btset/slice eavt (Datom. e a v tx nil)) ;; e a v tx
447+
(btset/slice eavt (Datom. e a v nil nil)) ;; e a v _
448+
(->> (btset/slice eavt (Datom. e a nil nil nil)) ;; e a _ tx
449+
(filter (fn [^Datom d] (= tx (.-tx d)))))
450+
(btset/slice eavt (Datom. e a nil nil nil)) ;; e a _ _
451+
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ v tx
452+
(filter (fn [^Datom d] (and (= v (.-v d))
453+
(= tx (.-tx d))))))
454+
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ v _
455+
(filter (fn [^Datom d] (= v (.-v d)))))
456+
(->> (btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ _ tx
457+
(filter (fn [^Datom d] (= tx (.-tx d)))))
458+
(btset/slice eavt (Datom. e nil nil nil nil)) ;; e _ _ _
459+
(if (indexing? db a) ;; _ a v tx
460+
(->> (btset/slice avet (Datom. nil a v nil nil))
461+
(filter (fn [^Datom d] (= tx (.-tx d)))))
462+
(->> (btset/slice aevt (Datom. nil a nil nil nil))
463+
(filter (fn [^Datom d] (and (= v (.-v d))
464+
(= tx (.-tx d)))))))
465+
(if (indexing? db a) ;; _ a v _
466+
(btset/slice avet (Datom. nil a v nil nil))
467+
(->> (btset/slice aevt (Datom. nil a nil nil nil))
468+
(filter (fn [^Datom d] (= v (.-v d))))))
469+
(->> (btset/slice aevt (Datom. nil a nil nil nil)) ;; _ a _ tx
470+
(filter (fn [^Datom d] (= tx (.-tx d)))))
471+
(btset/slice aevt (Datom. nil a nil nil nil)) ;; _ a _ _
472+
(filter (fn [^Datom d] (and (= v (.-v d))
473+
(= tx (.-tx d)))) eavt) ;; _ _ v tx
474+
(filter (fn [^Datom d] (= v (.-v d))) eavt) ;; _ _ v _
475+
(filter (fn [^Datom d] (= tx (.-tx d))) eavt) ;; _ _ _ tx
476+
eavt]))) ;; _ _ _ _
477477

478478
IIndexAccess
479479
(-datoms [db index cs]

0 commit comments

Comments
 (0)