@@ -248,16 +248,19 @@ impl<
248248
249249 let mut results = Vec :: new ( ) ;
250250
251- for index in 0 ..= node. page . len ( ) {
251+ for index in 0 ..node. page . len ( ) {
252252 let child = node. child ( index) ?;
253253
254- if node. page . len ( ) / 2 == index {
255- results. extend ( node. page . values ( ) ?) ;
256- }
257-
258254 if let Some ( child) = child {
259255 results. extend ( self . cells_from_subtree ( child) ?)
260256 }
257+
258+ results. extend ( node. page . read ( index) ?) ;
259+ }
260+
261+ let right = node. child ( node. page . len ( ) ) ?;
262+ if let Some ( right) = right {
263+ results. extend ( self . cells_from_subtree ( right) ?)
261264 }
262265
263266 Ok ( results)
@@ -290,10 +293,10 @@ impl<
290293 let page = node. page . compact ( ) ?;
291294
292295 self . io
293- . write_page ( page_number . into ( ) , & page)
296+ . write_page ( search . page . into ( ) , & page)
294297 . map_err ( Error :: IoError ) ?;
295298
296- self . borrow_if_needed ( page_number , parents, key)
299+ self . borrow_if_needed ( search . page , parents, key)
297300 }
298301
299302 fn borrow_if_needed (
@@ -326,42 +329,56 @@ impl<
326329 Either :: Left ( index) => index,
327330 Either :: Right ( index) => index,
328331 } ;
332+ let sibling_index = match index > 0 {
333+ false => index + 1 ,
334+ true => index - 1 ,
335+ } ;
329336
330- let sibling_index = if index > 0 { index - 1 } else { index + 1 } ;
331- let mut cell = parent. page . read ( sibling_index) ?. unwrap ( ) ;
337+ let sibling_page_index = parent. child ( sibling_index) ?. unwrap ( ) ;
332338
333339 let sibling: BTreeNode < K , V > = self
334340 . io
335- . read_page ( cell . left_child . unwrap ( ) . into ( ) )
341+ . read_page ( sibling_page_index . into ( ) )
336342 . map_err ( Error :: IoError ) ?
337343 . try_into ( ) ?;
338- let merged_node_idx = cmp:: min ( index, sibling_index) ;
339-
340- let mut merged_node = node. merge ( sibling) ?;
341344
342- cell . left_child = merged_node . header . right_child ;
345+ let merged_node_idx = cmp :: min ( index , sibling_index ) ;
343346
344- parent. page . delete ( sibling_index) ?;
347+ let cell = parent. page . read ( merged_node_idx) ?. unwrap ( ) ;
348+ parent. page . delete ( merged_node_idx) ?;
345349 let mut parent: BTreeNode < K , V > = parent. page . compact ( ) ?. try_into ( ) ?;
346350
347- merged_node. page . insert ( merged_node_idx , cell) ?;
351+ let mut merged_node = node . merge ( sibling , cell) ?;
348352
349353 let merged_page_index = self
350354 . io
351355 . write_new_page ( & merged_node. page )
352356 . map_err ( Error :: IoError ) ?;
353357
354- if parent. header . kind == PageType :: Root && parent. page . is_empty ( ) {
358+ if parent. is_root ( ) && parent. page . is_empty ( ) {
359+ merged_node. header . kind = PageType :: Root ;
360+ merged_node
361+ . page
362+ . write_special ( & merged_node. header . to_bytes ( ) ) ?;
363+
364+ self . io
365+ . write_page ( merged_page_index. into ( ) , & merged_node. page )
366+ . map_err ( Error :: IoError ) ?;
367+
355368 self . root = merged_page_index
356369 } else {
357- parent. set_child ( sibling_index , merged_page_index) ?;
370+ parent. set_child ( merged_node_idx , merged_page_index) ?;
358371 }
359372
360373 self . io
361374 . write_page ( parent_index. into ( ) , & parent. page )
362375 . map_err ( Error :: IoError ) ?;
363376
364- self . borrow_if_needed ( parents. pop ( ) . unwrap ( ) , parents, key)
377+ if let Some ( parent) = parents. pop ( ) {
378+ self . borrow_if_needed ( parent, parents, key) ?;
379+ }
380+
381+ Ok ( ( ) )
365382 }
366383}
367384
0 commit comments