ES|QL: Add docs for FORK (#130314)

Co-authored-by: Liam Thompson <32779855+leemthompo@users.noreply.github.com>
This commit is contained in:
Ioana Tagirta 2025-06-30 20:04:21 +02:00 committed by GitHub
parent d69a2822a0
commit a2393063c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,14 @@
% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
```esql
FROM employees
| FORK ( WHERE emp_no == 10001 )
( WHERE emp_no == 10002 )
| KEEP emp_no, _fork
| SORT emp_no
```
| emp_no:integer | _fork:keyword |
| --- | --- |
| 10001 | fork1 |
| 10002 | fork2 |

View File

@ -0,0 +1,19 @@
% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
```esql
FROM books METADATA _score
| WHERE author:"Faulkner"
| EVAL score = round(_score, 2)
| FORK (SORT score DESC, author | LIMIT 5 | KEEP author, score)
(STATS total = COUNT(*))
| SORT _fork, score DESC, author
```
| author:text | score:double | _fork:keyword | total:long |
| --- | --- | --- | --- |
| William Faulkner | 2.39 | fork1 | null |
| William Faulkner | 2.39 | fork1 | null |
| Colleen Faulkner | 1.59 | fork1 | null |
| Danny Faulkner | 1.59 | fork1 | null |
| Keith Faulkner | 1.59 | fork1 | null |
| null | null | fork2 | 18 |

View File

@ -0,0 +1,57 @@
## `FORK` [esql-fork]
```yaml {applies_to}
serverless: preview
stack: preview 9.1.0
```
The `FORK` processing command creates multiple execution branches to operate
on the same input data and combines the results in a single output table.
**Syntax**
```esql
FORK ( <processing_commands> ) ( <processing_commands> ) ... ( <processing_commands> )
```
**Description**
The `FORK` processing command creates multiple execution branches to operate
on the same input data and combines the results in a single output table. A discriminator column (`_fork`) is added to identify which branch each row came from.
**Branch identification:**
- The `_fork` column identifies each branch with values like `fork1`, `fork2`, `fork3`
- Values correspond to the order branches are defined
- `fork1` always indicates the first branch
**Column handling:**
- `FORK` branches can output different columns
- Columns with the same name must have the same data type across all branches
- Missing columns are filled with `null` values
**Row ordering:**
- `FORK` preserves row order within each branch
- Rows from different branches may be interleaved
- Use `SORT _fork` to group results by branch
::::{note}
`FORK` branches default to `LIMIT 1000` if no `LIMIT` is provided.
::::
**Limitations**
- `FORK` supports at most 8 execution branches.
- Using remote cluster references and `FORK` is not supported.
- Using more than one `FORK` command in a query is not supported.
**Examples**
In the following example, each `FORK` branch returns one row.
Notice how `FORK` adds a `_fork` column that indicates which row the branch originates from:
:::{include} ../examples/fork.csv-spec/simpleFork.md
The next example, returns total number of rows that match the query along with
the top five rows sorted by score.
:::{include} ../examples/fork.csv-spec/simpleForkWithStats.md

View File

@ -4,6 +4,7 @@
* [`ENRICH`](../../commands/processing-commands.md#esql-enrich)
* [`EVAL`](../../commands/processing-commands.md#esql-eval)
* [`GROK`](../../commands/processing-commands.md#esql-grok)
* [preview] [`FORK`](../../commands/processing-commands.md#esql-fork)
* [`KEEP`](../../commands/processing-commands.md#esql-keep)
* [`LIMIT`](../../commands/processing-commands.md#esql-limit)
* [`LOOKUP JOIN`](../../commands/processing-commands.md#esql-lookup-join)

View File

@ -32,6 +32,9 @@ mapped_pages:
:::{include} ../_snippets/commands/layout/eval.md
:::
:::{include} ../_snippets/commands/layout/fork.md
:::
:::{include} ../_snippets/commands/layout/grok.md
:::

View File

@ -5,16 +5,44 @@
simpleFork
required_capability: fork_v9
// tag::simpleFork[]
FROM employees
| FORK ( WHERE emp_no == 10001 )
( WHERE emp_no == 10002 )
| KEEP emp_no, _fork
| SORT emp_no
// end::simpleFork[]
;
// tag::simpleFork-result-[]
emp_no:integer | _fork:keyword
10001 | fork1
10002 | fork2
// end::simpleFork-result[]
;
simpleForkWithStats
required_capability: fork_v9
// tag::simpleForkWithStats[]
FROM books METADATA _score
| WHERE author:"Faulkner"
| EVAL score = round(_score, 2)
| FORK (SORT score DESC, author | LIMIT 5 | KEEP author, score)
(STATS total = COUNT(*))
| SORT _fork, score DESC, author
// end::simpleForkWithStats[]
;
// tag::simpleForkWithStats-result[]
author:text | score:double | _fork:keyword | total:long
William Faulkner | 2.39 | fork1 | null
William Faulkner | 2.39 | fork1 | null
Colleen Faulkner | 1.59 | fork1 | null
Danny Faulkner | 1.59 | fork1 | null
Keith Faulkner | 1.59 | fork1 | null
null | null | fork2 | 18
// end::simpleForkWithStats-result[]
;
forkWithWhereSortAndLimit