algoliasearch-helper-flutter icon indicating copy to clipboard operation
algoliasearch-helper-flutter copied to clipboard

Question: Disjunctive Filters between Numeric and Facets

Open nerder opened this issue 1 year ago • 1 comments
trafficstars

We are trying to create the following query:

status:active OR lastAttendedDate > 1700000000000

Our code looks like this:

filterState.add(FilterGroupID.or('someGroup'), [
  Filter.facet('status', "active"),
  Filter.comparison('date', NumericOperator.greaterOrEquals, 170000000),
]);

When we look at the query parameters produced tho, we got this status:active AND lastAttendedDate > 1700000000000

By looking at the internal code:

  String? sql(Set<FilterGroup> filterGroups) {
    final groups = filterGroups.whereNot((element) => element.isEmpty);
    if (groups.isEmpty) return null;
    return groups.map(_sqlGroup).join(' AND ');
  }

This function seems to be adding an AND between multiple-group, but in our case what is not obvious to us is why our filter is considered to be made of 2 groups, where we only have one. This seems to happen only when we use Filter.comparison or Filter.range.

Our expectation is that when we add a Disjuctive group that will be respected, but in this case it seems to be forced into a conjuctive one, why is that?

Some additional info is that all our facets are configured as filters only in the dashboard.

Any help?

nerder avatar Jul 01 '24 17:07 nerder

Ok it seems like that this is intended as per the documentation: https://www.algolia.com/doc/guides/managing-results/refine-results/filtering/in-depth/combining-boolean-operators/#mixed-filter-types-in-or-conditions

Nonetheless it's quite an unexpected behaviour, I'd rather throw an error that point you to the documentation that "automagically" fix the query.

nerder avatar Jul 01 '24 23:07 nerder