Every list() and count() call takes an options bag — combine any of filters, sort, pagination, projection. Filters support equality, ranges, glob, null, and in; multi-filter is AND.
field, op, value. Operators: eq, ne, gt, gte, lt, lte, glob (with *), null, not_null, in. Multiple filters are AND-ed.{ field, direction } pairs, applied in order. Types that compare: strings, numbers, booleans.{ offset, limit }. Applied after filter+sort.id, always).
flowchart LR
Q["list(entity, opts)"] --> P{index
available?}
P -- yes, eq/range --> IX[Index scan] --> A[Apply remaining filters]
P -- no --> FS[Full scan] --> A
A --> S[Sort] --> PG[Paginate] --> PR[Project fields] --> R[rows]
style IX fill:#c8e6c9,stroke:#2e7d32
style FS fill:#fff3e0,stroke:#ef6c00
style R fill:#e3f2fd,stroke:#1565c0
Seed test data to create 20 people with random age/city/score.gt: age > 30). The row fills in automatically and Execute query runs it — the result table shows the matching rows.+ Add filter and combine multiple filters (e.g. city = New York AND age > 25). Execute to see both filters AND-ed.Sort to score desc and limit to 5 — you get the top 5 scorers.Uncheck a field to exclude it from the result.
| ID | Name | Age | City | Score | Active |
|---|
Each preset fills the filter row(s) with a common pattern and executes immediately.
Run all tests rebuilds a 6-record people list in people (Alice, Bob, Charlie, Diana, Eve, Anna) with known ages and scores, then runs these 8 checks:
eq matches exactly Alicegt age > 30 returns 2 rows (Charlie, Eve)glob A* returns Alice + Annasort age asc is monotonicsort score desc is monotonicoffset=2 limit=2 returns 2 rowsprojection: ['name','age'] keeps only id/name/ageage ≥ 28, sort score desc, limit 3) returns 3 rows