Any valid Walkable S-expression that evaluates to boolean (not just some truthy values in Clojure sense) can be used in a filter.

One-off filter

Filter can be specified in a query’s parameters.

`[{(:people/list {:filter [:or [:like :person/name "jon%"]
                               [:< :person/yob 1970]]})
   [:person/name :person/yob]]}

Permanent filters

You may want to enforce filters for specific roots/idents/joins:

  • for DRY reason: you don’t want to retype the same filter again and again.

  • for security reason: once you define some constraints to limit what the clients can access for an ident or join, they’re free to play with whatever left open to them.

;; registry
[{:key :people/list
  :type :root
  :table "..."
  :filter [:= :person/hidden false]}
 {:key :person/friends
  :type :join
  :join-path [...]
  :filter [:or
           [:like :person/name "jon%"]
           [:like :person/name "mary%"]]}]

Joins in filters

You’ve seen filters used against columns of the current table. If you have defined some :joins in your registry, you can also impose constraints on columns of the joined tables, too.

;; find all people whose name starts with "jon" or whose friend's name
;; starts with "jon".
`[{(:people/list {:filter [:or [:like :person/name "jon%"]
                              {:person/friend [:like :person/name "jon%"]}]})
[:person/name :person/yob]}]

You can have many such joins in filters and combine them with other expressions using :and/:or/:not however you like.