@@ -261,86 +261,113 @@ Status subarray_to_capnp(
261261 return Status::Ok ();
262262}
263263
264- Status subarray_from_capnp (
265- const capnp::Subarray::Reader& reader, Subarray* subarray) {
266- RETURN_NOT_OK (subarray->set_coalesce_ranges (reader.getCoalesceRanges ()));
264+ Subarray subarray_from_capnp (
265+ const capnp::Subarray::Reader& reader,
266+ const Array* array,
267+ Layout layout,
268+ stats::Stats* parent_stats,
269+ shared_ptr<Logger> logger) {
270+ bool coalesce_ranges = reader.getCoalesceRanges ();
267271 auto ranges_reader = reader.getRanges ();
272+
268273 uint32_t dim_num = ranges_reader.size ();
274+ std::vector<RangeSetAndSuperset> range_subset (dim_num);
275+ std::vector<bool > is_default (dim_num, false );
269276 for (uint32_t i = 0 ; i < dim_num; i++) {
270277 auto range_reader = ranges_reader[i];
271278 Datatype type = Datatype::UINT8;
272- RETURN_NOT_OK (datatype_enum (range_reader.getType (), &type));
279+ throw_if_not_ok (datatype_enum (range_reader.getType (), &type));
280+ auto dim = array->array_schema_latest ().dimension_ptr (i);
273281
274- auto data = range_reader.getBuffer ();
275- auto data_ptr = data.asBytes ();
282+ bool implicitly_initialized = range_reader.getHasDefaultRange ();
283+ range_subset[i] =
284+ RangeSetAndSuperset (dim->type (), dim->domain (), true , coalesce_ranges);
285+ is_default[i] = implicitly_initialized;
276286 if (range_reader.hasBufferSizes ()) {
277287 auto ranges = range_buffers_from_capnp (range_reader);
278- RETURN_NOT_OK (subarray->set_ranges_for_dim (i, ranges));
279-
280- // Set default indicator
281- subarray->set_is_default (i, range_reader.getHasDefaultRange ());
288+ // If the range is implicitly initialized, the RangeSetAndSuperset
289+ // constructor will initialize the ranges to the domain.
290+ if (!implicitly_initialized) {
291+ // Edge case for dimension labels where there are only label ranges set.
292+ if (ranges.empty ()) {
293+ range_subset[i] = RangeSetAndSuperset (
294+ dim->type (), dim->domain (), false , coalesce_ranges);
295+ }
296+ // Add custom ranges, clearing any implicit ranges previously set.
297+ for (const auto & range : ranges) {
298+ throw_if_not_ok (range_subset[i].add_range_unrestricted (range));
299+ }
300+ }
282301 } else {
283302 // Handle 1.7 style ranges where there is a single range with no sizes
303+ auto data = range_reader.getBuffer ();
304+ auto data_ptr = data.asBytes ();
284305 Range range (data_ptr.begin (), data.size ());
285- RETURN_NOT_OK (subarray->set_ranges_for_dim (i, {range}));
286- subarray->set_is_default (i, range_reader.getHasDefaultRange ());
306+ throw_if_not_ok (range_subset[i].add_range_unrestricted (range));
287307 }
288308 }
289309
310+ std::vector<optional<Subarray::LabelRangeSubset>> label_range_subset (
311+ dim_num, nullopt );
290312 if (reader.hasLabelRanges ()) {
291- subarray->add_default_label_ranges (dim_num);
292313 auto label_ranges_reader = reader.getLabelRanges ();
293314 uint32_t label_num = label_ranges_reader.size ();
294315 for (uint32_t i = 0 ; i < label_num; i++) {
295316 auto label_range_reader = label_ranges_reader[i];
296- auto dim_id = label_range_reader.getDimensionId ();
317+ auto dim_index = label_range_reader.getDimensionId ();
318+ auto dim = array->array_schema_latest ().dimension_ptr (dim_index);
297319 auto label_name = label_range_reader.getName ();
298320
299321 // Deserialize ranges for this dim label
300322 auto range_reader = label_range_reader.getRanges ();
301323 auto ranges = range_buffers_from_capnp (range_reader);
302324
303325 // Set ranges for this dim label on the subarray
304- subarray->set_label_ranges_for_dim (dim_id, label_name, ranges);
326+ label_range_subset[dim_index] = {
327+ label_name, dim->type (), coalesce_ranges};
305328 }
306329 }
307330
331+ std::unordered_map<std::string, std::vector<Range>> attr_range_subset;
308332 if (reader.hasAttributeRanges ()) {
309- std::unordered_map<std::string, std::vector<Range>> attr_ranges;
310333 auto attr_ranges_reader = reader.getAttributeRanges ();
311334 if (attr_ranges_reader.hasEntries ()) {
312- for (auto attr_ranges_entry : attr_ranges_reader.getEntries ()) {
313- auto range_reader = attr_ranges_entry.getValue ();
314- auto key = std::string_view{
315- attr_ranges_entry.getKey ().cStr (),
316- attr_ranges_entry.getKey ().size ()};
317- attr_ranges[std::string{key}] = range_buffers_from_capnp (range_reader);
335+ for (auto entry : attr_ranges_reader.getEntries ()) {
336+ auto range_reader = entry.getValue ();
337+ std::string key{entry.getKey ().cStr (), entry.getKey ().size ()};
338+ attr_range_subset[key] = range_buffers_from_capnp (range_reader);
318339 }
319340 }
320-
321- for (const auto & attr_range : attr_ranges)
322- subarray->set_attribute_ranges (attr_range.first , attr_range.second );
323341 }
324342
325343 // If cap'n proto object has stats set it on c++ object
344+ Subarray s (array, layout, parent_stats, logger, true );
326345 if (reader.hasStats ()) {
327346 auto stats_data = stats_from_capnp (reader.getStats ());
328347 subarray->set_stats (stats_data);
329348 }
330349
350+ std::vector<unsigned > relevant_fragments;
331351 if (reader.hasRelevantFragments ()) {
332- auto relevant_fragments = reader.getRelevantFragments ();
333- size_t count = relevant_fragments.size ();
334- std::vector<unsigned > rf;
335- rf.reserve (count);
352+ auto reader_rf = reader.getRelevantFragments ();
353+ size_t count = reader_rf.size ();
354+ relevant_fragments.reserve (count);
336355 for (size_t i = 0 ; i < count; i++) {
337- rf .emplace_back (relevant_fragments [i]);
356+ relevant_fragments .emplace_back (reader_rf [i]);
338357 }
339-
340- subarray->relevant_fragments () = RelevantFragments (rf);
341358 }
342359
343- return Status::Ok ();
360+ return {
361+ array,
362+ layout,
363+ reader.hasStats () ? s.stats () : parent_stats,
364+ logger,
365+ range_subset,
366+ is_default,
367+ label_range_subset,
368+ attr_range_subset,
369+ relevant_fragments,
370+ coalesce_ranges};
344371}
345372
346373Status subarray_partitioner_to_capnp (
@@ -452,8 +479,8 @@ Status subarray_partitioner_from_capnp(
452479 RETURN_NOT_OK (layout_enum (subarray_reader.getLayout (), &layout));
453480
454481 // Subarray, which is used to initialize the partitioner.
455- Subarray subarray (array, layout, query_stats, dummy_logger, true );
456- RETURN_NOT_OK ( subarray_from_capnp (reader. getSubarray (), &subarray) );
482+ Subarray subarray = subarray_from_capnp (
483+ subarray_reader, array, layout, query_stats, dummy_logger );
457484 *partitioner = SubarrayPartitioner (
458485 &config,
459486 subarray,
@@ -510,10 +537,12 @@ Status subarray_partitioner_from_capnp(
510537 partition_info->end_ = partition_info_reader.getEnd ();
511538 partition_info->split_multi_range_ =
512539 partition_info_reader.getSplitMultiRange ();
513- partition_info->partition_ =
514- Subarray (array, layout, query_stats, dummy_logger, true );
515- RETURN_NOT_OK (subarray_from_capnp (
516- partition_info_reader.getSubarray (), &partition_info->partition_ ));
540+ partition_info->partition_ = subarray_from_capnp (
541+ partition_info_reader.getSubarray (),
542+ array,
543+ layout,
544+ query_stats,
545+ dummy_logger);
517546
518547 if (compute_current_tile_overlap) {
519548 throw_if_not_ok (partition_info->partition_ .precompute_tile_overlap (
@@ -533,20 +562,18 @@ Status subarray_partitioner_from_capnp(
533562 auto sr_reader = state_reader.getSingleRange ();
534563 const unsigned num_sr = sr_reader.size ();
535564 for (unsigned i = 0 ; i < num_sr; i++) {
536- auto subarray_reader_ = sr_reader[i];
537- state->single_range_ .emplace_back (
538- array, layout, query_stats, dummy_logger, true );
539- Subarray& subarray_ = state->single_range_ .back ();
540- RETURN_NOT_OK (subarray_from_capnp (subarray_reader_, &subarray_));
565+ auto subarray_reader = sr_reader[i];
566+ Subarray subarray = subarray_from_capnp (
567+ subarray_reader, array, layout, query_stats, dummy_logger);
568+ state->single_range_ .push_back (subarray);
541569 }
542570 auto m_reader = state_reader.getMultiRange ();
543571 const unsigned num_m = m_reader.size ();
544572 for (unsigned i = 0 ; i < num_m; i++) {
545- auto subarray_reader_ = m_reader[i];
546- state->multi_range_ .emplace_back (
547- array, layout, query_stats, dummy_logger, true );
548- Subarray& subarray_ = state->multi_range_ .back ();
549- RETURN_NOT_OK (subarray_from_capnp (subarray_reader_, &subarray_));
573+ auto subarray_reader = m_reader[i];
574+ Subarray subarray = subarray_from_capnp (
575+ subarray_reader, array, layout, query_stats, dummy_logger);
576+ state->multi_range_ .push_back (subarray);
550577 }
551578
552579 // Overall mem budget
@@ -1109,9 +1136,9 @@ Status reader_from_capnp(
11091136 RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
11101137
11111138 // Subarray
1112- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
11131139 auto subarray_reader = reader_reader.getSubarray ();
1114- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1140+ Subarray subarray = subarray_from_capnp (
1141+ subarray_reader, array, layout, query->stats (), dummy_logger);
11151142 RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
11161143
11171144 // Read state
@@ -1147,9 +1174,9 @@ Status index_reader_from_capnp(
11471174 RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
11481175
11491176 // Subarray
1150- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
11511177 auto subarray_reader = reader_reader.getSubarray ();
1152- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1178+ Subarray subarray = subarray_from_capnp (
1179+ subarray_reader, array, layout, query->stats (), dummy_logger);
11531180 RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
11541181
11551182 // Read state
@@ -1186,9 +1213,9 @@ Status dense_reader_from_capnp(
11861213 RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
11871214
11881215 // Subarray
1189- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
11901216 auto subarray_reader = reader_reader.getSubarray ();
1191- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1217+ Subarray subarray = subarray_from_capnp (
1218+ subarray_reader, array, layout, query->stats (), dummy_logger);
11921219 RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
11931220
11941221 // Read state
@@ -2212,9 +2239,9 @@ Status query_from_capnp(
22122239
22132240 // Subarray
22142241 if (writer_reader.hasSubarrayRanges ()) {
2215- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
22162242 auto subarray_reader = writer_reader.getSubarrayRanges ();
2217- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
2243+ Subarray subarray = subarray_from_capnp (
2244+ subarray_reader, array, layout, query->stats (), dummy_logger);
22182245 RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
22192246 }
22202247 }
@@ -3157,9 +3184,9 @@ void ordered_dim_label_reader_from_capnp(
31573184 throw_if_not_ok (layout_enum (reader_reader.getLayout (), &layout));
31583185
31593186 // Subarray
3160- Subarray subarray (array, layout, query->stats (), dummy_logger, false );
31613187 auto subarray_reader = reader_reader.getSubarray ();
3162- throw_if_not_ok (subarray_from_capnp (subarray_reader, &subarray));
3188+ Subarray subarray = subarray_from_capnp (
3189+ subarray_reader, array, layout, query->stats (), dummy_logger);
31633190 throw_if_not_ok (query->set_subarray_unsafe (subarray));
31643191
31653192 // OrderedDimLabelReader requires an initialized subarray for construction.
0 commit comments