Filter Trees
Conditions that nest. A group carries either and or or, groups sit inside groups, and the whole thing compiles into one where clause instead of three widgets that nearly agree with each other.
One widget, one where clause
depth 2 · 2 of 6 conditions- ANDlevel 1
- deals.stageinProposal, Negotiation
- ORlevel 2
- accounts.tierequalsEnterprise
- ANDlevel 3
- accounts.employee_countat or above250
- contacts.countrydoes not containUS
- deals.amountbetween25,000 and 250,000
- deals.owner_idequals
TRUEdeals.stage IN ($1, $2)accounts.tier = $3accounts.employee_count >= $4contacts.country NOT ILIKE '%' || $5 || '%'deals.amount BETWEEN $6 AND $7TRUE
- boolean4
- identifier6
- date9
- text10
- numeric11
Product figures from the platform’s own defaults - not customer averages
How it works.
Leaves and groups, all the way down
A leaf names a module, a field, an operator and a value. A group names a conjunction and holds children, each of which is a leaf or another group. An empty group compiles to true rather than to an error, so a half-built tree never breaks the widget above it.
Every operator on the list reaches SQL
Six comparisons, membership and its negation, four string forms, a range, the two emptiness checks and the two boolean checks. String matching ignores case, and a negated contains compiles to a negated case-insensitive match rather than an exclusion list.
The column narrows what you are offered
Boolean columns show four operators, numeric eleven, date nine, identifier columns six, and text ten. Pick a different column and the operator resets when the one you had is not on the new list.
Blank is treated as unasked
A comparison with nothing in it compiles to true, a membership test with an empty list compiles to false, and a range with one end filled compiles to that end alone. Empty strings are never bound against typed columns, which is where this used to fall over.
Two moments in every number.
Every number passes through the same seven. Filter Trees is the lit ones, and everything either side of it is a different page in this category.
- 01Query
what is asked, and of what
- 02Shape
the measure and the dimension
- 03Draw
the visual chosen for that shape
- 04Arrange
where it sits on a dashboard
- 05Filter
narrowing it after the fact
- 06Drill
going from the number to the rows
- 07Share
who else gets to see it
The specifics.
8 facts- Operators
- Equals, not equals, in, not in, contains, does not contain, starts with, ends with, four comparisons, between, is null, is not null, is true, is false
- Depth
- Eight levels, checked when authored and again when queried
- Size
- Two hundred conditions, over which the request is refused with a message naming the cap
- Text matching
- Case-insensitive both ways
- Blank leaves
- Neutralised rather than rejected
- Modules
- A condition may only name a table the widget already lists, otherwise the query is refused
- Runs
- In the where clause, before any aggregate
- Not the same as
- Cross-Filtering, where a click adds a temporary condition on top of this one for as long as it is selected
What this is assembled from.
A number on a dashboard was built somewhere before it was drawn. These are the parts it is made of.
More in Reporting & Analytics
12 capabilitiesSeven data shapes, twenty-two visuals, shareable without the portal.
Hand a board to a team or a CRM role, at read or at edit, by the person who built it. Roles outlive people, which is why a share points at one, not a mailbox.
Columns, funnels, treemaps, radar, scatter, gauges and pivots - offered only where the data shape supports them, so no chart can misread its own data.
Build as many as the floor needs, arrange them on a grid, and give each team the one that answers their question rather than everybody's question.
Wire a chart's clicks to a second dashboard. The value travels on the URL and is read by the board that was named before it paints for the first time.
Cross one dimension against another with row, column and grand totals - the shape a finance team asks for when a chart will not settle the argument.
Colour a number by the rule that matters - under target, over threshold, inside a band - so a dashboard reads correctly from across the room.
Draw the target on the chart itself, so performance is read against the number that was promised rather than against the shape of the bars.
Put a window against the one before it, or against the same window a week, month, quarter or year back, on a card as a difference or a chart as a series.
Six palettes including a print set, pinned per widget, each carrying eight series colours plus the axis, grid, card and tooltip colours drawn around them.
Thirty-two bytes of entropy, an expiry you choose, revocation on the spot, and only the hash kept at rest, on a board that draws its figures for a reader.
Name a slot at the call site and one authored widget answers it everywhere inside the product, computed against the records of whoever is signed in.
Total calls, answered rate, average duration and missed calls, split by direction and outcome, over the call records rather than a sampled export.
The rest of the platform.
Five more categories, all on the same record and the same bill. Each card names three of its capabilities, so you can tell from here whether it is worth opening.
Reporting & Analytics
See filter trees on your own floor.
Thirty minutes, your numbers and your data. We will set filter trees up live and you can decide from the thing itself rather than from this page.
14-day trial · no card · migration included