@@ -329,6 +329,16 @@ def _update_map_tree_from_offsets(self):
329329 if self ._probe_external_leaf_offset (filepath ):
330330 self .map_tree [self ._logical_key_from_relpath (filepath )] = filepath
331331
332+ def _annotate_external_value (
333+ self ,
334+ key : str ,
335+ value : blosc2 .NDArray | SChunk | blosc2 .VLArray | blosc2 .BatchStore | C2Array ,
336+ ):
337+ """Attach DictStore origin metadata so structured msgpack can preserve member identity."""
338+ value ._msgpack_dictstore_urlpath = self .localpath
339+ value ._msgpack_dictstore_key = key
340+ return value
341+
332342 @property
333343 def estore (self ) -> EmbedStore :
334344 """Access the underlying EmbedStore."""
@@ -416,15 +426,18 @@ def __getitem__(
416426 mmap_mode = self .mmap_mode ,
417427 dparams = self .dparams ,
418428 )
419- return _process_opened_object (opened )
429+ return self . _annotate_external_value ( key , _process_opened_object (opened ) )
420430 else :
421431 urlpath = os .path .join (self .working_dir , filepath )
422432 if os .path .exists (urlpath ):
423- return blosc2 .open (
424- urlpath ,
425- mode = "r" if self .mode == "r" else "a" ,
426- mmap_mode = self .mmap_mode if self .mode == "r" else None ,
427- dparams = self .dparams ,
433+ return self ._annotate_external_value (
434+ key ,
435+ blosc2 .open (
436+ urlpath ,
437+ mode = "r" if self .mode == "r" else "a" ,
438+ mmap_mode = self .mmap_mode if self .mode == "r" else None ,
439+ dparams = self .dparams ,
440+ ),
428441 )
429442 else :
430443 raise KeyError (f"File for key '{ key } ' not found in offsets or temporary directory." )
@@ -487,22 +500,28 @@ def values(self) -> Iterator[blosc2.NDArray | SChunk | C2Array]:
487500 if self .is_zip_store :
488501 if filepath in self .offsets :
489502 offset = self .offsets [filepath ]["offset" ]
490- yield _process_opened_object (
491- blosc2 .blosc2_ext .open (
492- self .b2z_path ,
493- mode = "r" ,
494- offset = offset ,
495- mmap_mode = self .mmap_mode ,
496- dparams = self .dparams ,
497- )
503+ yield self ._annotate_external_value (
504+ key ,
505+ _process_opened_object (
506+ blosc2 .blosc2_ext .open (
507+ self .b2z_path ,
508+ mode = "r" ,
509+ offset = offset ,
510+ mmap_mode = self .mmap_mode ,
511+ dparams = self .dparams ,
512+ )
513+ ),
498514 )
499515 else :
500516 urlpath = os .path .join (self .working_dir , filepath )
501- yield blosc2 .open (
502- urlpath ,
503- mode = "r" if self .mode == "r" else "a" ,
504- mmap_mode = self .mmap_mode if self .mode == "r" else None ,
505- dparams = self .dparams ,
517+ yield self ._annotate_external_value (
518+ key ,
519+ blosc2 .open (
520+ urlpath ,
521+ mode = "r" if self .mode == "r" else "a" ,
522+ mmap_mode = self .mmap_mode if self .mode == "r" else None ,
523+ dparams = self .dparams ,
524+ ),
506525 )
507526 elif key in self ._estore :
508527 yield self ._estore [key ]
@@ -521,25 +540,31 @@ def items(self) -> Iterator[tuple[str, blosc2.NDArray | SChunk | C2Array]]:
521540 offset = self .offsets [filepath ]["offset" ]
522541 yield (
523542 key ,
524- _process_opened_object (
525- blosc2 .blosc2_ext .open (
526- self .b2z_path ,
527- mode = "r" ,
528- offset = offset ,
529- mmap_mode = self .mmap_mode ,
530- dparams = self .dparams ,
531- )
543+ self ._annotate_external_value (
544+ key ,
545+ _process_opened_object (
546+ blosc2 .blosc2_ext .open (
547+ self .b2z_path ,
548+ mode = "r" ,
549+ offset = offset ,
550+ mmap_mode = self .mmap_mode ,
551+ dparams = self .dparams ,
552+ )
553+ ),
532554 ),
533555 )
534556 else :
535557 urlpath = os .path .join (self .working_dir , filepath )
536558 yield (
537559 key ,
538- blosc2 .open (
539- urlpath ,
540- mode = "r" if self .mode == "r" else "a" ,
541- mmap_mode = self .mmap_mode if self .mode == "r" else None ,
542- dparams = self .dparams ,
560+ self ._annotate_external_value (
561+ key ,
562+ blosc2 .open (
563+ urlpath ,
564+ mode = "r" if self .mode == "r" else "a" ,
565+ mmap_mode = self .mmap_mode if self .mode == "r" else None ,
566+ dparams = self .dparams ,
567+ ),
543568 ),
544569 )
545570 elif key in self ._estore :
0 commit comments