@@ -388,6 +388,8 @@ void FragmentMetadata::set_tile_global_order_bounds_fixed(
388388 loaded_metadata_ptr_->tile_global_order_max_buffer ()[dim].data ();
389389 memcpy (&max_data[offset], tile_max.value ().data (), fixed_size);
390390 }
391+
392+ has_tile_global_order_bounds_ = true ;
391393}
392394
393395/* *
@@ -1321,7 +1323,7 @@ void FragmentMetadata::store_v15_or_higher(
13211323 }
13221324
13231325 if (!dense_ &&
1324- version_ >= constants::fragment_metadata_global_order_bounds_version ) {
1326+ version_ >= constants::fragment_metadata_data_directory_version ) {
13251327 const auto num_dims = array_schema_->dim_num ();
13261328 // Store global order mins
13271329 gt_offsets_.tile_global_order_min_offsets_ .resize (num_dims);
@@ -1846,6 +1848,10 @@ void FragmentMetadata::write_footer(Serializer& serializer) const {
18461848 write_file_var_sizes (serializer);
18471849 write_file_validity_sizes (serializer);
18481850 write_generic_tile_offsets (serializer);
1851+
1852+ if (version_ >= constants::fragment_metadata_data_directory_version) {
1853+ write_data_directories (serializer);
1854+ }
18491855}
18501856
18511857/* ****************************** */
@@ -2395,10 +2401,8 @@ void FragmentMetadata::load_generic_tile_offsets(Deserializer& deserializer) {
23952401 load_generic_tile_offsets_v11 (deserializer);
23962402 } else if (version_ >= 12 && version_ < 16 ) {
23972403 load_generic_tile_offsets_v12_v15 (deserializer);
2398- } else if (version_ >= 16 && version_ < 23 ) {
2399- load_generic_tile_offsets_v16_v22 (deserializer);
24002404 } else {
2401- load_generic_tile_offsets_v23_or_higher (deserializer);
2405+ load_generic_tile_offsets_v16_or_higher (deserializer);
24022406 }
24032407}
24042408
@@ -2552,7 +2556,7 @@ void FragmentMetadata::load_generic_tile_offsets_v12_v15(
25522556 deserializer.read <uint64_t >();
25532557}
25542558
2555- void FragmentMetadata::load_generic_tile_offsets_v16_v22 (
2559+ void FragmentMetadata::load_generic_tile_offsets_v16_or_higher (
25562560 Deserializer& deserializer) {
25572561 // Load R-Tree offset
25582562 gt_offsets_.rtree_ = deserializer.read <uint64_t >();
@@ -2598,63 +2602,41 @@ void FragmentMetadata::load_generic_tile_offsets_v16_v22(
25982602 gt_offsets_.processed_conditions_offsets_ = deserializer.read <uint64_t >();
25992603}
26002604
2601- void FragmentMetadata::load_generic_tile_offsets_v23_or_higher (
2602- Deserializer& deserializer) {
2603- // Load R-Tree offset
2604- gt_offsets_.rtree_ = deserializer.read <uint64_t >();
2605-
2606- // Load offsets for tile offsets
2607- auto num = num_dims_and_attrs ();
2608- gt_offsets_.tile_offsets_ .resize (num);
2609- deserializer.read (>_offsets_.tile_offsets_ [0 ], num * sizeof (uint64_t ));
2610-
2611- // Load offsets for tile var offsets
2612- gt_offsets_.tile_var_offsets_ .resize (num);
2613- deserializer.read (>_offsets_.tile_var_offsets_ [0 ], num * sizeof (uint64_t ));
2605+ void FragmentMetadata::load_data_directories (Deserializer& deserializer) {
2606+ auto count = deserializer.read <uint32_t >();
26142607
2615- // Load offsets for tile var sizes
2616- gt_offsets_.tile_var_sizes_ .resize (num);
2617- deserializer.read (>_offsets_.tile_var_sizes_ [0 ], num * sizeof (uint64_t ));
2618-
2619- // Load offsets for tile validity offsets
2620- gt_offsets_.tile_validity_offsets_ .resize (num);
2621- deserializer.read (
2622- >_offsets_.tile_validity_offsets_ [0 ], num * sizeof (uint64_t ));
2623-
2624- // Load offsets for tile min offsets
2625- gt_offsets_.tile_min_offsets_ .resize (num);
2626- deserializer.read (>_offsets_.tile_min_offsets_ [0 ], num * sizeof (uint64_t ));
2627-
2628- // Load offsets for tile max offsets
2629- gt_offsets_.tile_max_offsets_ .resize (num);
2630- deserializer.read (>_offsets_.tile_max_offsets_ [0 ], num * sizeof (uint64_t ));
2631-
2632- if (!dense_) {
2633- // Load offsets for the tile global order bounds
2634- const auto num_dims = array_schema_->dim_num ();
2635- gt_offsets_.tile_global_order_min_offsets_ .resize (num_dims);
2636- gt_offsets_.tile_global_order_max_offsets_ .resize (num_dims);
2637- deserializer.read (
2638- gt_offsets_.tile_global_order_min_offsets_ .data (),
2639- num_dims * sizeof (uint64_t ));
2640- deserializer.read (
2641- gt_offsets_.tile_global_order_max_offsets_ .data (),
2642- num_dims * sizeof (uint64_t ));
2608+ for (uint32_t i = 0 ; i < count; i++) {
2609+ auto identifier = deserializer.read <DataDirectoryIdentifier>();
2610+ auto data_size = deserializer.read <uint32_t >();
2611+ switch (identifier) {
2612+ case DataDirectoryIdentifier::tile_global_order_offsets:
2613+ if (data_size != 2 * array_schema_->dim_num () * sizeof (uint64_t )) {
2614+ throw FragmentMetadataStatusException (
2615+ " Invalid size of tile global order bound offsets data directory" );
2616+ }
2617+ load_tile_global_order_offsets (deserializer);
2618+ has_tile_global_order_bounds_ = true ;
2619+ break ;
2620+ default :
2621+ // Ignore unknown data directories per the storage format spec.
2622+ deserializer.skip (data_size);
2623+ break ;
2624+ }
26432625 }
2626+ }
26442627
2645- // Load offsets for tile sum offsets
2646- gt_offsets_. tile_sum_offsets_ . resize (num);
2647- deserializer. read (>_offsets_. tile_sum_offsets_ [ 0 ], num * sizeof ( uint64_t ));
2648-
2649- // Load offsets for tile null count offsets
2650- gt_offsets_.tile_null_count_offsets_ .resize (num );
2628+ void FragmentMetadata::load_tile_global_order_offsets (
2629+ Deserializer& deserializer) {
2630+ // Load offsets for the tile global order bounds
2631+ const auto num_dims = array_schema_-> dim_num ();
2632+ gt_offsets_. tile_global_order_min_offsets_ . resize (num_dims);
2633+ gt_offsets_.tile_global_order_max_offsets_ .resize (num_dims );
26512634 deserializer.read (
2652- >_offsets_.tile_null_count_offsets_ [0 ], num * sizeof (uint64_t ));
2653-
2654- gt_offsets_.fragment_min_max_sum_null_count_offset_ =
2655- deserializer.read <uint64_t >();
2656-
2657- gt_offsets_.processed_conditions_offsets_ = deserializer.read <uint64_t >();
2635+ gt_offsets_.tile_global_order_min_offsets_ .data (),
2636+ num_dims * sizeof (uint64_t ));
2637+ deserializer.read (
2638+ gt_offsets_.tile_global_order_max_offsets_ .data (),
2639+ num_dims * sizeof (uint64_t ));
26582640}
26592641
26602642void FragmentMetadata::load_array_schema_name (Deserializer& deserializer) {
@@ -2803,6 +2785,10 @@ void FragmentMetadata::load_footer(
28032785
28042786 load_generic_tile_offsets (deserializer);
28052787
2788+ if (version_ >= 23 ) {
2789+ load_data_directories (deserializer);
2790+ }
2791+
28062792 // If the footer_size is not set lets calculate from how much of the
28072793 // buffer we read
28082794 if (footer_size_ == 0 ) {
@@ -2883,18 +2869,6 @@ void FragmentMetadata::write_generic_tile_offsets(
28832869 serializer.write (>_offsets_.tile_max_offsets_ [0 ], num * sizeof (uint64_t ));
28842870 }
28852871
2886- if (!dense_ &&
2887- version_ >= constants::fragment_metadata_global_order_bounds_version) {
2888- // Write the tile global order bound offsets
2889- const auto num_dims = array_schema_->dim_num ();
2890- serializer.write (
2891- gt_offsets_.tile_global_order_min_offsets_ .data (),
2892- num_dims * sizeof (uint64_t ));
2893- serializer.write (
2894- gt_offsets_.tile_global_order_max_offsets_ .data (),
2895- num_dims * sizeof (uint64_t ));
2896- }
2897-
28982872 // Write tile sum offsets
28992873 if (version_ >= 11 ) {
29002874 serializer.write (>_offsets_.tile_sum_offsets_ [0 ], num * sizeof (uint64_t ));
@@ -2916,6 +2890,29 @@ void FragmentMetadata::write_generic_tile_offsets(
29162890 }
29172891}
29182892
2893+ void FragmentMetadata::write_data_directories (Serializer& serializer) const {
2894+ uint32_t count = 0 ;
2895+
2896+ if (has_tile_global_order_bounds_) {
2897+ count++;
2898+ }
2899+
2900+ serializer.write (count);
2901+
2902+ if (has_tile_global_order_bounds_) {
2903+ serializer.write (DataDirectoryIdentifier::tile_global_order_offsets);
2904+ const auto num_dims = array_schema_->dim_num ();
2905+ serializer.write <uint32_t >(2 * num_dims * sizeof (uint64_t ));
2906+
2907+ serializer.write (
2908+ gt_offsets_.tile_global_order_min_offsets_ .data (),
2909+ num_dims * sizeof (uint64_t ));
2910+ serializer.write (
2911+ gt_offsets_.tile_global_order_max_offsets_ .data (),
2912+ num_dims * sizeof (uint64_t ));
2913+ }
2914+ }
2915+
29192916void FragmentMetadata::write_array_schema_name (Serializer& serializer) const {
29202917 uint64_t size = array_schema_name_.size ();
29212918 if (size == 0 ) {
0 commit comments