@@ -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