|
|
@@ -204,6 +204,8 @@ impl<R: Read + Seek> IndexedReader<R> {
|
|
204
|
204
|
if info.blob_type == SimpleBlobType::Primitive {
|
|
205
|
205
|
if let Some(node_id_range) = info.id_ranges.as_ref().and_then(|r| r.node_ids.as_ref()) {
|
|
206
|
206
|
if range_included(node_id_range.clone(), &node_ids) {
|
|
|
207
|
+ //TODO Only collect into Vec if range has a reasonable size
|
|
|
208
|
+ let node_ids: Vec<i64> = node_ids.range(node_id_range.clone()).map(|x| *x).collect();
|
|
207
|
209
|
self.reader.seek(info.offset)?;
|
|
208
|
210
|
let blob = self.reader.next().ok_or_else(|| {
|
|
209
|
211
|
::std::io::Error::new(
|
|
|
@@ -214,13 +216,13 @@ impl<R: Read + Seek> IndexedReader<R> {
|
|
214
|
216
|
let block = blob.to_primitiveblock()?;
|
|
215
|
217
|
for group in block.groups() {
|
|
216
|
218
|
for node in group.nodes() {
|
|
217
|
|
- if node_ids.contains(&node.id()) {
|
|
|
219
|
+ if node_ids.binary_search(&node.id()).is_ok() {
|
|
218
|
220
|
// ID found, return node
|
|
219
|
221
|
element_callback(&Element::Node(node));
|
|
220
|
222
|
}
|
|
221
|
223
|
}
|
|
222
|
224
|
for node in group.dense_nodes() {
|
|
223
|
|
- if node_ids.contains(&node.id) {
|
|
|
225
|
+ if node_ids.binary_search(&node.id).is_ok() {
|
|
224
|
226
|
// ID found, return dense node
|
|
225
|
227
|
element_callback(&Element::DenseNode(node));
|
|
226
|
228
|
}
|