MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / str_pack

Function str_pack

nodedb-spatial/src/rtree/bulk_load.rs:63–107  ·  view source on GitHub ↗

Recursively pack entries into leaf nodes, then group into internal nodes.

(nodes: &mut Vec<Node>, mut entries: Vec<RTreeEntry>)

Source from the content-addressed store, hash-verified

61
62/// Recursively pack entries into leaf nodes, then group into internal nodes.
63fn str_pack(nodes: &mut Vec<Node>, mut entries: Vec<RTreeEntry>) -> usize {
64 if entries.len() <= LEAF_CAPACITY {
65 let mut node = Node::new_leaf();
66 if let NodeKind::Leaf {
67 entries: ref mut leaf,
68 } = node.kind
69 {
70 *leaf = entries;
71 }
72 node.recompute_bbox();
73 let idx = nodes.len();
74 nodes.push(node);
75 return idx;
76 }
77
78 let num_leaves = entries.len().div_ceil(LEAF_CAPACITY);
79 let num_slices = (num_leaves as f64).sqrt().ceil() as usize;
80 let slice_size = entries.len().div_ceil(num_slices);
81
82 // Sort by longitude (X).
83 entries.sort_by(|a, b| {
84 let ca = (a.bbox.min_lng + a.bbox.max_lng) / 2.0;
85 let cb = (b.bbox.min_lng + b.bbox.max_lng) / 2.0;
86 ca.partial_cmp(&cb).unwrap_or(std::cmp::Ordering::Equal)
87 });
88
89 let mut child_nodes: Vec<usize> = Vec::new();
90
91 for slice in entries.chunks(slice_size) {
92 let mut slice_vec: Vec<RTreeEntry> = slice.to_vec();
93 // Sort each slice by latitude (Y).
94 slice_vec.sort_by(|a, b| {
95 let ca = (a.bbox.min_lat + a.bbox.max_lat) / 2.0;
96 let cb = (b.bbox.min_lat + b.bbox.max_lat) / 2.0;
97 ca.partial_cmp(&cb).unwrap_or(std::cmp::Ordering::Equal)
98 });
99
100 for chunk in slice_vec.chunks(LEAF_CAPACITY) {
101 let child_idx = str_pack(nodes, chunk.to_vec());
102 child_nodes.push(child_idx);
103 }
104 }
105
106 pack_internal(nodes, child_nodes)
107}
108
109/// Recursively group child node indices into internal nodes.
110fn pack_internal(nodes: &mut Vec<Node>, child_indices: Vec<usize>) -> usize {

Callers 1

bulk_load_innerMethod · 0.85

Calls 6

pack_internalFunction · 0.85
recompute_bboxMethod · 0.80
lenMethod · 0.45
pushMethod · 0.45
partial_cmpMethod · 0.45
to_vecMethod · 0.45

Tested by

no test coverage detected