Add examples for custom functions with scoped variables (#2406)

* added examples for custom functions with scoped variables, closes influxdata/DAR#196

* changed manipulate to use

* Apply suggestions from code review

Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com>

* updated custom function example

* minor updates to custom functions doc

Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com>
pull/2411/head
Scott Anderson 2021-04-12 10:43:38 -06:00 committed by GitHub
parent 095384dc75
commit 8f4b72b082
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 104 additions and 27 deletions

View File

@ -89,7 +89,7 @@ percent(sample: 20.0, total: 80.0)
### Transform values in a data stream ### Transform values in a data stream
To transform multiple values in an input stream, your function needs to: To transform multiple values in an input stream, your function needs to:
- [Handle piped-forward data](/{{< latest "influxdb" "v2" >}}/query-data/flux/custom-functions/#functions-that-manipulate-piped-forward-data). - [Handle piped-forward data](/{{< latest "influxdb" "v2" >}}/query-data/flux/custom-functions/#use-piped-forward-data-in-a-custom-function).
- Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_. - Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_.
- Use the [`map()` function](/{{< latest "influxdb" "v2" >}}/reference/flux/stdlib/built-in/transformations/map) to iterate over each row. - Use the [`map()` function](/{{< latest "influxdb" "v2" >}}/reference/flux/stdlib/built-in/transformations/map) to iterate over each row.

View File

@ -89,7 +89,7 @@ percent(sample: 20.0, total: 80.0)
### Transform values in a data stream ### Transform values in a data stream
To transform multiple values in an input stream, your function needs to: To transform multiple values in an input stream, your function needs to:
- [Handle piped-forward data](/{{< latest "influxdb" "v2" >}}/query-data/flux/custom-functions/#functions-that-manipulate-piped-forward-data). - [Handle piped-forward data](/{{< latest "influxdb" "v2" >}}/query-data/flux/custom-functions/#use-piped-forward-data-in-a-custom-function).
- Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_. - Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_.
- Use the [`map()` function](/{{< latest "influxdb" "v2" >}}/reference/flux/stdlib/built-in/transformations/map) to iterate over each row. - Use the [`map()` function](/{{< latest "influxdb" "v2" >}}/reference/flux/stdlib/built-in/transformations/map) to iterate over each row.

View File

@ -21,14 +21,19 @@ list_code_example: |
``` ```
--- ---
Flux's functional syntax allows for custom functions. Flux's functional syntax lets you create custom functions.
This guide walks through the basics of creating your own function. This guide walks through the basics of creating your own function.
## Function definition structure - [Function definition syntax](#function-definition-syntax)
The basic structure for defining functions in Flux is as follows: - [Use piped-forward data in a custom function](#use-piped-forward-data-in-a-custom-function)
- [Define parameter defaults](#define-parameter-defaults)
- [Define functions with scoped variables](#define-functions-with-scoped-variables)
## Function definition syntax
The basic syntax for defining functions in Flux is as follows:
```js ```js
// Basic function definition structure // Basic function definition syntax
functionName = (functionParameters) => functionOperations functionName = (functionParameters) => functionOperations
``` ```
@ -60,13 +65,13 @@ square = (n) => n * n
multiply = (x, y) => x * y multiply = (x, y) => x * y
// Function usage // Function usage
> multiply(x:2, y:15) > multiply(x: 2, y: 15)
30 30
``` ```
## Functions that manipulate piped-forward data ## Use piped-forward data in a custom function
Most Flux functions manipulate data piped-forward into the function. Most Flux functions process piped-forward data.
In order for a custom function to process piped-forward data, one of the function To process piped-forward data, one of the function
parameters must capture the input tables using the `<-` pipe-receive expression. parameters must capture the input tables using the `<-` pipe-receive expression.
In the example below, the `tables` parameter is assigned to the `<-` expression, In the example below, the `tables` parameter is assigned to the `<-` expression,
@ -111,39 +116,111 @@ functionName = (param1=defaultValue1, param2=defaultValue2) => functionOperation
Defaults are overridden by explicitly defining the parameter in the function call. Defaults are overridden by explicitly defining the parameter in the function call.
#### Example functions with defaults ### Example functions with defaults
###### Get the winner or the "winner" #### Get a list of leaders
The example below defines a `getWinner` function that returns the record with the highest The example below defines a `leaderBoard` function that returns a limited number
or lowest `_value` (winner versus "winner") depending on the `noSarcasm` parameter which defaults to `true`. of records sorted by values in specified columns.
It uses the [`sort()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/sort) It uses the [`sort()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/sort)
to sort records in either descending or ascending order. to sort records in either descending or ascending order.
It then uses the [`limit()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/limit) It then uses the [`limit()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/limit)
to return the first record from the sorted table. to return a specified number of records from the sorted table.
```js ```js
// Function definition // Function definition
getWinner = (tables=<-, noSarcasm:true) => leaderBoard = (tables=<-, limit=4, columns=["_value"], desc=true) =>
tables tables
|> sort(desc: noSarcasm) |> sort(columns: columns, desc: desc)
|> limit(n:1) |> limit(n: limit)
// Function usage // Function usage
// Get the winner // Get the 4 highest scoring players
from(bucket: "example-bucket") from(bucket: "example-bucket")
|> range(start: -1m) |> range(start: -1m)
|> filter(fn: (r) => |> filter(fn: (r) =>
r._measurement == "mem" and r._measurement == "player-stats" and
r._field == "used_percent" r._field == "total-points"
) )
|> getWinner() |> leaderBoard()
// Get the "winner" // Get the 10 shortest race times
from(bucket: "example-bucket") from(bucket: "example-bucket")
|> range(start: -1m) |> range(start: -1m)
|> filter(fn: (r) => |> filter(fn: (r) =>
r._measurement == "mem" and r._measurement == "race-times" and
r._field == "used_percent" r._field == "elapsed-time"
) )
|> getWinner(noSarcasm: false) |> leaderBoard(limit: 10, desc: false)
```
## Define functions with scoped variables
To create custom functions with variables scoped to the function, place your
function operations and variables inside of a [block (`{}`)](/influxdb/v2.0/reference/flux/language/blocks/)
and use a `return` statement to return a specific variable.
```js
functionName = (functionParameters) => {
exampleVar = "foo"
return exampleVar
}
```
### Example functions with scoped variables
- [Return an alert level based on a value](#return-an-alert-level-based-on-a-value)
- [Convert a HEX color code to a name](#convert-a-hex-color-code-to-a-name)
#### Return an alert level based on a value
The following function uses conditional logic to return an alert level based on
a numeric input value:
```js
alertLevel = (v) => {
level = if float(v:v) >= 90.0 then "crit"
else if float(v:v) >= 80.0 then "warn"
else if float(v:v) >= 65.0 then "info"
else "ok"
return level
}
alertLevel(v: 87.3)
// Returns "warn"
```
#### Convert a HEX color code to a name
The following function converts a hexadecimal (HEX) color code to the equivalent HTML color name.
The functions uses the [Flux dictionary package](/influxdb/v2.0/reference/flux/stdlib/dict/)
to create a dictionary of HEX codes and their corresponding names.
```js
import "dict"
hexName = (hex) => {
hexNames = dict.fromList(pairs: [
{key: "#00ffff", value: "Aqua"},
{key: "#000000", value: "Black"},
{key: "#0000ff", value: "Blue"},
{key: "#ff00ff", value: "Fuchsia"},
{key: "#808080", value: "Gray"},
{key: "#008000", value: "Green"},
{key: "#00ff00", value: "Lime"},
{key: "#800000", value: "Maroon"},
{key: "#000080", value: "Navy"},
{key: "#808000", value: "Olive"},
{key: "#800080", value: "Purple"},
{key: "#ff0000", value: "Red"},
{key: "#c0c0c0", value: "Silver"},
{key: "#008080", value: "Teal"},
{key: "#ffffff", value: "White"},
{key: "#ffff00", value: "Yellow"},
])
name = dict.get(dict: hexNames, key: hex, default: "No known name")
return name
}
hexName(hex: "#000000")
// Returns "Black"
hexName(hex: "#8b8b8b")
// Returns "No known name"
``` ```

View File

@ -98,7 +98,7 @@ percent(sample: 20.0, total: 80.0)
### Transform values in a data stream ### Transform values in a data stream
To transform multiple values in an input stream, your function needs to: To transform multiple values in an input stream, your function needs to:
- [Handle piped-forward data](/influxdb/v2.0/query-data/flux/custom-functions/#functions-that-manipulate-piped-forward-data). - [Handle piped-forward data](/influxdb/v2.0/query-data/flux/custom-functions/#use-piped-forward-data-in-a-custom-function).
- Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_. - Each operand necessary for the calculation exists in each row _(see [Pivot vs join](#pivot-vs-join) below)_.
- Use the [`map()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/map) to iterate over each row. - Use the [`map()` function](/influxdb/v2.0/reference/flux/stdlib/built-in/transformations/map) to iterate over each row.