Files
plainleaf/libraries/Library/Std/Docs/SLIQ Reference.md
T

49 lines
2.1 KiB
Markdown

---
tags: meta
---
Space Lua Integrated Query (SLIQ) — query syntax for SilverBullet data.
Syntax:
from <var> = index.objects("<type>")
[where <condition>]
[order by <expr> [asc|desc] [nulls first|last] [, ...]]
[group by <expr> [, ...]]
[having <condition>]
[select <expr>]
[limit <n> [, <offset>]]
[offset <n>]
Clauses can appear in any order. Only `from` is required.
Always use variable binding: `from p = index.pages()` (not `from index.pages()`).
Type-specific helpers: `index.pages(tag?)`, `index.contentPages()`, `index.metaPages()`,
`index.aspiringPages()`, `index.tasks(tag?)`, `index.headers(tag?)`, `index.items(tag?)`,
`index.paragraphs(tag?)`, `index.tables(tag?)`, `index.comments()`; otherwise `index.objects("tag")`.
Operators: ==, ~= (not equal), <, >, <=, >=, and, or, not
String: s:startsWith("x"), s:endsWith("x"), s:contains("x")
Tables: table.includes(t, val), table.select(t, "k1", "k2", ...)
Grouping:
After `group by`, each row has `key` (the group key) and `group` (array of items).
Use `#group` for count. Multi-key: `group by p.x, p.y` makes `key` a table ({key[1], key[2]}).
`having` filters groups after grouping (can use aggregates).
Aggregates (in select/having, with or without group by):
count(expr), sum(expr), min(expr), max(expr), avg(expr), array_agg(expr)
With ordering: array_agg(p.name order by p.name asc)
With filter: count(p.size) filter(where p.size > 100)
Projection:
select p.name -- single field
select {name=p.name, count=#group} -- construct table
select table.select(p, "name", "tags") -- pick specific fields from object
Examples:
query 'from t = index.tasks() where not t.done'
query 'from p = index.pages() order by p.lastModified desc limit 10'
query 'from t = index.tasks() group by t.page select {page=key, count=#group}'
query 'from p = index.pages() select table.select(p, "name", "lastModified") limit 5'
query 'from l = index.objects("link") where l.toPage == "MyPage"'
query 'from p = index.pages() order by p.lastModified desc limit 5 select templates.pageItem(p)'