Update where documentation (#15467)

# Description

Updates `help where` to better explain row conditions, and provide more
examples. Also, the syntax shape is changed to `one_of(condition,
closure())>`. I don't think this should affect parsing at all because it
should still always be parsed as `SyntaxShape::RowCondition`, but it
should be more clear that you can use a row condition _or_ a closure
here, even if technically we consider closures to be row conditions
internally. In a similar vein, the help text makes this distinction
explicitly to make it more clear to users that closures are supported.

# User-Facing Changes

* Updated `where` help text



---------

Co-authored-by: Bahex <Bahex@users.noreply.github.com>
Co-authored-by: Douglas <32344964+NotTheDr01ds@users.noreply.github.com>
Co-authored-by: Stefan Holderbach <sholderbach@users.noreply.github.com>
This commit is contained in:
132ikl 2025-06-05 15:31:22 -04:00 committed by GitHub
parent 4adcf079e2
commit 9cc74e7a9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -10,13 +10,21 @@ impl Command for Where {
} }
fn description(&self) -> &str { fn description(&self) -> &str {
"Filter values based on a row condition." "Filter values of an input list based on a condition."
} }
fn extra_description(&self) -> &str { fn extra_description(&self) -> &str {
r#"This command works similar to 'filter' but allows extra shorthands for working with r#"A condition is evaluated for each element of the input, and only elements which meet the condition are included in the output.
tables, known as "row conditions". On the other hand, reading the condition from a variable is
not supported."# A condition can be either a "row condition" or a closure. A row condition is a special short-hand syntax to makes accessing fields easier.
Each element of the input can be accessed through the `$it` variable.
On the left hand side of a row condition, any field name is automatically expanded to use `$it`.
For example, `where type == dir` is equivalent to `where $it.type == dir`. This expansion does not happen when passing a subexpression or closure to `where`.
When using a closure, the element is passed as an argument and as pipeline input (`$in`) to the closure. Unlike row conditions, the `$it` variable isn't available inside closures.
Row conditions cannot be stored in a variable. To pass a condition with a variable, use a closure instead."#
} }
fn command_type(&self) -> CommandType { fn command_type(&self) -> CommandType {
@ -34,12 +42,12 @@ not supported."#
(Type::Range, Type::Any), (Type::Range, Type::Any),
]) ])
.required( .required(
"row_condition", "condition",
SyntaxShape::OneOf(vec![ SyntaxShape::OneOf(vec![
SyntaxShape::RowCondition, SyntaxShape::RowCondition,
SyntaxShape::Closure(Some(vec![SyntaxShape::Any])), SyntaxShape::Closure(Some(vec![SyntaxShape::Any])),
]), ]),
"Filter condition.", "Filter row condition or closure.",
) )
.allow_variants_without_examples(true) .allow_variants_without_examples(true)
.category(Category::Filters) .category(Category::Filters)
@ -86,9 +94,9 @@ not supported."#
})])), })])),
}, },
Example { Example {
description: "Filter items of a list according to a condition", description: "List only the files in the current directory",
example: "[1 2] | where {|x| $x > 1}", example: "ls | where type == file",
result: Some(Value::test_list(vec![Value::test_int(2)])), result: None,
}, },
Example { Example {
description: "List all files in the current directory with sizes greater than 2kb", description: "List all files in the current directory with sizes greater than 2kb",
@ -96,13 +104,8 @@ not supported."#
result: None, result: None,
}, },
Example { Example {
description: "List only the files in the current directory", description: r#"List all files with names that contain "Car""#,
example: "ls | where type == file", example: r#"ls | where name =~ "Car""#,
result: None,
},
Example {
description: "List all files with names that contain \"Car\"",
example: "ls | where name =~ \"Car\"",
result: None, result: None,
}, },
Example { Example {
@ -110,18 +113,36 @@ not supported."#
example: "ls | where modified >= (date now) - 2wk", example: "ls | where modified >= (date now) - 2wk",
result: None, result: None,
}, },
Example {
description: "Filter items of a list with a row condition",
example: "[1 2 3 4 5] | where $it > 2",
result: Some(Value::test_list(vec![
Value::test_int(3),
Value::test_int(4),
Value::test_int(5),
])),
},
Example {
description: "Filter items of a list with a closure",
example: "[1 2 3 4 5] | where {|x| $x > 2 }",
result: Some(Value::test_list(vec![
Value::test_int(3),
Value::test_int(4),
Value::test_int(5),
])),
},
Example { Example {
description: "Find files whose filenames don't begin with the correct sequential number", description: "Find files whose filenames don't begin with the correct sequential number",
example: "ls | where type == file | sort-by name --natural | enumerate | where {|e| $e.item.name !~ $'^($e.index + 1)' } | each {|| get item }", example: "ls | where type == file | sort-by name --natural | enumerate | where {|e| $e.item.name !~ $'^($e.index + 1)' } | get item",
result: None, result: None,
}, },
Example { Example {
description: r#"Find case-insensitively files called "readme", without an explicit closure"#, description: r#"Find case-insensitively files called "readme", with a subexpression inside the row condition"#,
example: "ls | where ($it.name | str downcase) =~ readme", example: "ls | where ($it.name | str downcase) =~ readme",
result: None, result: None,
}, },
Example { Example {
description: "same as above but with regex only", description: r#"Find case-insensitively files called "readme", with regex only"#,
example: "ls | where name =~ '(?i)readme'", example: "ls | where name =~ '(?i)readme'",
result: None, result: None,
}, },