@@ -2,10 +2,12 @@ use std::ops::Range;
22
33use bytes:: Bytes ;
44use futures:: { StreamExt , TryStreamExt } ;
5+ use hashbrown:: hash_map:: RawEntryMut ;
56use object_store:: path:: Path ;
67use object_store:: { ObjectMeta , ObjectStore } ;
78use polars_core:: prelude:: { InitHashMaps , PlHashMap } ;
89use polars_error:: { PolarsError , PolarsResult } ;
10+ use polars_utils:: mmap:: MemSlice ;
911use tokio:: io:: { AsyncSeekExt , AsyncWriteExt } ;
1012
1113use crate :: pl_async:: {
@@ -214,14 +216,11 @@ impl PolarsObjectStore {
214216 ///
215217 /// # Panics
216218 /// Panics if the same range start is used by more than 1 range.
217- pub async fn get_ranges_sort <
218- K : TryFrom < usize , Error = impl std:: fmt:: Debug > + std:: hash:: Hash + Eq ,
219- T : From < Bytes > ,
220- > (
219+ pub async fn get_ranges_sort (
221220 & self ,
222221 path : & Path ,
223222 ranges : & mut [ Range < usize > ] ,
224- ) -> PolarsResult < PlHashMap < K , T > > {
223+ ) -> PolarsResult < PlHashMap < usize , MemSlice > > {
225224 if ranges. is_empty ( ) {
226225 return Ok ( Default :: default ( ) ) ;
227226 }
@@ -280,16 +279,23 @@ impl PolarsObjectStore {
280279
281280 assert_eq ! ( bytes. len( ) , full_range. len( ) ) ;
282281
282+ let bytes = MemSlice :: from_bytes ( bytes) ;
283+
283284 for range in & ranges[ current_offset..end] {
284- let v = out. insert (
285- K :: try_from ( range. start ) . unwrap ( ) ,
286- T :: from ( bytes. slice (
287- range. start - full_range. start
288- ..range. end - full_range. start ,
289- ) ) ,
285+ let mem_slice = bytes. slice (
286+ range. start - full_range. start ..range. end - full_range. start ,
290287 ) ;
291288
292- assert ! ( v. is_none( ) ) ; // duplicate range start
289+ match out. raw_entry_mut ( ) . from_key ( & range. start ) {
290+ RawEntryMut :: Vacant ( slot) => {
291+ slot. insert ( range. start , mem_slice) ;
292+ } ,
293+ RawEntryMut :: Occupied ( mut slot) => {
294+ if slot. get_mut ( ) . len ( ) < mem_slice. len ( ) {
295+ * slot. get_mut ( ) = mem_slice;
296+ }
297+ } ,
298+ }
293299 }
294300
295301 current_offset = end;
0 commit comments