Skip to content

Commit 8b6501e

Browse files
authored
Add more fields to Query Plan capnp and other improvements. (#4633)
This PR includes some fixes to the cap'n proto design of Query Plan : - Add as many fields as possible to the cap'n proto model, so that we don't rely on their availability on the client - Do not display `VFS.Backend` field in JSON for remote arrays - Remove `query_plan` toggle from `query_from_capnp`, and replace with generic `allocate_buffers` flag that transfers the responsibility of deciding if query buffers should be allocated to the caller and removes magic `true`/`false` values from the code. (+ small fixes to array directory serialization that I stumbled upon) --- TYPE: NO_HISTORY DESC: Add more fields to Query Plan capnp and other improvements
1 parent 6f0a211 commit 8b6501e

File tree

10 files changed

+602
-119
lines changed

10 files changed

+602
-119
lines changed

tiledb/sm/filesystem/uri.cc

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -327,13 +327,7 @@ std::string URI::to_path(const std::string& uri) {
327327

328328
std::string URI::backend_name() const {
329329
if (is_tiledb(uri_)) {
330-
std::string array_ns, array_uri;
331-
throw_if_not_ok(URI(uri_).get_rest_components(&array_ns, &array_uri));
332-
auto prefix = array_uri.substr(0, array_uri.find_first_of(':'));
333-
if (prefix == array_uri) { // no `:` separator found in URI
334-
prefix = "Unknown";
335-
}
336-
return prefix;
330+
return "";
337331
} else {
338332
return uri_.substr(0, uri_.find_first_of(':'));
339333
}

tiledb/sm/query_plan/query_plan.cc

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,14 @@ namespace sm {
4848
/* ********************************* */
4949
/* CONSTRUCTORS & DESTRUCTORS */
5050
/* ********************************* */
51-
QueryPlan::QueryPlan(Query& query, std::string strategy) {
51+
QueryPlan::QueryPlan(Query& query) {
5252
array_uri_ = query.array()->array_uri().to_string();
5353
vfs_backend_ = URI(array_uri_).backend_name();
5454
query_layout_ = query.layout();
5555

56-
if (strategy.empty()) {
57-
// This most probably ends up creating the strategy on the query
58-
auto strategy_ptr = query.strategy();
59-
strategy_name_ = strategy_ptr->name();
60-
} else {
61-
strategy_name_ = strategy;
62-
}
56+
// This most probably ends up creating the strategy on the query
57+
auto strategy_ptr = query.strategy();
58+
strategy_name_ = strategy_ptr->name();
6359

6460
array_type_ = query.array()->array_schema_latest().array_type();
6561

@@ -78,19 +74,47 @@ QueryPlan::QueryPlan(Query& query, std::string strategy) {
7874
std::sort(dimensions_.begin(), dimensions_.end());
7975
}
8076

77+
QueryPlan::QueryPlan(
78+
Query& query,
79+
Layout layout,
80+
const std::string& strategy_name,
81+
ArrayType array_type,
82+
const std::vector<std::string>& attributes,
83+
const std::vector<std::string>& dimensions)
84+
: array_uri_{query.array()->array_uri().to_string()}
85+
, vfs_backend_{URI(array_uri_).backend_name()}
86+
, query_layout_{layout}
87+
, strategy_name_{strategy_name}
88+
, array_type_{array_type}
89+
, attributes_{attributes}
90+
, dimensions_{dimensions} {
91+
}
92+
8193
/* ********************************* */
8294
/* API */
8395
/* ********************************* */
8496
std::string QueryPlan::dump_json(uint32_t indent) {
85-
nlohmann::json rv = {
86-
{"TileDB Query Plan",
87-
{{"Array.URI", array_uri_},
88-
{"Array.Type", array_type_str(array_type_)},
89-
{"VFS.Backend", vfs_backend_},
90-
{"Query.Layout", layout_str(query_layout_)},
91-
{"Query.Strategy.Name", strategy_name_},
92-
{"Query.Attributes", attributes_},
93-
{"Query.Dimensions", dimensions_}}}};
97+
nlohmann::json rv;
98+
if (!URI(array_uri_).is_tiledb()) {
99+
rv = {
100+
{"TileDB Query Plan",
101+
{{"Array.URI", array_uri_},
102+
{"Array.Type", array_type_str(array_type_)},
103+
{"VFS.Backend", vfs_backend_},
104+
{"Query.Layout", layout_str(query_layout_)},
105+
{"Query.Strategy.Name", strategy_name_},
106+
{"Query.Attributes", attributes_},
107+
{"Query.Dimensions", dimensions_}}}};
108+
} else {
109+
rv = {
110+
{"TileDB Query Plan",
111+
{{"Array.URI", array_uri_},
112+
{"Array.Type", array_type_str(array_type_)},
113+
{"Query.Layout", layout_str(query_layout_)},
114+
{"Query.Strategy.Name", strategy_name_},
115+
{"Query.Attributes", attributes_},
116+
{"Query.Dimensions", dimensions_}}}};
117+
}
94118

95119
return rv.dump(indent);
96120
}

tiledb/sm/query_plan/query_plan.h

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,26 @@ class QueryPlan {
6565
* Constructor
6666
*
6767
* @param query A query object for which we want to calculate the plan
68-
* @param strategy The strategy of the query, required only for remote queries
6968
*/
70-
QueryPlan(Query& query, const std::string strategy = "");
69+
QueryPlan(Query& query);
70+
71+
/**
72+
* Constructor
73+
*
74+
* @param query A query object for which we want to calculate the plan.
75+
* @param layout The query layout.
76+
* @param strategy_name The name of the strategy the query uses.
77+
* @param array_type The type of the array.
78+
* @param attributes The attribute names set in the query.
79+
* @param dimensions The dimension names set in the query.
80+
*/
81+
QueryPlan(
82+
Query& query,
83+
Layout layout,
84+
const std::string& strategy_name,
85+
ArrayType array_type,
86+
const std::vector<std::string>& attributes,
87+
const std::vector<std::string>& dimensions);
7188

7289
/* ****************************** */
7390
/* API */
@@ -83,12 +100,40 @@ class QueryPlan {
83100
std::string dump_json(uint32_t indent = 4);
84101

85102
/*
86-
* Get the strategy name stored in the query plan
103+
* Get the query layout stored in the query plan.
104+
*/
105+
inline Layout query_layout() const {
106+
return query_layout_;
107+
}
108+
109+
/*
110+
* Get the strategy name stored in the query plan.
87111
*/
88112
inline std::string strategy() const {
89113
return strategy_name_;
90114
}
91115

116+
/*
117+
* Get the array type stored in the query plan.
118+
*/
119+
inline ArrayType array_type() const {
120+
return array_type_;
121+
}
122+
123+
/*
124+
* Get the attribute names stored in the query plan.
125+
*/
126+
inline std::vector<std::string> attributes() const {
127+
return attributes_;
128+
}
129+
130+
/*
131+
* Get the dimension names stored in the query plan.
132+
*/
133+
inline std::vector<std::string> dimensions() const {
134+
return dimensions_;
135+
}
136+
92137
private:
93138
/* ****************************** */
94139
/* PRIVATE ATTRIBUTES */

tiledb/sm/serialization/array_directory.cc

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -239,29 +239,33 @@ shared_ptr<ArrayDirectory> array_directory_from_capnp(
239239

240240
// Get unfiltered fragment uris
241241
if (array_directory_reader.hasUnfilteredFragmentUris()) {
242-
for (auto uri : array_directory_reader.getUnfilteredFragmentUris()) {
243-
array_directory->unfiltered_fragment_uris().reserve(
244-
array_directory_reader.getUnfilteredFragmentUris().size());
242+
auto unfiltered_fragment_uris =
243+
array_directory_reader.getUnfilteredFragmentUris();
244+
array_directory->unfiltered_fragment_uris().reserve(
245+
unfiltered_fragment_uris.size());
246+
for (auto uri : unfiltered_fragment_uris) {
245247
array_directory->unfiltered_fragment_uris().emplace_back(
246248
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
247249
}
248250
}
249251

250252
// Get consolidated commit uris
251253
if (array_directory_reader.hasConsolidatedCommitUris()) {
252-
for (auto uri : array_directory_reader.getConsolidatedCommitUris()) {
253-
array_directory->consolidated_commit_uris_set().reserve(
254-
array_directory_reader.getConsolidatedCommitUris().size());
254+
auto consolidated_commit_uris =
255+
array_directory_reader.getConsolidatedCommitUris();
256+
array_directory->consolidated_commit_uris_set().reserve(
257+
consolidated_commit_uris.size());
258+
for (auto uri : consolidated_commit_uris) {
255259
array_directory->consolidated_commit_uris_set().emplace(
256260
deserialize_array_uri_to_absolute(uri.cStr(), array_uri).to_string());
257261
}
258262
}
259263

260264
// Get array schema uris
261265
if (array_directory_reader.hasArraySchemaUris()) {
262-
for (auto uri : array_directory_reader.getArraySchemaUris()) {
263-
array_directory->array_schema_uris().reserve(
264-
array_directory_reader.getArraySchemaUris().size());
266+
auto array_schema_uris = array_directory_reader.getArraySchemaUris();
267+
array_directory->array_schema_uris().reserve(array_schema_uris.size());
268+
for (auto uri : array_schema_uris) {
265269
array_directory->array_schema_uris().emplace_back(
266270
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
267271
}
@@ -277,60 +281,68 @@ shared_ptr<ArrayDirectory> array_directory_from_capnp(
277281

278282
// Get array meta uris to vacuum
279283
if (array_directory_reader.hasArrayMetaUrisToVacuum()) {
280-
for (auto uri : array_directory_reader.getArrayMetaUrisToVacuum()) {
281-
array_directory->array_meta_uris_to_vacuum().reserve(
282-
array_directory_reader.getArrayMetaUrisToVacuum().size());
284+
auto array_meta_uris_to_vacuum =
285+
array_directory_reader.getArrayMetaUrisToVacuum();
286+
array_directory->array_meta_uris_to_vacuum().reserve(
287+
array_meta_uris_to_vacuum.size());
288+
for (auto uri : array_meta_uris_to_vacuum) {
283289
array_directory->array_meta_uris_to_vacuum().emplace_back(
284290
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
285291
}
286292
}
287293

288294
// Get array meta vac uris to vacuum
289295
if (array_directory_reader.hasArrayMetaVacUrisToVacuum()) {
290-
for (auto uri : array_directory_reader.getArrayMetaVacUrisToVacuum()) {
291-
array_directory->array_meta_vac_uris_to_vacuum().reserve(
292-
array_directory_reader.getArrayMetaVacUrisToVacuum().size());
296+
auto array_meta_vac_uris_to_vacuum =
297+
array_directory_reader.getArrayMetaVacUrisToVacuum();
298+
array_directory->array_meta_vac_uris_to_vacuum().reserve(
299+
array_meta_vac_uris_to_vacuum.size());
300+
for (auto uri : array_meta_vac_uris_to_vacuum) {
293301
array_directory->array_meta_vac_uris_to_vacuum().emplace_back(
294302
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
295303
}
296304
}
297305

298306
// Get commit uris to consolidate
299307
if (array_directory_reader.hasCommitUrisToConsolidate()) {
300-
for (auto uri : array_directory_reader.getCommitUrisToConsolidate()) {
301-
array_directory->commit_uris_to_consolidate().reserve(
302-
array_directory_reader.getCommitUrisToConsolidate().size());
308+
auto commit_uris_to_consolidate =
309+
array_directory_reader.getCommitUrisToConsolidate();
310+
array_directory->commit_uris_to_consolidate().reserve(
311+
commit_uris_to_consolidate.size());
312+
for (auto uri : commit_uris_to_consolidate) {
303313
array_directory->commit_uris_to_consolidate().emplace_back(
304314
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
305315
}
306316
}
307317

308318
// Get commit uris to vacuum
309319
if (array_directory_reader.hasCommitUrisToVacuum()) {
310-
for (auto uri : array_directory_reader.getCommitUrisToVacuum()) {
311-
array_directory->commit_uris_to_vacuum().reserve(
312-
array_directory_reader.getCommitUrisToVacuum().size());
320+
auto commit_uris_to_vacuum = array_directory_reader.getCommitUrisToVacuum();
321+
array_directory->commit_uris_to_vacuum().reserve(
322+
commit_uris_to_vacuum.size());
323+
for (auto uri : commit_uris_to_vacuum) {
313324
array_directory->commit_uris_to_vacuum().emplace_back(
314325
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
315326
}
316327
}
317328

318329
// Get consolidated commit uris to vacuum
319330
if (array_directory_reader.hasConsolidatedCommitUrisToVacuum()) {
320-
for (auto uri :
321-
array_directory_reader.getConsolidatedCommitUrisToVacuum()) {
322-
array_directory->consolidated_commits_uris_to_vacuum().reserve(
323-
array_directory_reader.getConsolidatedCommitUrisToVacuum().size());
331+
auto consolidated_commits_uris_to_vacuum =
332+
array_directory_reader.getConsolidatedCommitUrisToVacuum();
333+
array_directory->consolidated_commits_uris_to_vacuum().reserve(
334+
consolidated_commits_uris_to_vacuum.size());
335+
for (auto uri : consolidated_commits_uris_to_vacuum) {
324336
array_directory->consolidated_commits_uris_to_vacuum().emplace_back(
325337
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
326338
}
327339
}
328340

329341
// Get array meta uris
330342
if (array_directory_reader.hasArrayMetaUris()) {
331-
for (auto timestamp_reader : array_directory_reader.getArrayMetaUris()) {
332-
array_directory->array_meta_uris().reserve(
333-
array_directory_reader.getArrayMetaUris().size());
343+
auto array_meta_uris = array_directory_reader.getArrayMetaUris();
344+
array_directory->array_meta_uris().reserve(array_meta_uris.size());
345+
for (auto timestamp_reader : array_meta_uris) {
334346
array_directory->array_meta_uris().emplace_back(
335347
URI(deserialize_array_uri_to_absolute(
336348
timestamp_reader.getUri().cStr(), array_uri)),
@@ -342,20 +354,21 @@ shared_ptr<ArrayDirectory> array_directory_from_capnp(
342354

343355
// Get fragment meta uris
344356
if (array_directory_reader.hasFragmentMetaUris()) {
345-
for (auto uri : array_directory_reader.getFragmentMetaUris()) {
346-
array_directory->fragment_meta_uris().reserve(
347-
array_directory_reader.getFragmentMetaUris().size());
357+
auto fragment_meta_uris = array_directory_reader.getFragmentMetaUris();
358+
array_directory->fragment_meta_uris().reserve(fragment_meta_uris.size());
359+
for (auto uri : fragment_meta_uris) {
348360
array_directory->fragment_meta_uris().emplace_back(
349361
deserialize_array_uri_to_absolute(uri.cStr(), array_uri));
350362
}
351363
}
352364

353365
// Get delete tiles location
354366
if (array_directory_reader.hasDeleteAndUpdateTileLocation()) {
355-
for (auto del_tile_reader :
356-
array_directory_reader.getDeleteAndUpdateTileLocation()) {
357-
array_directory->delete_and_update_tiles_location().reserve(
358-
array_directory_reader.getDeleteAndUpdateTileLocation().size());
367+
auto delete_and_update_tiles_location =
368+
array_directory_reader.getDeleteAndUpdateTileLocation();
369+
array_directory->delete_and_update_tiles_location().reserve(
370+
delete_and_update_tiles_location.size());
371+
for (auto del_tile_reader : delete_and_update_tiles_location) {
359372
array_directory->delete_and_update_tiles_location().emplace_back(
360373
URI(deserialize_array_uri_to_absolute(
361374
del_tile_reader.getUri().cStr(), array_uri)),

0 commit comments

Comments
 (0)