Skip to content

Commit a8fc294

Browse files
author
Rosnec
committed
Wrote map-subset and map-equals functions, which return true if
the given map is a subset or equal to the B+ Tree, else nil. Very useful for unit tests.
1 parent 8c08510 commit a8fc294

File tree

4 files changed

+48
-20
lines changed

4 files changed

+48
-20
lines changed

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(defproject b-plus-tree "0.1.4"
1+
(defproject b-plus-tree "0.1.5"
22
:description "A B+ Tree implemented in Clojure."
33
:url "https://github.com/Rosnec/b-plus-tree"
44
:license {:name "MIT License"

src/b_plus_tree/core.clj

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@
153153
[nil, cache])))
154154

155155
(defn find-stack
156-
"Returns the value associated with key by traversing the entire tree, or
156+
"Returns the record associated with key by traversing the entire tree, or
157157
nil if not found, building a stack of visited nodes during the process."
158158
([key raf {cnt :count, size :key-size, root-ptr :root :as header} &
159159
{:keys [cache]
@@ -165,7 +165,7 @@
165165
(find-type-stack key #{:record} root [] raf
166166
:cache cache)]
167167
; (println "herp" [record stack cache])
168-
[(when record (:data record)), stack, cache])
168+
[record, stack, cache])
169169
[nil, [], cache])))
170170

171171
(defn insert-record
@@ -208,9 +208,13 @@
208208
:cache cache)
209209
leaf (last stack)]
210210
(cond
211-
; record already exists, do nothing
212-
record ;[header, cache]
213-
(throw (ex-info "repeat" {}))
211+
; record already exists, overwrite
212+
record
213+
[header, (cache-node (assoc record
214+
:data val
215+
:altered? true)
216+
raf
217+
cache)]
214218

215219
; leaf is full, split
216220
(b-plus-tree.nodes/full? leaf order)
@@ -243,6 +247,25 @@
243247
(recur (next keyvals) raf header {:cache cache}))
244248
[header cache])))
245249

250+
(defn map-subset
251+
"Returns true if m is a subset of the B+ Tree"
252+
([m raf header
253+
& {:keys [cache]
254+
:or {cache {}}}]
255+
(every? identity (map (fn [[k v]] (= v (first (find k raf header
256+
:cache cache))))
257+
m))))
258+
259+
(defn map-equals
260+
([m raf
261+
{size :count
262+
:as header}
263+
& {:keys [cache]
264+
:or {cache {}}}]
265+
(when (= size (count m))
266+
(map-subset m raf header
267+
:cache cache))))
268+
246269
; problem: I am re-writing the root on disc, but then using the same
247270
; in-memory root every time
248271
(comment

src/b_plus_tree/io.clj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,5 @@
135135
(defn write-cache
136136
([cache raf]
137137
(let [nodes (vals cache)
138-
_ (println "nodes:" nodes)
139-
altered-nodes (filter :altered? nodes)
140-
_ (println "altered:" altered-nodes)]
138+
altered-nodes (filter :altered? nodes)]
141139
(doall (map #(write-node % raf) altered-nodes)))))

test/b_plus_tree/insert_test.clj

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,24 @@
2828
(b-plus-tree.io/new-tree "/tmp/RAF" order key-size val-size)
2929
(with-open [raf (new java.io.RandomAccessFile "/tmp/RAF" "rwd")]
3030
(let [header (b-plus-tree.io/read-header raf)
31-
keyvals (apply sorted-map (map str (-> order (* 2) range)))
31+
keyvals1 (apply sorted-map (map str (-> order (* 2) range)))
32+
keyvals2 (reduce (fn [m [k v]] (assoc m k (str v 2)))
33+
(sorted-map)
34+
keyvals1)
3235
[header cache]
33-
(b-plus-tree.core/insert-all keyvals raf header)]
36+
(b-plus-tree.core/insert-all keyvals1 raf header)]
37+
; confirming that all entries can be found in the cache
38+
(is (b-plus-tree.core/map-equals keyvals1 raf header
39+
:cache cache))
40+
; writing cache to disc
3441
(b-plus-tree.io/write-cache cache raf)
35-
(loop [keyvals keyvals]
36-
(if-let [entry (first keyvals)]
37-
(let [[key val] entry
38-
[cached-data cache] (b-plus-tree.core/find key raf header
39-
:cache cache)
40-
[uncached-data cache] (b-plus-tree.core/find key
41-
raf header)]
42-
(is (= val cached-data uncached-data))
43-
(recur (next keyvals)))))))
42+
; confirming that all entries can be found on disc
43+
(is (b-plus-tree.core/map-equals keyvals1 raf header))
44+
; overwriting all entries, and running the same checks
45+
(let [[header cache]
46+
(b-plus-tree.core/insert-all keyvals2 raf header)]
47+
(is (b-plus-tree.core/map-equals keyvals2 raf header
48+
:cache cache))
49+
(b-plus-tree.io/write-cache cache raf)
50+
(is (b-plus-tree.core/map-equals keyvals2 raf header)))))
4451
(io/delete-file "/tmp/RAF" true)))

0 commit comments

Comments
 (0)