Skip to content
Adoptiv

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
Condition tree
  • 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
Depth · eight levels allowed
3of 8 levels used
Conditions · two hundred allowed
2of 200, above which the request is refused by name
Compiled where clause
deals.stage IN ($1, $2)
accounts.tier = $3
Operators the column offers
  • boolean4
  • identifier6
  • date9
  • text10
  • numeric11
All seventeen operators reach SQL · a condition may only name a table the widget already lists, otherwise the query is refused rather than silently narrowed
Third level. Depth is checked when the tree is authored and checked again when it is queried, so a tree that got past the editor cannot get past the runtime.
0
operators the compiler resolves
0
levels a tree may nest
0
conditions in one tree

Product figures from the platform’s own defaults - not customer averages

The mechanism

How it works.

01

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.

02

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.

03

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.

04

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.

Where it sits

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.

  1. 01
    Query

    what is asked, and of what

  2. 02
    Shape

    the measure and the dimension

  3. 03
    Draw

    the visual chosen for that shape

  4. 04
    Arrange

    where it sits on a dashboard

  5. 05
    Filter

    narrowing it after the fact

  6. 06
    Drill

    going from the number to the rows

  7. 07
    Share

    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

More in Reporting & Analytics

12 capabilities

Seven data shapes, twenty-two visuals, shareable without the portal.

Dashboard Sharing

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.

Chart Visuals

Columns, funnels, treemaps, radar, scatter, gauges and pivots - offered only where the data shape supports them, so no chart can misread its own data.

Dashboards

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.

Drill-Through

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.

Pivot Tables

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.

Conditional Formatting

Colour a number by the rule that matters - under target, over threshold, inside a band - so a dashboard reads correctly from across the room.

Reference Lines

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.

Comparison Periods

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.

Theme Sets

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.

Public Links

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.

Embedded Widgets

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.

Call Analytics

Total calls, answered rate, average duration and missed calls, split by direction and outcome, over the call records rather than a sampled export.

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