silverbullet/website/Query Language.md

79 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

The syntax of queries is inspired by [SQL](https://en.wikipedia.org/wiki/SQL). It can be used using [[Live Queries]] as well as via nested queries part of template expressions: [[Expression Language#Queries]].
Lets start with a query that demonstrates some of the supported clauses. Hover over the result and click the edit icon to show the code that generates the view:
```query
page
order by lastModified desc
where size > 100
select name
limit 10
render [[Library/Core/Query/Page]]
```
Its most convenient to use the `/query` [[Snippets|snippet]] to insert a query in a page.
A query is formulated specifying a `querySource` followed by a number of clauses that modify or restrict the result set. If you havent already, check out how [[Objects]] work in SilverBullet.
Every time `<expression>` is referenced here, an expression using the [[Expression Language]] can be used.
# Clauses
## where <expression>
A `where` clause filters out all objects that do not match a certain condition. You can have multiple `where` clauses if you like, which will have the same effect as combining them with the `and` keyword.
Here is a simple example based on a custom tag `#person` (see [[Objects]] on how this works):
```#person
name: John
age: 7
---
name: Pete
age: 25
```
To query all `person`s that are above age 21, we can use the following `where` clause:
```query
person where page = @page.name and age > 21
```
## order by <expression>
To sort results, an `order by` clause can be used, optionally with `desc` to order in descending order (ascending is the default):
```query
person where page = @page.name order by age desc
```
## limit <expression>
To limit the number of results, you can use a `limit` clause:
```query
person where page = @page.name limit 1
```
## select
You can use the `select` clause to select only specific attributes from the result set. You can use it either simply as `select attribute1, attribute2` but also select the value of certain expressions and give them a name, even one containing spaces using the backtick identifier syntax:
```query
person
where page = @page.name
select name, age, age + 1 as `next year`
```
## render each <template> and render all <template>
In the context of [[Live Queries]], by default, results are rendered as a table. To instead render results using [[Templates|a template]], use the `render` clause, which comes in two shapes `render each` where the template is instantiated for _each_ result (the `each` keyword is optional):
```query
person
where page = @page.name
render each [[internal-template/person]]
```
And `render all` where the entire result set is passed to the template as a list so the template can do its own iteration using `#each`, which you could then use to e.g. build a table (using this [[internal-template/people]] template, for instance):
```query
person
where page = @page.name
render all [[internal-template/people]]
```