Skip to content

Commit ad3c185

Browse files
authored
Avoid panic for rtree with one item (#91)
1 parent d3bebbd commit ad3c185

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/rtree/builder.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ impl<N: IndexableNum> RTreeBuilder<N> {
142142

143143
let (boxes, mut indices) = split_data_borrow(&mut self.data, &self.metadata);
144144

145+
if self.metadata.num_items() == 1 {
146+
// Only one item, we don't even have a root node to fill
147+
return RTree {
148+
buffer: self.data,
149+
metadata: self.metadata,
150+
};
151+
}
152+
145153
if self.metadata.num_items() as usize <= self.metadata.node_size() as usize {
146154
// only one node, skip sorting and just fill the root box
147155
boxes[self.pos] = self.min_x;
@@ -242,3 +250,20 @@ fn split_data_borrow<'a, N: IndexableNum>(
242250
let indices = MutableIndices::new(indices_buf, metadata.num_nodes());
243251
(boxes, indices)
244252
}
253+
254+
#[cfg(test)]
255+
mod test {
256+
use crate::rtree::sort::HilbertSort;
257+
use crate::rtree::RTreeIndex;
258+
259+
use super::*;
260+
261+
#[test]
262+
fn does_not_panic_length_1_tree() {
263+
let mut builder = RTreeBuilder::<f64>::new(1);
264+
builder.add(-20., -20., 1020., 1020.);
265+
let tree = builder.finish::<HilbertSort>();
266+
let result = tree.search(0., 0., 0., 0.);
267+
assert_eq!(result, vec![0]);
268+
}
269+
}

0 commit comments

Comments
 (0)