Skip to content

Commit edc1b0b

Browse files
#2067 [queries] Make group_by unordered by default
1 parent 76ac2dd commit edc1b0b

14 files changed

Lines changed: 1224 additions & 108 deletions

File tree

distr/flecs.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77706,6 +77706,10 @@ ecs_query_cache_t* flecs_query_cache_init(
7770677706
flecs_query_cache_group_by(result, result->query->terms[cascade_by - 1].id,
7770777707
flecs_query_cache_group_by_cascade);
7770877708
result->group_by_ctx = &result->query->terms[cascade_by - 1];
77709+
result->query->flags |= EcsQueryGroupByOrdered;
77710+
if (result->query->terms[cascade_by - 1].src.id & EcsDesc) {
77711+
result->query->flags |= EcsQueryGroupByDesc;
77712+
}
7770977713
}
7771077714

7771177715
if (const_desc->group_by_callback || const_desc->group_by) {
@@ -78855,14 +78859,16 @@ ecs_query_cache_group_t* flecs_query_cache_get_group(
7885578859
static
7885678860
void flecs_query_cache_group_insert(
7885778861
ecs_query_cache_t *cache,
78858-
ecs_query_cache_group_t *group)
78862+
ecs_query_cache_group_t *group)
7885978863
{
78860-
bool desc = false; /* Descending order */
78861-
if (cache->cascade_by) {
78862-
desc = (cache->query->terms[
78863-
cache->cascade_by - 1].src.id & EcsDesc) != 0;
78864+
if (!(cache->query->flags & EcsQueryGroupByOrdered)) {
78865+
group->next = cache->first_group;
78866+
cache->first_group = group;
78867+
return;
7886478868
}
7886578869

78870+
bool desc = (cache->query->flags & EcsQueryGroupByDesc) != 0;
78871+
7886678872
ecs_query_cache_group_t *cur = cache->first_group, *prev = NULL;
7886778873
do {
7886878874
ecs_assert(cur->info.id != group->info.id, ECS_INTERNAL_ERROR, NULL);
@@ -79572,7 +79578,7 @@ void flecs_query_rematch(
7957279578
/* Iterate all tables in cache, remove ones that weren't just matched */
7957379579
ecs_vec_t unmatched; ecs_vec_init_t(a, &unmatched, ecs_table_t*, 0);
7957479580
ecs_size_t elem_size = flecs_query_cache_elem_size(cache);
79575-
ecs_query_cache_group_t *cur = &cache->default_group;
79581+
ecs_query_cache_group_t *cur = cache->first_group;
7957679582
do {
7957779583
int32_t i, count = ecs_vec_count(&cur->tables);
7957879584
for (i = 0; i < count; i ++) {
@@ -79824,7 +79830,7 @@ void flecs_query_cache_build_sorted_tables(
7982479830
ecs_vec_clear(&cache->table_slices);
7982579831

7982679832
/* Sort tables in group order */
79827-
ecs_query_cache_group_t *cur = &cache->default_group;
79833+
ecs_query_cache_group_t *cur = cache->first_group;
7982879834
do {
7982979835
flecs_query_cache_build_sorted_table_range(cache, cur);
7983079836
} while ((cur = cur->next));
@@ -79850,7 +79856,7 @@ void flecs_query_cache_sort_tables(
7985079856

7985179857
bool tables_sorted = false;
7985279858

79853-
ecs_query_cache_group_t *cur = &cache->default_group;
79859+
ecs_query_cache_group_t *cur = cache->first_group;
7985479860
do {
7985579861
int32_t i, count = ecs_vec_count(&cur->tables);
7985679862
for (i = 0; i < count; i ++) {

distr/flecs.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6269,6 +6269,27 @@ struct ecs_iter_t {
62696269
*/
62706270
#define EcsQueryDetectChanges (1u << 8u)
62716271

6272+
/** Enable ordering for query groups.
6273+
* When this flag is set, groups will be iterated in ascending order, with lower
6274+
* group ids first and higher group ids afterwards.
6275+
*
6276+
* This flag is enabled automatically when a query contains cascade terms.
6277+
*
6278+
* \ingroup queries
6279+
*/
6280+
#define EcsQueryGroupByOrdered (1u << 9u)
6281+
6282+
/** Enable descending ordering for query groups.
6283+
* When this flag is set in combination with EcsQueryGroupByOrdered, groups will
6284+
* be iterated in descending order, with higher group ids first and lower group
6285+
* ids afterwards.
6286+
*
6287+
* This flag is enabled automatically when a query contains cascade|desc terms.
6288+
*
6289+
* \ingroup queries
6290+
*/
6291+
#define EcsQueryGroupByDesc (1u << 10u)
6292+
62726293

62736294
/** Used with ecs_query_init().
62746295
*

include/flecs.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,27 @@ struct ecs_iter_t {
12711271
*/
12721272
#define EcsQueryDetectChanges (1u << 8u)
12731273

1274+
/** Enable ordering for query groups.
1275+
* When this flag is set, groups will be iterated in ascending order, with lower
1276+
* group ids first and higher group ids afterwards.
1277+
*
1278+
* This flag is enabled automatically when a query contains cascade terms.
1279+
*
1280+
* \ingroup queries
1281+
*/
1282+
#define EcsQueryGroupByOrdered (1u << 9u)
1283+
1284+
/** Enable descending ordering for query groups.
1285+
* When this flag is set in combination with EcsQueryGroupByOrdered, groups will
1286+
* be iterated in descending order, with higher group ids first and lower group
1287+
* ids afterwards.
1288+
*
1289+
* This flag is enabled automatically when a query contains cascade|desc terms.
1290+
*
1291+
* \ingroup queries
1292+
*/
1293+
#define EcsQueryGroupByDesc (1u << 10u)
1294+
12741295

12751296
/** Used with ecs_query_init().
12761297
*

src/query/cache/cache.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,10 @@ ecs_query_cache_t* flecs_query_cache_init(
730730
flecs_query_cache_group_by(result, result->query->terms[cascade_by - 1].id,
731731
flecs_query_cache_group_by_cascade);
732732
result->group_by_ctx = &result->query->terms[cascade_by - 1];
733+
result->query->flags |= EcsQueryGroupByOrdered;
734+
if (result->query->terms[cascade_by - 1].src.id & EcsDesc) {
735+
result->query->flags |= EcsQueryGroupByDesc;
736+
}
733737
}
734738

735739
if (const_desc->group_by_callback || const_desc->group_by) {

src/query/cache/group.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,16 @@ ecs_query_cache_group_t* flecs_query_cache_get_group(
5353
static
5454
void flecs_query_cache_group_insert(
5555
ecs_query_cache_t *cache,
56-
ecs_query_cache_group_t *group)
56+
ecs_query_cache_group_t *group)
5757
{
58-
bool desc = false; /* Descending order */
59-
if (cache->cascade_by) {
60-
desc = (cache->query->terms[
61-
cache->cascade_by - 1].src.id & EcsDesc) != 0;
58+
if (!(cache->query->flags & EcsQueryGroupByOrdered)) {
59+
group->next = cache->first_group;
60+
cache->first_group = group;
61+
return;
6262
}
6363

64+
bool desc = (cache->query->flags & EcsQueryGroupByDesc) != 0;
65+
6466
ecs_query_cache_group_t *cur = cache->first_group, *prev = NULL;
6567
do {
6668
ecs_assert(cur->info.id != group->info.id, ECS_INTERNAL_ERROR, NULL);

src/query/cache/match.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ void flecs_query_rematch(
322322
/* Iterate all tables in cache, remove ones that weren't just matched */
323323
ecs_vec_t unmatched; ecs_vec_init_t(a, &unmatched, ecs_table_t*, 0);
324324
ecs_size_t elem_size = flecs_query_cache_elem_size(cache);
325-
ecs_query_cache_group_t *cur = &cache->default_group;
325+
ecs_query_cache_group_t *cur = cache->first_group;
326326
do {
327327
int32_t i, count = ecs_vec_count(&cur->tables);
328328
for (i = 0; i < count; i ++) {

src/query/cache/order_by.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ void flecs_query_cache_build_sorted_tables(
219219
ecs_vec_clear(&cache->table_slices);
220220

221221
/* Sort tables in group order */
222-
ecs_query_cache_group_t *cur = &cache->default_group;
222+
ecs_query_cache_group_t *cur = cache->first_group;
223223
do {
224224
flecs_query_cache_build_sorted_table_range(cache, cur);
225225
} while ((cur = cur->next));
@@ -245,7 +245,7 @@ void flecs_query_cache_sort_tables(
245245

246246
bool tables_sorted = false;
247247

248-
ecs_query_cache_group_t *cur = &cache->default_group;
248+
ecs_query_cache_group_t *cur = cache->first_group;
249249
do {
250250
int32_t i, count = ecs_vec_count(&cur->tables);
251251
for (i = 0; i < count; i ++) {

test/collections/src/main.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,6 @@ bake_test_case Allocator_testcases[] = {
487487
}
488488
};
489489

490-
491490
static bake_test_suite suites[] = {
492491
{
493492
"Map",

test/cpp/project.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,13 +1013,18 @@
10131013
"with_r_t_inout",
10141014
"optional_tag_is_set",
10151015
"group_by_raw",
1016+
"group_by_raw_ordered",
10161017
"group_by_template",
1018+
"group_by_template_ordered",
10171019
"group_by_iter_one",
10181020
"group_by_iter_one_template",
10191021
"group_by_iter_one_all_groups",
10201022
"group_by_default_func_w_id",
1023+
"group_by_default_func_w_id_ordered",
10211024
"group_by_default_func_w_type",
1025+
"group_by_default_func_w_type_ordered",
10221026
"group_by_callbacks",
1027+
"group_by_callbacks_ordered",
10231028
"set_group_on_query",
10241029
"set_group_type_on_query",
10251030
"create_w_no_template_args",

0 commit comments

Comments
 (0)