@@ -265,89 +265,112 @@ Status subarray_to_capnp(
265
265
return Status::Ok ();
266
266
}
267
267
268
- Status subarray_from_capnp (
269
- const capnp::Subarray::Reader& reader, Subarray* subarray) {
270
- RETURN_NOT_OK (subarray->set_coalesce_ranges (reader.getCoalesceRanges ()));
268
+ Subarray subarray_from_capnp (
269
+ const capnp::Subarray::Reader& reader,
270
+ const Array* array,
271
+ Layout layout,
272
+ stats::Stats* parent_stats,
273
+ shared_ptr<Logger> logger) {
274
+ bool coalesce_ranges = reader.getCoalesceRanges ();
271
275
auto ranges_reader = reader.getRanges ();
276
+
272
277
uint32_t dim_num = ranges_reader.size ();
278
+ std::vector<RangeSetAndSuperset> range_subset (dim_num);
279
+ std::vector<bool > is_default (dim_num, false );
273
280
for (uint32_t i = 0 ; i < dim_num; i++) {
274
281
auto range_reader = ranges_reader[i];
275
282
Datatype type = Datatype::UINT8;
276
- RETURN_NOT_OK (datatype_enum (range_reader.getType (), &type));
283
+ throw_if_not_ok (datatype_enum (range_reader.getType (), &type));
284
+ auto dim = array->array_schema_latest ().dimension_ptr (i);
277
285
278
- auto data = range_reader.getBuffer ();
279
- auto data_ptr = data.asBytes ();
286
+ bool implicitly_initialized = range_reader.getHasDefaultRange ();
287
+ range_subset[i] =
288
+ RangeSetAndSuperset (dim->type (), dim->domain (), true , coalesce_ranges);
289
+ is_default[i] = implicitly_initialized;
280
290
if (range_reader.hasBufferSizes ()) {
281
291
auto ranges = range_buffers_from_capnp (range_reader);
282
- RETURN_NOT_OK (subarray->set_ranges_for_dim (i, ranges));
283
-
284
- // Set default indicator
285
- subarray->set_is_default (i, range_reader.getHasDefaultRange ());
292
+ // If the range is implicitly initialized, the RangeSetAndSuperset
293
+ // constructor will initialize the ranges to the domain.
294
+ if (!implicitly_initialized) {
295
+ // Edge case for dimension labels where there are only label ranges set.
296
+ if (ranges.empty ()) {
297
+ range_subset[i] = RangeSetAndSuperset (
298
+ dim->type (), dim->domain (), false , coalesce_ranges);
299
+ }
300
+ // Add custom ranges, clearing any implicit ranges previously set.
301
+ for (const auto & range : ranges) {
302
+ throw_if_not_ok (range_subset[i].add_range_unrestricted (range));
303
+ }
304
+ }
286
305
} else {
287
306
// Handle 1.7 style ranges where there is a single range with no sizes
307
+ auto data = range_reader.getBuffer ();
308
+ auto data_ptr = data.asBytes ();
288
309
Range range (data_ptr.begin (), data.size ());
289
- RETURN_NOT_OK (subarray->set_ranges_for_dim (i, {range}));
290
- subarray->set_is_default (i, range_reader.getHasDefaultRange ());
310
+ throw_if_not_ok (range_subset[i].add_range_unrestricted (range));
291
311
}
292
312
}
293
313
314
+ std::vector<optional<Subarray::LabelRangeSubset>> label_range_subset (
315
+ dim_num, nullopt);
294
316
if (reader.hasLabelRanges ()) {
295
- subarray->add_default_label_ranges (dim_num);
296
317
auto label_ranges_reader = reader.getLabelRanges ();
297
318
uint32_t label_num = label_ranges_reader.size ();
298
319
for (uint32_t i = 0 ; i < label_num; i++) {
299
320
auto label_range_reader = label_ranges_reader[i];
300
- auto dim_id = label_range_reader.getDimensionId ();
321
+ auto dim_index = label_range_reader.getDimensionId ();
322
+ auto dim = array->array_schema_latest ().dimension_ptr (dim_index);
301
323
auto label_name = label_range_reader.getName ();
302
324
303
325
// Deserialize ranges for this dim label
304
326
auto range_reader = label_range_reader.getRanges ();
305
327
auto ranges = range_buffers_from_capnp (range_reader);
306
328
307
329
// Set ranges for this dim label on the subarray
308
- subarray->set_label_ranges_for_dim (dim_id, label_name, ranges);
330
+ label_range_subset[dim_index] = {
331
+ label_name, dim->type (), coalesce_ranges};
309
332
}
310
333
}
311
334
335
+ std::unordered_map<std::string, std::vector<Range>> attr_range_subset;
312
336
if (reader.hasAttributeRanges ()) {
313
- std::unordered_map<std::string, std::vector<Range>> attr_ranges;
314
337
auto attr_ranges_reader = reader.getAttributeRanges ();
315
338
if (attr_ranges_reader.hasEntries ()) {
316
- for (auto attr_ranges_entry : attr_ranges_reader.getEntries ()) {
317
- auto range_reader = attr_ranges_entry.getValue ();
318
- auto key = std::string_view{
319
- attr_ranges_entry.getKey ().cStr (),
320
- attr_ranges_entry.getKey ().size ()};
321
- attr_ranges[std::string{key}] = range_buffers_from_capnp (range_reader);
339
+ for (auto entry : attr_ranges_reader.getEntries ()) {
340
+ auto range_reader = entry.getValue ();
341
+ std::string key{entry.getKey ().cStr (), entry.getKey ().size ()};
342
+ attr_range_subset[key] = range_buffers_from_capnp (range_reader);
322
343
}
323
344
}
324
-
325
- for (const auto & attr_range : attr_ranges)
326
- subarray->set_attribute_ranges (attr_range.first , attr_range.second );
327
345
}
328
346
329
347
// If cap'n proto object has stats set it on c++ object
348
+ Subarray s (array, layout, parent_stats, logger, true );
330
349
if (reader.hasStats ()) {
331
- stats::Stats* stats = subarray->stats ();
332
- // We should always have a stats here
333
- if (stats != nullptr ) {
334
- RETURN_NOT_OK (stats_from_capnp (reader.getStats (), stats));
335
- }
350
+ throw_if_not_ok (stats_from_capnp (reader.getStats (), s.stats ()));
336
351
}
337
352
353
+ std::vector<unsigned > relevant_fragments;
338
354
if (reader.hasRelevantFragments ()) {
339
- auto relevant_fragments = reader.getRelevantFragments ();
340
- size_t count = relevant_fragments.size ();
341
- std::vector<unsigned > rf;
342
- rf.reserve (count);
355
+ auto reader_rf = reader.getRelevantFragments ();
356
+ size_t count = reader_rf.size ();
357
+ relevant_fragments.reserve (count);
343
358
for (size_t i = 0 ; i < count; i++) {
344
- rf .emplace_back (relevant_fragments [i]);
359
+ relevant_fragments .emplace_back (reader_rf [i]);
345
360
}
346
-
347
- subarray->relevant_fragments () = RelevantFragments (rf);
348
361
}
349
362
350
- return Status::Ok ();
363
+ return {
364
+ array,
365
+ layout,
366
+ reader.hasStats () ? s.stats () : parent_stats,
367
+ logger,
368
+ range_subset,
369
+ is_default,
370
+ label_range_subset,
371
+ attr_range_subset,
372
+ relevant_fragments,
373
+ coalesce_ranges};
351
374
}
352
375
353
376
Status subarray_partitioner_to_capnp (
@@ -461,8 +484,8 @@ Status subarray_partitioner_from_capnp(
461
484
RETURN_NOT_OK (layout_enum (subarray_reader.getLayout (), &layout));
462
485
463
486
// Subarray, which is used to initialize the partitioner.
464
- Subarray subarray (array, layout, query_stats, dummy_logger, true );
465
- RETURN_NOT_OK ( subarray_from_capnp (reader. getSubarray (), &subarray) );
487
+ Subarray subarray = subarray_from_capnp (
488
+ subarray_reader, array, layout, query_stats, dummy_logger );
466
489
*partitioner = SubarrayPartitioner (
467
490
&config,
468
491
subarray,
@@ -519,10 +542,12 @@ Status subarray_partitioner_from_capnp(
519
542
partition_info->end_ = partition_info_reader.getEnd ();
520
543
partition_info->split_multi_range_ =
521
544
partition_info_reader.getSplitMultiRange ();
522
- partition_info->partition_ =
523
- Subarray (array, layout, query_stats, dummy_logger, true );
524
- RETURN_NOT_OK (subarray_from_capnp (
525
- partition_info_reader.getSubarray (), &partition_info->partition_ ));
545
+ partition_info->partition_ = subarray_from_capnp (
546
+ partition_info_reader.getSubarray (),
547
+ array,
548
+ layout,
549
+ query_stats,
550
+ dummy_logger);
526
551
527
552
if (compute_current_tile_overlap) {
528
553
throw_if_not_ok (partition_info->partition_ .precompute_tile_overlap (
@@ -542,20 +567,18 @@ Status subarray_partitioner_from_capnp(
542
567
auto sr_reader = state_reader.getSingleRange ();
543
568
const unsigned num_sr = sr_reader.size ();
544
569
for (unsigned i = 0 ; i < num_sr; i++) {
545
- auto subarray_reader_ = sr_reader[i];
546
- state->single_range_ .emplace_back (
547
- array, layout, query_stats, dummy_logger, true );
548
- Subarray& subarray_ = state->single_range_ .back ();
549
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader_, &subarray_));
570
+ auto subarray_reader = sr_reader[i];
571
+ Subarray subarray = subarray_from_capnp (
572
+ subarray_reader, array, layout, query_stats, dummy_logger);
573
+ state->single_range_ .push_back (subarray);
550
574
}
551
575
auto m_reader = state_reader.getMultiRange ();
552
576
const unsigned num_m = m_reader.size ();
553
577
for (unsigned i = 0 ; i < num_m; i++) {
554
- auto subarray_reader_ = m_reader[i];
555
- state->multi_range_ .emplace_back (
556
- array, layout, query_stats, dummy_logger, true );
557
- Subarray& subarray_ = state->multi_range_ .back ();
558
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader_, &subarray_));
578
+ auto subarray_reader = m_reader[i];
579
+ Subarray subarray = subarray_from_capnp (
580
+ subarray_reader, array, layout, query_stats, dummy_logger);
581
+ state->multi_range_ .push_back (subarray);
559
582
}
560
583
561
584
// Overall mem budget
@@ -1131,9 +1154,9 @@ Status reader_from_capnp(
1131
1154
RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
1132
1155
1133
1156
// Subarray
1134
- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
1135
1157
auto subarray_reader = reader_reader.getSubarray ();
1136
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1158
+ Subarray subarray = subarray_from_capnp (
1159
+ subarray_reader, array, layout, query->stats (), dummy_logger);
1137
1160
RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
1138
1161
1139
1162
// Read state
@@ -1173,9 +1196,9 @@ Status index_reader_from_capnp(
1173
1196
RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
1174
1197
1175
1198
// Subarray
1176
- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
1177
1199
auto subarray_reader = reader_reader.getSubarray ();
1178
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1200
+ Subarray subarray = subarray_from_capnp (
1201
+ subarray_reader, array, layout, query->stats (), dummy_logger);
1179
1202
RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
1180
1203
1181
1204
// Read state
@@ -1216,9 +1239,9 @@ Status dense_reader_from_capnp(
1216
1239
RETURN_NOT_OK (layout_enum (reader_reader.getLayout (), &layout));
1217
1240
1218
1241
// Subarray
1219
- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
1220
1242
auto subarray_reader = reader_reader.getSubarray ();
1221
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
1243
+ Subarray subarray = subarray_from_capnp (
1244
+ subarray_reader, array, layout, query->stats (), dummy_logger);
1222
1245
RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
1223
1246
1224
1247
// Read state
@@ -2257,9 +2280,9 @@ Status query_from_capnp(
2257
2280
2258
2281
// Subarray
2259
2282
if (writer_reader.hasSubarrayRanges ()) {
2260
- Subarray subarray (array, layout, query->stats (), dummy_logger, true );
2261
2283
auto subarray_reader = writer_reader.getSubarrayRanges ();
2262
- RETURN_NOT_OK (subarray_from_capnp (subarray_reader, &subarray));
2284
+ Subarray subarray = subarray_from_capnp (
2285
+ subarray_reader, array, layout, query->stats (), dummy_logger);
2263
2286
RETURN_NOT_OK (query->set_subarray_unsafe (subarray));
2264
2287
}
2265
2288
}
@@ -3207,9 +3230,9 @@ void ordered_dim_label_reader_from_capnp(
3207
3230
throw_if_not_ok (layout_enum (reader_reader.getLayout (), &layout));
3208
3231
3209
3232
// Subarray
3210
- Subarray subarray (array, layout, query->stats (), dummy_logger, false );
3211
3233
auto subarray_reader = reader_reader.getSubarray ();
3212
- throw_if_not_ok (subarray_from_capnp (subarray_reader, &subarray));
3234
+ Subarray subarray = subarray_from_capnp (
3235
+ subarray_reader, array, layout, query->stats (), dummy_logger);
3213
3236
throw_if_not_ok (query->set_subarray_unsafe (subarray));
3214
3237
3215
3238
// OrderedDimLabelReader requires an initialized subarray for construction.
0 commit comments