ash v1.13.4 Ash.Filter View Source
The representation of a filter in Ash.
Ash filters are stored as nested Ash.Filter.Expression{}
and %Ash.Filter.Not{}
structs,
terminating in a %Ash.Filter.Predicate{}
struct. An expression is simply a boolean operator
and the left and right hand side of that operator.
Filter Templates
Filter templates are simplified fielter statements (they only support atom keys), that have substitutions in them.
Currently, the substitutions are {:_actor, :field}
and {:_actor, :_primary_key}
You can pass a filter template to build_filter_from_template/2
with an actor, and it will return the new result
Additionally, you can ask if the filter template contains an actor reference via template_references_actor?/1
Writing a filter:
A filter is a nested keyword list (with some exceptions, like true
for everything and false
for nothing).
The key is the "predicate" (A.K.A condition) and the value is the parameter. You can use and
and or
to create
nested filters. Datalayers can expose custom predicates. Eventually, you will be able to define your own custom
predicates, which will be a mechanism for you to attach complex filters supported by the data layer to your queries.
Important
In a given keyword list, all predicates are considered to be "ands". So [or: [first_name: "Tom", last_name: "Bombadil"]]
doesn't
mean 'First name == "tom" or last_name == "bombadil"'. To say that, you want to provide a list of filters,
like so: [or: [[first_name: "Tom"], [last_name: "Bombadil"]]]
The builtin predicates are:
- eq - shorthand for equals
- equals
- in
- lt - shorthand for less_than
- gt - shorthand for greater_than
- lte - shorthand for less_than_or_equal
- gte - shorthand for greater_than_or_equal
- less_than
- greater_than
- less_than_or_equal
- greater_than_or_equal
- is_nil
Some example filters:
[name: "Zardoz"]
[first_name: "Zar", last_name: "Doz"]
[first_name: "Zar", last_name: [in: ["Doz", "Daz"]], high_score: [greater_than: 10]]
[first_name: "Zar", last_name: [in: ["Doz", "Daz"]], high_score: [greater_than: 10]]
[or: [
[first_name: "Zar"],
[last_name: "Doz"],
[or: [
[high_score: [greater_than: 10]]],
[high_score: [less_than: -10]]
]
]]
Link to this section Summary
Functions
Replace any actor value references in a template with the values from a given actor
Returns true if the second argument is a strict subset (always returns the same or less data) of the first
Whether or not a given template contains an actor reference
transform an expression based filter to a simple filter, which is just a list of predicates
Link to this section Types
Specs
Link to this section Functions
Replace any actor value references in a template with the values from a given actor
filter_expression_by_relationship_path(filter, path, scope? \\ false)
View SourceReturns true if the second argument is a strict subset (always returns the same or less data) of the first
Whether or not a given template contains an actor reference
transform an expression based filter to a simple filter, which is just a list of predicates