@lotics/app-sdk 0.58.5 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/queries.md +31 -3
- package/package.json +1 -1
package/docs/queries.md
CHANGED
|
@@ -583,7 +583,7 @@ the table.
|
|
|
583
583
|
|
|
584
584
|
## 8. Shaping: group, buckets, window, fan-out
|
|
585
585
|
|
|
586
|
-
### The
|
|
586
|
+
### The 21 aggregate operations
|
|
587
587
|
|
|
588
588
|
`group` and `window` share one operation vocabulary. `count` is `COUNT(*)` (no `input_column`);
|
|
589
589
|
everything else requires an `input_column` whose type must be compatible — checked at deploy:
|
|
@@ -599,10 +599,38 @@ everything else requires an `input_column` whose type must be compatible — che
|
|
|
599
599
|
| `percent_filled`, `percent_empty` | any except boolean | number | **fraction 0–1**, not 0–100; NULL for an empty group |
|
|
600
600
|
| `unique`, `percent_unique` | text, number, date/datetime, select, select_member, select_record_link, files, json¹ | number | distinct **present** values; array cells compare as whole arrays |
|
|
601
601
|
| `checked`, `unchecked`, `percent_checked`, `percent_unchecked` | boolean | number | `unchecked` counts false **or** empty |
|
|
602
|
+
| `string_agg` | text, select | **text** | the distinct present values joined — the only operation returning values rather than a count. `group` only |
|
|
602
603
|
|
|
603
604
|
¹ opaque `json` columns support only the presence-counting six (`empty`/`filled`/`unique` and
|
|
604
605
|
their `percent_*` forms).
|
|
605
606
|
|
|
607
|
+
**`string_agg` — a summary column, not a dataset.** Every other operation counts or reduces to a
|
|
608
|
+
number; this one joins the values, so a child set answers "which ones?" in the parent row (the
|
|
609
|
+
sizes on a shipment, the tags on a ticket) without a second query.
|
|
610
|
+
|
|
611
|
+
```jsonc
|
|
612
|
+
{ "output": "sizes", "type": "text", "operation": "string_agg", "input_column": "size",
|
|
613
|
+
"distinct": true, "separator": ", ", "max_values": 20 }
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
- **`type` must be `text`** — declaring anything else is rejected at deploy.
|
|
617
|
+
- **`distinct`** defaults to **true**: three containers sized 40HC/40HC/20DC give `20DC, 40HC`.
|
|
618
|
+
Pass `false` to keep every occurrence. Values are always sorted, so the column doesn't
|
|
619
|
+
reshuffle between reads.
|
|
620
|
+
- **`max_values`** (default 20, max 100) caps the emitted values so an unbounded child set can't
|
|
621
|
+
produce a giant cell. It is a silent cap — pair it with a `unique` aggregate over the same
|
|
622
|
+
column to render an honest `+N more`.
|
|
623
|
+
- **`separator`** defaults to `", "` (max 8 chars).
|
|
624
|
+
- Empty values are dropped by the same emptiness contract below, so a partly-blank column
|
|
625
|
+
doesn't emit empty slots. A group with nothing present yields NULL.
|
|
626
|
+
- **`group` only** — it is not in the OVER-legal set, because deduplication and window frames
|
|
627
|
+
are mutually exclusive in SQL. Setting `distinct` / `separator` / `max_values` on any other
|
|
628
|
+
operation is rejected rather than ignored.
|
|
629
|
+
|
|
630
|
+
It is deliberately **not** a rollup field type: a rollup persists its value into record data and
|
|
631
|
+
rewrites it on every child change, and an unbounded concatenation does not belong in a stored
|
|
632
|
+
cell. Query-time only.
|
|
633
|
+
|
|
606
634
|
**The one emptiness contract.** `filled`/`empty`/`unique`/`percent_*` use the same definition
|
|
607
635
|
of "present" as the filter layer's `is_empty` and the `isEmpty` source: array-valued cells are
|
|
608
636
|
empty at NULL / JSON `null` / `[]`; text at NULL or blank (whitespace-only); opaque json at
|
|
@@ -643,8 +671,8 @@ A `window` node carries two independent column lists — **`aggregates`** (frame
|
|
|
643
671
|
**`aggregates` — the OVER-legal aggregate subset.** Only operations that compile to a single
|
|
644
672
|
legal SQL window call are accepted: **`count`, `sum`, `avg`, `min`, `max`, `earliest`, `latest`,
|
|
645
673
|
`filled`, `checked`, `unchecked`.** The rest cannot take an OVER clause (`median` is an
|
|
646
|
-
ordered-set aggregate; `unique`/`percent_unique` need DISTINCT;
|
|
647
|
-
`percent_*` compose multiple calls) — rejected at deploy. The optional `frame` applies **only**
|
|
674
|
+
ordered-set aggregate; `unique`/`percent_unique`/`string_agg` need DISTINCT;
|
|
675
|
+
`range`/`empty`/`date_range`/`percent_*` compose multiple calls) — rejected at deploy. The optional `frame` applies **only**
|
|
648
676
|
to these; a `frame` on a window with no `aggregates` is rejected as dead config.
|
|
649
677
|
|
|
650
678
|
**`functions` — ranking / navigation.** Each is `{ "output", "fn", … }` (its own arg shape, no
|