Skip to content

Commit 3b99938

Browse files
committed
Move query plan serialization to JSON option
1 parent 44feea4 commit 3b99938

File tree

5 files changed

+116
-118
lines changed

5 files changed

+116
-118
lines changed

flecs.c

Lines changed: 56 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -34765,6 +34765,7 @@ void flecs_rest_parse_json_ser_iter_params(
3476534765
flecs_rest_bool_param(req, "type_info", &desc->serialize_type_info);
3476634766
flecs_rest_bool_param(req, "field_info", &desc->serialize_field_info);
3476734767
flecs_rest_bool_param(req, "query_info", &desc->serialize_query_info);
34768+
flecs_rest_bool_param(req, "query_plan", &desc->serialize_query_plan);
3476834769
flecs_rest_bool_param(req, "table", &desc->serialize_table);
3476934770
flecs_rest_bool_param(req, "rows", &desc->serialize_rows);
3477034771
bool results = true;
@@ -34992,13 +34993,19 @@ bool flecs_rest_reply_existing_query(
3499234993
}
3499334994

3499434995
const EcsPoly *poly = ecs_get_pair(world, q, EcsPoly, EcsQuery);
34995-
if (!poly || !poly->poly) {
34996+
if (!poly) {
3499634997
flecs_reply_error(reply,
3499734998
"resolved identifier '%s' is not a query", name);
3499834999
reply->code = 400;
3499935000
return true;
3500035001
}
3500135002

35003+
if (!poly->poly) {
35004+
flecs_reply_error(reply, "query '%s' is not initialized", name);
35005+
reply->code = 400;
35006+
return true;
35007+
}
35008+
3500235009
ecs_iter_t it;
3500335010
ecs_iter_poly(world, poly->poly, &it, NULL);
3500435011

@@ -35076,60 +35083,6 @@ bool flecs_rest_reply_query(
3507635083
return true;
3507735084
}
3507835085

35079-
static
35080-
bool flecs_rest_reply_query_plan(
35081-
ecs_world_t *world,
35082-
const ecs_http_request_t* req,
35083-
ecs_http_reply_t *reply)
35084-
{
35085-
const char *q_name = ecs_http_get_param(req, "name");
35086-
if (q_name) {
35087-
reply->code = 400;
35088-
ecs_strbuf_appendlit(&reply->body,
35089-
"query plan endpoint unsupported for named queries");
35090-
return true;
35091-
}
35092-
35093-
const char *q = ecs_http_get_param(req, "q");
35094-
if (!q) {
35095-
ecs_strbuf_appendlit(&reply->body, "Missing parameter 'q'");
35096-
reply->code = 400; /* bad request */
35097-
return true;
35098-
}
35099-
35100-
bool try = false;
35101-
flecs_rest_bool_param(req, "try", &try);
35102-
35103-
ecs_dbg_2("rest: request query plan for '%s'", q);
35104-
bool prev_color = ecs_log_enable_colors(false);
35105-
rest_prev_log = ecs_os_api.log_;
35106-
ecs_os_api.log_ = flecs_rest_capture_log;
35107-
35108-
ecs_rule_t *r = ecs_rule_init(world, &(ecs_filter_desc_t){
35109-
.expr = q
35110-
});
35111-
if (!r) {
35112-
flecs_rest_reply_set_captured_log(reply);
35113-
if (try) {
35114-
/* If client is trying queries, don't spam console with errors */
35115-
reply->code = 200;
35116-
}
35117-
} else {
35118-
ecs_log_enable_colors(true);
35119-
char *plan = ecs_rule_str(r);
35120-
ecs_strbuf_appendlit(&reply->body, "{\"content\":");
35121-
flecs_json_string_escape(&reply->body, plan);
35122-
ecs_strbuf_appendlit(&reply->body, "}");
35123-
ecs_os_free(plan);
35124-
ecs_rule_fini(r);
35125-
}
35126-
35127-
ecs_os_api.log_ = rest_prev_log;
35128-
ecs_log_enable_colors(prev_color);
35129-
35130-
return true;
35131-
}
35132-
3513335086
#ifdef FLECS_MONITOR
3513435087

3513535088
static
@@ -35514,10 +35467,6 @@ bool flecs_rest_reply(
3551435467
} else if (!ecs_os_strcmp(req->path, "query")) {
3551535468
return flecs_rest_reply_query(world, req, reply);
3551635469

35517-
/* Query plan endpoint */
35518-
} else if (!ecs_os_strcmp(req->path, "query_plan")) {
35519-
return flecs_rest_reply_query_plan(world, req, reply);
35520-
3552135470
/* World endpoint */
3552235471
} else if (!ecs_os_strcmp(req->path, "world")) {
3552335472
return flecs_rest_reply_world(world, req, reply);
@@ -53285,6 +53234,49 @@ void flecs_json_serialize_query_info(
5328553234
flecs_json_serialize_query(world, q, buf);
5328653235
}
5328753236

53237+
static
53238+
void flecs_json_serialize_query_plan(
53239+
const ecs_world_t *world,
53240+
const ecs_iter_t *it,
53241+
ecs_strbuf_t *buf)
53242+
{
53243+
(void)world;
53244+
(void)it;
53245+
(void)buf;
53246+
53247+
#ifdef FLECS_RULES
53248+
if (!it->query) {
53249+
return;
53250+
}
53251+
53252+
/* Temporary hack to get rule object. Will no longer be necessary in v4 */
53253+
ecs_iter_next_action_t next = it->next;
53254+
if (next == ecs_page_next) {
53255+
if (!it->chain_it) {
53256+
return;
53257+
}
53258+
53259+
next = it->chain_it->next;
53260+
}
53261+
53262+
if (next != ecs_rule_next) {
53263+
return;
53264+
}
53265+
53266+
const ecs_filter_t *f = it->query;
53267+
const ecs_rule_t *q = ECS_OFFSET(f, -ECS_SIZEOF(ecs_header_t));
53268+
ecs_poly_assert(q, ecs_rule_t);
53269+
53270+
flecs_json_memberl(buf, "query_plan");
53271+
53272+
bool prev_color = ecs_log_enable_colors(true);
53273+
char *plan = ecs_rule_str(q);
53274+
flecs_json_string_escape(buf, plan);
53275+
ecs_os_free(plan);
53276+
ecs_log_enable_colors(prev_color);
53277+
#endif
53278+
}
53279+
5328853280
static
5328953281
void flecs_json_serialize_iter_variables(ecs_iter_t *it, ecs_strbuf_t *buf) {
5329053282
char **variable_names = it->variable_names;
@@ -54030,6 +54022,11 @@ int ecs_iter_to_json_buf(
5403054022
flecs_json_serialize_query_info(world, it, buf);
5403154023
}
5403254024

54025+
/* Serialize query plan if enabled */
54026+
if (desc && desc->serialize_query_plan) {
54027+
flecs_json_serialize_query_plan(world, it, buf);
54028+
}
54029+
5403354030
/* Serialize results */
5403454031
if (!desc || !desc->dont_serialize_results) {
5403554032
flecs_json_memberl(buf, "results");

flecs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12997,6 +12997,7 @@ typedef struct ecs_iter_to_json_desc_t {
1299712997
bool serialize_rows; /**< Use row-based serialization, with entities in separate elements */
1299812998
bool serialize_field_info; /**< Serialize metadata for fields returned by query */
1299912999
bool serialize_query_info; /**< Serialize query terms */
13000+
bool serialize_query_plan; /**< Serialize query plan */
1300013001
bool dont_serialize_results; /**< If true, query won't be evaluated */
1300113002
} ecs_iter_to_json_desc_t;
1300213003

@@ -13022,6 +13023,7 @@ typedef struct ecs_iter_to_json_desc_t {
1302213023
.serialize_rows = false, \
1302313024
.serialize_field_info = false, \
1302413025
.serialize_query_info = false, \
13026+
.serialize_query_plan = false, \
1302513027
.dont_serialize_results = false, \
1302613028
}
1302713029

include/flecs/addons/json.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ typedef struct ecs_iter_to_json_desc_t {
286286
bool serialize_rows; /**< Use row-based serialization, with entities in separate elements */
287287
bool serialize_field_info; /**< Serialize metadata for fields returned by query */
288288
bool serialize_query_info; /**< Serialize query terms */
289+
bool serialize_query_plan; /**< Serialize query plan */
289290
bool dont_serialize_results; /**< If true, query won't be evaluated */
290291
} ecs_iter_to_json_desc_t;
291292

@@ -311,6 +312,7 @@ typedef struct ecs_iter_to_json_desc_t {
311312
.serialize_rows = false, \
312313
.serialize_field_info = false, \
313314
.serialize_query_info = false, \
315+
.serialize_query_plan = false, \
314316
.dont_serialize_results = false, \
315317
}
316318

src/addons/json/serialize.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,49 @@ void flecs_json_serialize_query_info(
15111511
flecs_json_serialize_query(world, q, buf);
15121512
}
15131513

1514+
static
1515+
void flecs_json_serialize_query_plan(
1516+
const ecs_world_t *world,
1517+
const ecs_iter_t *it,
1518+
ecs_strbuf_t *buf)
1519+
{
1520+
(void)world;
1521+
(void)it;
1522+
(void)buf;
1523+
1524+
#ifdef FLECS_RULES
1525+
if (!it->query) {
1526+
return;
1527+
}
1528+
1529+
/* Temporary hack to get rule object. Will no longer be necessary in v4 */
1530+
ecs_iter_next_action_t next = it->next;
1531+
if (next == ecs_page_next) {
1532+
if (!it->chain_it) {
1533+
return;
1534+
}
1535+
1536+
next = it->chain_it->next;
1537+
}
1538+
1539+
if (next != ecs_rule_next) {
1540+
return;
1541+
}
1542+
1543+
const ecs_filter_t *f = it->query;
1544+
const ecs_rule_t *q = ECS_OFFSET(f, -ECS_SIZEOF(ecs_header_t));
1545+
ecs_poly_assert(q, ecs_rule_t);
1546+
1547+
flecs_json_memberl(buf, "query_plan");
1548+
1549+
bool prev_color = ecs_log_enable_colors(true);
1550+
char *plan = ecs_rule_str(q);
1551+
flecs_json_string_escape(buf, plan);
1552+
ecs_os_free(plan);
1553+
ecs_log_enable_colors(prev_color);
1554+
#endif
1555+
}
1556+
15141557
static
15151558
void flecs_json_serialize_iter_variables(ecs_iter_t *it, ecs_strbuf_t *buf) {
15161559
char **variable_names = it->variable_names;
@@ -2256,6 +2299,11 @@ int ecs_iter_to_json_buf(
22562299
flecs_json_serialize_query_info(world, it, buf);
22572300
}
22582301

2302+
/* Serialize query plan if enabled */
2303+
if (desc && desc->serialize_query_plan) {
2304+
flecs_json_serialize_query_plan(world, it, buf);
2305+
}
2306+
22592307
/* Serialize results */
22602308
if (!desc || !desc->dont_serialize_results) {
22612309
flecs_json_memberl(buf, "results");

src/addons/rest.c

Lines changed: 8 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ void flecs_rest_parse_json_ser_iter_params(
193193
flecs_rest_bool_param(req, "type_info", &desc->serialize_type_info);
194194
flecs_rest_bool_param(req, "field_info", &desc->serialize_field_info);
195195
flecs_rest_bool_param(req, "query_info", &desc->serialize_query_info);
196+
flecs_rest_bool_param(req, "query_plan", &desc->serialize_query_plan);
196197
flecs_rest_bool_param(req, "table", &desc->serialize_table);
197198
flecs_rest_bool_param(req, "rows", &desc->serialize_rows);
198199
bool results = true;
@@ -420,13 +421,19 @@ bool flecs_rest_reply_existing_query(
420421
}
421422

422423
const EcsPoly *poly = ecs_get_pair(world, q, EcsPoly, EcsQuery);
423-
if (!poly || !poly->poly) {
424+
if (!poly) {
424425
flecs_reply_error(reply,
425426
"resolved identifier '%s' is not a query", name);
426427
reply->code = 400;
427428
return true;
428429
}
429430

431+
if (!poly->poly) {
432+
flecs_reply_error(reply, "query '%s' is not initialized", name);
433+
reply->code = 400;
434+
return true;
435+
}
436+
430437
ecs_iter_t it;
431438
ecs_iter_poly(world, poly->poly, &it, NULL);
432439

@@ -504,60 +511,6 @@ bool flecs_rest_reply_query(
504511
return true;
505512
}
506513

507-
static
508-
bool flecs_rest_reply_query_plan(
509-
ecs_world_t *world,
510-
const ecs_http_request_t* req,
511-
ecs_http_reply_t *reply)
512-
{
513-
const char *q_name = ecs_http_get_param(req, "name");
514-
if (q_name) {
515-
reply->code = 400;
516-
ecs_strbuf_appendlit(&reply->body,
517-
"query plan endpoint unsupported for named queries");
518-
return true;
519-
}
520-
521-
const char *q = ecs_http_get_param(req, "q");
522-
if (!q) {
523-
ecs_strbuf_appendlit(&reply->body, "Missing parameter 'q'");
524-
reply->code = 400; /* bad request */
525-
return true;
526-
}
527-
528-
bool try = false;
529-
flecs_rest_bool_param(req, "try", &try);
530-
531-
ecs_dbg_2("rest: request query plan for '%s'", q);
532-
bool prev_color = ecs_log_enable_colors(false);
533-
rest_prev_log = ecs_os_api.log_;
534-
ecs_os_api.log_ = flecs_rest_capture_log;
535-
536-
ecs_rule_t *r = ecs_rule_init(world, &(ecs_filter_desc_t){
537-
.expr = q
538-
});
539-
if (!r) {
540-
flecs_rest_reply_set_captured_log(reply);
541-
if (try) {
542-
/* If client is trying queries, don't spam console with errors */
543-
reply->code = 200;
544-
}
545-
} else {
546-
ecs_log_enable_colors(true);
547-
char *plan = ecs_rule_str(r);
548-
ecs_strbuf_appendlit(&reply->body, "{\"content\":");
549-
flecs_json_string_escape(&reply->body, plan);
550-
ecs_strbuf_appendlit(&reply->body, "}");
551-
ecs_os_free(plan);
552-
ecs_rule_fini(r);
553-
}
554-
555-
ecs_os_api.log_ = rest_prev_log;
556-
ecs_log_enable_colors(prev_color);
557-
558-
return true;
559-
}
560-
561514
#ifdef FLECS_MONITOR
562515

563516
static
@@ -942,10 +895,6 @@ bool flecs_rest_reply(
942895
} else if (!ecs_os_strcmp(req->path, "query")) {
943896
return flecs_rest_reply_query(world, req, reply);
944897

945-
/* Query plan endpoint */
946-
} else if (!ecs_os_strcmp(req->path, "query_plan")) {
947-
return flecs_rest_reply_query_plan(world, req, reply);
948-
949898
/* World endpoint */
950899
} else if (!ecs_os_strcmp(req->path, "world")) {
951900
return flecs_rest_reply_world(world, req, reply);

0 commit comments

Comments
 (0)