Skip to content

Commit 59948cb

Browse files
committed
Fix toggle mask compilation and evaluation:
- Toggle bitmasks were built from term indices instead of field indices, which is wrong for OR chains that collapse into one field. - Constrained AND-toggle checks to currently set fields, so OR candidates do not get rejected just because sibling terms in the OR group are unset.
1 parent 2263084 commit 59948cb

3 files changed

Lines changed: 12 additions & 10 deletions

File tree

distr/flecs.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79961,12 +79961,13 @@ int flecs_query_insert_toggle(
7996179961
}
7996279962

7996379963
/* Source matches, set flag */
79964+
uint64_t field_bit = 1ull << term->field_index;
7996479965
if (term->oper == EcsNot) {
79965-
not_toggles |= (1llu << j);
79966+
not_toggles |= field_bit;
7996679967
} else if (term->oper == EcsOptional) {
79967-
optional_toggles |= (1llu << j);
79968+
optional_toggles |= field_bit;
7996879969
} else {
79969-
and_toggles |= (1llu << j);
79970+
and_toggles |= field_bit;
7997079971
}
7997179972

7997279973
fields_done |= (1llu << j);
@@ -79999,7 +80000,7 @@ int flecs_query_insert_toggle(
7999980000
* set, separate instructions let the query engine backtrack to get
8000080001
* the right results. */
8000180002
if (optional_toggles) {
80002-
for (j = i; j < term_count; j ++) {
80003+
for (j = 0; j < q->field_count; j ++) {
8000380004
uint64_t field_bit = 1ull << j;
8000480005
if (!(optional_toggles & field_bit)) {
8000580006
continue;
@@ -85462,7 +85463,7 @@ bool flecs_query_toggle(
8546285463
op_ctx->prev_set_fields = it->set_fields;
8546385464
}
8546485465

85465-
ecs_flags64_t and_fields = op->first.entity;
85466+
ecs_flags64_t and_fields = op->first.entity & op_ctx->prev_set_fields;
8546685467
ecs_flags64_t not_fields = op->second.entity & op_ctx->prev_set_fields;
8546785468

8546885469
return flecs_query_toggle_cmp(

src/query/compiler/compiler.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -771,12 +771,13 @@ int flecs_query_insert_toggle(
771771
}
772772

773773
/* Source matches, set flag */
774+
uint64_t field_bit = 1ull << term->field_index;
774775
if (term->oper == EcsNot) {
775-
not_toggles |= (1llu << j);
776+
not_toggles |= field_bit;
776777
} else if (term->oper == EcsOptional) {
777-
optional_toggles |= (1llu << j);
778+
optional_toggles |= field_bit;
778779
} else {
779-
and_toggles |= (1llu << j);
780+
and_toggles |= field_bit;
780781
}
781782

782783
fields_done |= (1llu << j);
@@ -809,7 +810,7 @@ int flecs_query_insert_toggle(
809810
* set, separate instructions let the query engine backtrack to get
810811
* the right results. */
811812
if (optional_toggles) {
812-
for (j = i; j < term_count; j ++) {
813+
for (j = 0; j < q->field_count; j ++) {
813814
uint64_t field_bit = 1ull << j;
814815
if (!(optional_toggles & field_bit)) {
815816
continue;

src/query/engine/eval_toggle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ bool flecs_query_toggle(
299299
op_ctx->prev_set_fields = it->set_fields;
300300
}
301301

302-
ecs_flags64_t and_fields = op->first.entity;
302+
ecs_flags64_t and_fields = op->first.entity & op_ctx->prev_set_fields;
303303
ecs_flags64_t not_fields = op->second.entity & op_ctx->prev_set_fields;
304304

305305
return flecs_query_toggle_cmp(

0 commit comments

Comments
 (0)