Skip to content

Commit d566ce5

Browse files
shaunrd0KiterLuc
authored andcommitted
Add C.41 Subarray constructor
+ Unstatus subarray_from_capnp
1 parent c49c13b commit d566ce5

File tree

5 files changed

+196
-104
lines changed

5 files changed

+196
-104
lines changed

test/support/src/serialization_wrappers.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,15 @@ void tiledb_subarray_serialize(
204204
.ok());
205205
// Deserialize
206206
tiledb_subarray_t* deserialized_subarray;
207+
auto layout = (*subarray)->subarray_->layout();
208+
auto stats = (*subarray)->subarray_->stats();
209+
shared_ptr<Logger> dummy_logger = make_shared<Logger>(HERE(), "");
210+
207211
tiledb::test::require_tiledb_ok(
208212
ctx, tiledb_subarray_alloc(ctx, array, &deserialized_subarray));
209-
REQUIRE(tiledb::sm::serialization::subarray_from_capnp(
210-
builder, deserialized_subarray->subarray_)
211-
.ok());
213+
*deserialized_subarray->subarray_ =
214+
tiledb::sm::serialization::subarray_from_capnp(
215+
builder, array->array_.get(), layout, stats, dummy_logger);
212216
*subarray = deserialized_subarray;
213217
#endif
214218
}

tiledb/sm/serialization/query.cc

Lines changed: 86 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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

346373
Status 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.

tiledb/sm/serialization/query.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,12 @@ Status subarray_to_capnp(
251251
const Subarray* subarray,
252252
capnp::Subarray::Builder* builder);
253253

254-
Status subarray_from_capnp(
255-
const capnp::Subarray::Reader& reader, Subarray* subarray);
254+
Subarray subarray_from_capnp(
255+
const capnp::Subarray::Reader& reader,
256+
const Array* array,
257+
Layout layout,
258+
stats::Stats* parent_stats,
259+
shared_ptr<Logger> logger);
256260

257261
void ordered_dim_label_reader_to_capnp(
258262
const Query& query,

tiledb/sm/subarray/subarray.cc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,32 @@ Subarray::Subarray(
150150
add_default_ranges();
151151
}
152152

153+
Subarray::Subarray(
154+
const Array* array,
155+
Layout layout,
156+
stats::Stats* stats,
157+
shared_ptr<Logger> logger,
158+
std::vector<RangeSetAndSuperset> range_subset,
159+
std::vector<bool> is_default,
160+
std::vector<optional<Subarray::LabelRangeSubset>> label_range_subset,
161+
std::unordered_map<std::string, std::vector<Range>> attr_range_subset,
162+
std::vector<unsigned int> relevant_fragments,
163+
bool coalesce_ranges)
164+
: stats_(stats)
165+
, logger_(std::move(logger))
166+
, array_(array->opened_array())
167+
, layout_(layout)
168+
, cell_order_(array_->array_schema_latest().cell_order())
169+
, range_subset_(std::move(range_subset))
170+
, label_range_subset_(std::move(label_range_subset))
171+
, attr_range_subset_(std::move(attr_range_subset))
172+
, is_default_(std::move(is_default))
173+
, est_result_size_computed_(false)
174+
, relevant_fragments_(relevant_fragments)
175+
, coalesce_ranges_(coalesce_ranges)
176+
, ranges_sorted_(false) {
177+
}
178+
153179
Subarray::Subarray(const Subarray& subarray)
154180
: Subarray() {
155181
// Make a deep-copy clone

0 commit comments

Comments
 (0)