Skip to content

Loading DelightQL...

Tree Grouping

The { } syntax creates nested JSON-style output. Inside braces, ~> nests one level of grouping under another.

users(*)
  ~> {country, "users": ~> {first_name, last_name}} as users_by_country

Sibling Tree Grouping

users(*)
  ~> {
       country,
       "user_names":
          ~> {first_name, last_name},
       "statuses":
          ~> [status]
     } as users_by_country

Metadata Tree Grouping

Metadata-oriented tree grouping turns data into JSON keys. A column's distinct values become the keys of a single object rather than elements of an array. This is analagous to pivoting.

users(*) as u
  |> %(~> u.country:~> u.status:~> {u.first_name})

Tree groups are just values

The enclyphs {} or [] may be usesd in scalar or reduction position. Tree groups work with the rest of the language.

users(*)
  |> %(
       {country, "people": ~> {first_name, last_name}} as people_by_country
       ~>
       count:(*) as user_count,
       avg:(age) as avg_age
     )

Tree Destructuring

// CTE generates the tree-group
temp(*) :
  users(*), id < 4
    ~> {country, "users": ~> {first_name, last_name}} as nested

// now use two-level of deconstruction
temp(*), nested ~= ~> {country, "users": sub_users}
  , sub_users ~= ~> {first_name, last_name}
  |> -(nested)

Narrowing

// CTE generates the tree-group
users(*)
  |> %(country ~> {first_name, last_name} as people) : grouped
grouped(*) |> .people{.first_name, .last_name}

Interior Drill-Down

Unlike narrowing, interior drill-down keeps the columns of the exterior table.

users(*)
  |> %(country ~> {first_name, last_name, age} as people) : by_country
by_country(*).people(*)
  |> %(country ~> sum:(age), avg:(age))