You're seeing just the callback bulk_compare, go back to Ash.Filter.Predicate module for more information.
Link to this callback


View Source (optional)


bulk_compare([predicate()]) :: term()

As long as at least one predicate of the type defined in your module, (and this callback is implemented), it will be called with all of the other predicates present in a filter. The return value is relatively complex, but it should be a list of boolean statements. E.g. {op, left, right} and {:not, predicate} (nested as deep as necessary).

The best way to do it is to find lists of predicates that are mutually exclusive or mutually inclusive, and pass those lists into Ash.SatSolver.mutually_exclusive/1 and Ash.SatSolver.mutually_inclusive/1