From c34103c4936083c8abb28e379bc305059c5dcaaf Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 10 Sep 2025 16:24:34 +0100 Subject: [PATCH 1/9] ESQL query builder prototype --- src/Helper/Esql.php | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/Helper/Esql.php diff --git a/src/Helper/Esql.php b/src/Helper/Esql.php new file mode 100644 index 000000000..03012aab4 --- /dev/null +++ b/src/Helper/Esql.php @@ -0,0 +1,82 @@ +parent) { + $query .= $this->parent->render() . "\n| "; + } + $query .= $this->render_internal(); + return $query; + } + + protected abstract function render_internal(): string; + + public function __construct(ESQLBase $parent) + { + $this->parent = $parent; + } + + public function __toString(): string + { + return $this->render(); + } + + public function where(string ...$expressions): Where + { + return new Where($this, $expressions); + } +} + +class From extends ESQLBase { + private array $indices; + + public function __construct(array $indices) + { + $this->indices = $indices; + } + + protected function render_internal(): string + { + return "FROM " . implode(", ", $this->indices); + } +} + +class Where extends ESQLBase { + private array $expressions; + + public function __construct(ESQLBase $parent, array $expressions) + { + parent::__construct($parent); + $this->expressions = $expressions; + } + + protected function render_internal(): string + { + return "WHERE " . implode(" AND ", $this->expressions); + } +} From 04d3f816f5a8d1eb82b5167066b8ab87437ab058 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Thu, 11 Sep 2025 14:16:11 +0100 Subject: [PATCH 2/9] refactor into separate classes --- src/Helper/Esql.php | 82 -------------------------------- src/Helper/Esql/EsqlBase.php | 62 ++++++++++++++++++++++++ src/Helper/Esql/FromCommand.php | 29 +++++++++++ src/Helper/Esql/LimitCommand.php | 30 ++++++++++++ src/Helper/Esql/Query.php | 27 +++++++++++ src/Helper/Esql/RowCommand.php | 29 +++++++++++ src/Helper/Esql/WhereCommand.php | 30 ++++++++++++ 7 files changed, 207 insertions(+), 82 deletions(-) delete mode 100644 src/Helper/Esql.php create mode 100644 src/Helper/Esql/EsqlBase.php create mode 100644 src/Helper/Esql/FromCommand.php create mode 100644 src/Helper/Esql/LimitCommand.php create mode 100644 src/Helper/Esql/Query.php create mode 100644 src/Helper/Esql/RowCommand.php create mode 100644 src/Helper/Esql/WhereCommand.php diff --git a/src/Helper/Esql.php b/src/Helper/Esql.php deleted file mode 100644 index 03012aab4..000000000 --- a/src/Helper/Esql.php +++ /dev/null @@ -1,82 +0,0 @@ -parent) { - $query .= $this->parent->render() . "\n| "; - } - $query .= $this->render_internal(); - return $query; - } - - protected abstract function render_internal(): string; - - public function __construct(ESQLBase $parent) - { - $this->parent = $parent; - } - - public function __toString(): string - { - return $this->render(); - } - - public function where(string ...$expressions): Where - { - return new Where($this, $expressions); - } -} - -class From extends ESQLBase { - private array $indices; - - public function __construct(array $indices) - { - $this->indices = $indices; - } - - protected function render_internal(): string - { - return "FROM " . implode(", ", $this->indices); - } -} - -class Where extends ESQLBase { - private array $expressions; - - public function __construct(ESQLBase $parent, array $expressions) - { - parent::__construct($parent); - $this->expressions = $expressions; - } - - protected function render_internal(): string - { - return "WHERE " . implode(" AND ", $this->expressions); - } -} diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php new file mode 100644 index 000000000..084bc60bc --- /dev/null +++ b/src/Helper/Esql/EsqlBase.php @@ -0,0 +1,62 @@ +parent) { + $query .= $this->parent->render() . "\n| "; + } + $query .= $this->render_internal(); + return $query; + } + + protected abstract function render_internal(): string; + + public function __construct(EsqlBase $parent) + { + $this->parent = $parent; + } + + public function __toString(): string + { + return $this->render() . "\n"; + } + + public function limit(int $maxNumberOfRows): LimitCommand + { + return new LimitCommand($this, $maxNumberOfRows); + } + + public function where(string ...$expressions): WhereCommand + { + return new WhereCommand($this, $expressions); + } +} diff --git a/src/Helper/Esql/FromCommand.php b/src/Helper/Esql/FromCommand.php new file mode 100644 index 000000000..2f54d41f1 --- /dev/null +++ b/src/Helper/Esql/FromCommand.php @@ -0,0 +1,29 @@ +indices = $indices; + } + + protected function render_internal(): string + { + return "FROM " . implode(", ", $this->indices); + } +} diff --git a/src/Helper/Esql/LimitCommand.php b/src/Helper/Esql/LimitCommand.php new file mode 100644 index 000000000..ff0127b6d --- /dev/null +++ b/src/Helper/Esql/LimitCommand.php @@ -0,0 +1,30 @@ +maxNumberOfRows = $maxNumberOfRows; + } + + protected function render_internal(): string + { + return "LIMIT " . json_encode($this->maxNumberOfRows); + } +} diff --git a/src/Helper/Esql/Query.php b/src/Helper/Esql/Query.php new file mode 100644 index 000000000..f40d0dea0 --- /dev/null +++ b/src/Helper/Esql/Query.php @@ -0,0 +1,27 @@ +params = $params; + } + + protected function render_internal(): string + { + return "ROW " . $this->format_kv($this->params); + } +} diff --git a/src/Helper/Esql/WhereCommand.php b/src/Helper/Esql/WhereCommand.php new file mode 100644 index 000000000..9ef89145e --- /dev/null +++ b/src/Helper/Esql/WhereCommand.php @@ -0,0 +1,30 @@ +expressions = $expressions; + } + + protected function render_internal(): string + { + return "WHERE " . implode(" AND ", $this->expressions); + } +} From da9f861278bd6572828a7cbb45064e5b02857d46 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Tue, 7 Oct 2025 14:52:22 +0100 Subject: [PATCH 3/9] add remaining commands --- src/Helper/Esql/Branch.php | 33 ++ src/Helper/Esql/ChangePointCommand.php | 72 +++ src/Helper/Esql/CompletionCommand.php | 74 ++++ src/Helper/Esql/DissectCommand.php | 52 +++ src/Helper/Esql/DropCommand.php | 38 ++ src/Helper/Esql/EnrichCommand.php | 92 ++++ src/Helper/Esql/EsqlBase.php | 579 ++++++++++++++++++++++++- src/Helper/Esql/EvalCommand.php | 54 +++ src/Helper/Esql/ForkCommand.php | 58 +++ src/Helper/Esql/GrokCommand.php | 38 ++ src/Helper/Esql/KeepCommand.php | 38 ++ src/Helper/Esql/LimitCommand.php | 14 +- src/Helper/Esql/LookupJoinCommand.php | 58 +++ src/Helper/Esql/MvExpandCommand.php | 36 ++ src/Helper/Esql/Query.php | 58 +++ src/Helper/Esql/RenameCommand.php | 49 +++ src/Helper/Esql/RerankCommand.php | 96 ++++ src/Helper/Esql/RowCommand.php | 6 + src/Helper/Esql/SampleCommand.php | 36 ++ src/Helper/Esql/ShowCommand.php | 35 ++ src/Helper/Esql/SortCommand.php | 42 ++ src/Helper/Esql/StatsCommand.php | 74 ++++ src/Helper/Esql/WhereCommand.php | 6 + 23 files changed, 1631 insertions(+), 7 deletions(-) create mode 100644 src/Helper/Esql/Branch.php create mode 100644 src/Helper/Esql/ChangePointCommand.php create mode 100644 src/Helper/Esql/CompletionCommand.php create mode 100644 src/Helper/Esql/DissectCommand.php create mode 100644 src/Helper/Esql/DropCommand.php create mode 100644 src/Helper/Esql/EnrichCommand.php create mode 100644 src/Helper/Esql/EvalCommand.php create mode 100644 src/Helper/Esql/ForkCommand.php create mode 100644 src/Helper/Esql/GrokCommand.php create mode 100644 src/Helper/Esql/KeepCommand.php create mode 100644 src/Helper/Esql/LookupJoinCommand.php create mode 100644 src/Helper/Esql/MvExpandCommand.php create mode 100644 src/Helper/Esql/RenameCommand.php create mode 100644 src/Helper/Esql/RerankCommand.php create mode 100644 src/Helper/Esql/SampleCommand.php create mode 100644 src/Helper/Esql/ShowCommand.php create mode 100644 src/Helper/Esql/SortCommand.php create mode 100644 src/Helper/Esql/StatsCommand.php diff --git a/src/Helper/Esql/Branch.php b/src/Helper/Esql/Branch.php new file mode 100644 index 000000000..d6ce167e8 --- /dev/null +++ b/src/Helper/Esql/Branch.php @@ -0,0 +1,33 @@ +value = $value; + } + + /** + * Continuation of the `CHANGE_POINT` command. + * + * @param string $key The column with the key to order the values by. If not + * specified, `@timestamp` is used. + */ + public function on(string $key): ChangePointCommand + { + $this->key = $key; + return $this; + } + + /** + * Continuation of the `CHANGE_POINT` command. + * + * @param string $type_name The name of the output column with the change + * point type. If not specified, `type` is used. + * @param string $pvalue_name The name of the output column with the p-value + * that indicates how extreme the change point is. + * If not specified, `pvalue` is used. + */ + public function as(string $type_name, string $pvalue_name): ChangePointCommand + { + $this->type_name = $type_name; + $this->pvalue_name = $pvalue_name; + return $this; + } + + protected function render_internal(): string + { + $key = $this->key ? " ON " . $this->format_id($this->key) : ""; + $names = ($this->type_name && $this->pvalue_name) ? + " AS " . $this->format_id($this->type_name) . ", " . + $this->format_id($this->pvalue_name) + : ""; + return "CHANGE_POINT " . $this->value . $key . $names; + } +} diff --git a/src/Helper/Esql/CompletionCommand.php b/src/Helper/Esql/CompletionCommand.php new file mode 100644 index 000000000..a68fcb560 --- /dev/null +++ b/src/Helper/Esql/CompletionCommand.php @@ -0,0 +1,74 @@ +is_named_argument_list($prompt)) { + $this->named_prompt = $prompt; + } + else { + $this->prompt = $prompt[0]; + } + } + + /** + * Continuation of the `COMPLETION` command. + * + * @param string $inference_id The ID of the inference endpoint to use for + * the task. The inference endpoint must be + * configured with the `completion` task type. + */ + public function with(string $inference_id): CompletionCommand + { + $this->inference_id = $inference_id; + return $this; + } + + protected function render_internal(): string + { + if (!$this->inference_id) { + throw new RuntimeException("The completion command requires an inference ID"); + } + $with = ["inference_id" => $this->inference_id]; + if ($this->named_prompt) { + return "COMPLETION " . + $this->format_id(array_keys($this->named_prompt)[0]) . " = " . + $this->format_id(array_values($this->named_prompt)[0]) . + " WITH " . json_encode($with); + } + else { + return "COMPLETION " . $this->format_id($this->prompt) . + " WITH " . json_encode($with); + } + } +} diff --git a/src/Helper/Esql/DissectCommand.php b/src/Helper/Esql/DissectCommand.php new file mode 100644 index 000000000..1faefaaeb --- /dev/null +++ b/src/Helper/Esql/DissectCommand.php @@ -0,0 +1,52 @@ +input = $input; + $this->pattern = $pattern; + } + + /** + * Continuation of the `DISSECT` command. + * + * @param string $separator A string used as the separator between appended + * values, when using the append modifier. + */ + public function append_separator(string $separator): DissectCommand + { + $this->separator = $separator; + return $this; + } + + protected function render_internal(): string + { + $sep = $this->separator ? " APPEND_SEPARATOR=" . json_encode($this->separator) : ""; + return "DISSECT " . $this->format_id($this->input) . " " . json_encode($this->pattern) . $sep; + } +} diff --git a/src/Helper/Esql/DropCommand.php b/src/Helper/Esql/DropCommand.php new file mode 100644 index 000000000..0b55bde21 --- /dev/null +++ b/src/Helper/Esql/DropCommand.php @@ -0,0 +1,38 @@ +columns = $columns; + } + + protected function render_internal(): string + { + return "DROP " . implode( + ", ", array_map(array($this, "format_id"), $this->columns) + ); + } +} diff --git a/src/Helper/Esql/EnrichCommand.php b/src/Helper/Esql/EnrichCommand.php new file mode 100644 index 000000000..bde7fd795 --- /dev/null +++ b/src/Helper/Esql/EnrichCommand.php @@ -0,0 +1,92 @@ +policy = $policy; + } + + /** + * Continuation of the `ENRICH` command. + * + * @param string $match_field The match field. `ENRICH` uses its value to + * look for records in the enrich index. If not + * specified, the match will be performed on the + * column with the same name as the `match_field` + * defined in the enrich policy. + */ + public function on(string $match_field): EnrichCommand + { + $this->match_field = $match_field; + return $this; + } + + /** + * Continuation of the `ENRICH` command. + * + * @param string ...$fields The enrich fields from the enrich index that + * are added to the result as new columns, given + * as positional or named arguments. If a column + * with the same name as the enrich field already + * exists, the existing column will be replaced by + * the new column. If not specified, each of the + * enrich fields defined in the policy is added. A + * column with the same name as the enrich field + * will be dropped unless the enrich field is + * renamed. + */ + public function with(string ...$fields): EnrichCommand + { + if ($this->is_named_argument_list($fields)) { + $this->named_fields = $fields; + } + else { + $this->fields = $fields; + } + return $this; + } + + protected function render_internal(): string + { + $on = $this->match_field ? " ON " . $this->format_id($this->match_field) : ""; + if ($this->named_fields) { + $items = array_map( + function(string $key): string { + return $this->format_id($key) . " = " . + $this->format_id($this->named_fields[$key]); + }, + array_keys($this->named_fields) + ); + } + else { + $items = array_map(fn($value): string => $this->format_id($value), $this->fields); + } + return "ENRICH " . $this->policy . implode(", ", $items); + } +} diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php index 084bc60bc..fb78ea38f 100644 --- a/src/Helper/Esql/EsqlBase.php +++ b/src/Helper/Esql/EsqlBase.php @@ -14,6 +14,8 @@ namespace Elastic\Elasticsearch\Helper\Esql; +use RuntimeException; + abstract class EsqlBase { private ?EsqlBase $parent = null; @@ -40,7 +42,7 @@ public function render(): string protected abstract function render_internal(): string; - public function __construct(EsqlBase $parent) + public function __construct(?EsqlBase $parent) { $this->parent = $parent; } @@ -50,11 +52,582 @@ public function __toString(): string return $this->render() . "\n"; } - public function limit(int $maxNumberOfRows): LimitCommand + protected function is_named_argument_list(array $args): bool { + $named_count = array_sum(array_map('is_string', array_keys($args))); + if ($named_count == sizeof($args)) { + return true; + } + if ($named_count != 0) { + throw new RuntimeException("foo"); + } + return false; + } + + protected function format_id(string $id, bool $allow_patterns = false): string + { + if ($allow_patterns && str_contains($id, "*")) { + // patterns cannot be escaped + return $id; + } + if (preg_match("/[A-Za-z_@][A-Za-z0-9_\\.]*/", $id)) { + // all safe characters, so no need to escape + return $id; + } + // apply escaping + return "`" . str_replace("`", "``", $id) . "`"; + } + + protected function is_forked(): bool + { + if (get_class($this) == "ForkCommand") { + return true; + } + if ($this->parent) { + return $this->parent->is_forked(); + } + return false; + } + + /** + * `CHANGE_POINT` detects spikes, dips, and change points in a metric. + * + * @param string $value The column with the metric in which you want to + * detect a change point. + * + * Examples: + * + * query = ( + * ESQL.row(key=list(range(1, 26))) + * .mv_expand("key") + * .eval(value=functions.case("key<13", 0, 42)) + * .change_point("value") + * .on("key") + * .where("type IS NOT NULL") + * ) + */ + public function change_point(string $value): ChangePointCommand + { + return new ChangePointCommand($this, $value); + } + + /** + * The `COMPLETION` command allows you to send prompts and context to a Large + * Language Model (LLM) directly within your ES|QL queries, to perform text + * generation tasks. + * + * @param string ...$prompt The input text or expression used to prompt the + * LLM. This can be a string literal or a reference + * to a column containing text. If the prompt is + * given as a positional argument, the results will + * be stored in a column named `completion`. If + * given as a named argument, the given name will + * be used. If the specified column already exists, + * it will be overwritten with the new results. + * + * Examples: + * + * query1 = ( + * ESQL.row(question="What is Elasticsearch?") + * .completion("question").with_("test_completion_model") + * .keep("question", "completion") + * ) + * query2 = ( + * ESQL.row(question="What is Elasticsearch?") + * .completion(answer="question").with_("test_completion_model") + * .keep("question", "answer") + * ) + * query3 = ( + * ESQL.from_("movies") + * .sort("rating DESC") + * .limit(10) + * .eval(prompt=\"\"\"CONCAT( + * "Summarize this movie using the following information: \\n", + * "Title: ", title, "\\n", + * "Synopsis: ", synopsis, "\\n", + * "Actors: ", MV_CONCAT(actors, ", "), "\\n", + * )\"\"\") + * .completion(summary="prompt").with_("test_completion_model") + * .keep("title", "summary", "rating") + * ) + */ + public function completion(string ...$prompt): CompletionCommand + { + return new CompletionCommand($this, $prompt); + } + + /** + * `DISSECT` enables you to extract structured data out of a string. + * + * @param string $input The column that contains the string you want to + * structure. If the column has multiple values, + * `DISSECT` will process each value. + * @param string $pattern A dissect pattern. If a field name conflicts with + * an existing column, the existing column is + * dropped. If a field name is used more than once, + * only the rightmost duplicate creates a column. + * + * Examples: + * + * query = ( + * ESQL.row(a="2023-01-23T12:15:00.000Z - some text - 127.0.0.1") + * .dissect("a", "%{date} - %{msg} - %{ip}") + * .keep("date", "msg", "ip") + * .eval(date="TO_DATETIME(date)") + * ) + */ + public function dissect(string $input, string $pattern): DissectCommand + { + return new DissectCommand($this, $input, $pattern); + } + + /** + * The `DROP` processing command removes one or more columns. + * + * @param string ...$columns The columns to drop, given as positional + * arguments. Supports wildcards. + * + * Examples: + * + * query1 = ESQL.from_("employees").drop("height") + * query2 = ESQL.from_("employees").drop("height*") + */ + public function drop(string ...$columns): DropCommand + { + return new DropCommand($this, $columns); + } + + /** + * `ENRICH` enables you to add data from existing indices as new columns using an + * enrich policy. + * + * @param string $policy The name of the enrich policy. You need to create + * and execute the enrich policy first. + * + * Examples: + * + * query1 = ( + * ESQL.row(a="1") + * .enrich("languages_policy").on("a").with_("language_name") + * ) + * query2 = ( + * ESQL.row(a="1") + * .enrich("languages_policy").on("a").with_(name="language_name") + * ) + */ + public function enrich(string $policy): EnrichCommand + { + return new EnrichCommand($this, $policy); + } + + /** + * The `EVAL` processing command enables you to append new columns with calculated + * values. + * + * @param string ...$columns The values for the columns, given as positional + * or named arguments. Can be literals, expressions, + * or functions. Can use columns defined left of + * this one. When given as named arguments, the + * names are used as column names in the results. + * If a column with the same name already exists, + * the existing column is dropped. If a column name + * is used more than once, only the rightmost + * duplicate creates a column. + * + * Examples: + * + * query1 = ( + * ESQL.from_("employees") + * .sort("emp_no") + * .keep("first_name", "last_name", "height") + * .eval(height_feet="height * 3.281", height_cm="height * 100") + * ) + * query2 = ( + * ESQL.from_("employees") + * .eval("height * 3.281") + * .stats(avg_height_feet=functions.avg("`height * 3.281`")) + * ) + */ + public function eval(string ...$columns): EvalCommand + { + return new EvalCommand($this, $columns); + } + + /** + * The `FORK` processing command creates multiple execution branches to operate on the + * same input data and combines the results in a single output table. + * + * @param EsqlBase $fork1 Up to 8 execution branches, created with the + * `Query.branch()` method. + * + * Examples: + * + * query = ( + * ESQL.from_("employees") + * .fork( + * ESQL.branch().where("emp_no == 10001"), + * ESQL.branch().where("emp_no == 10002"), + * ) + * .keep("emp_no", "_fork") + * .sort("emp_no") + * ) + */ + public function fork( + EsqlBase $fork1, + ?EsqlBase $fork2 = null, + ?EsqlBase $fork3 = null, + ?EsqlBase $fork4 = null, + ?EsqlBase $fork5 = null, + ?EsqlBase $fork6 = null, + ?EsqlBase $fork7 = null, + ?EsqlBase $fork8 = null, + ): ForkCommand + { + if ($this->is_forked()) { + throw new RuntimeException("a query can only have one fork"); + } + return new ForkCommand($this, $fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8); + } + + /** + * `GROK` enables you to extract structured data out of a string. + * + * @param string $input The column that contains the string you want to + * structure. If the column has multiple values, `GROK` + * will process each value. + * @param string $pattern A grok pattern. If a field name conflicts with an + * existing column, the existing column is discarded. + * If a field name is used more than once, a + * multi-valued column will be created with one value + * per each occurrence of the field name. + * + * Examples: + * + * query1 = ( + * ESQL.row(a="2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + * .grok("a", "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}") + * .keep("date", "ip", "email", "num") + * ) + * query2 = ( + * ESQL.row(a="2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + * .grok( + * "a", + * "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}", + * ) + * .keep("date", "ip", "email", "num") + * .eval(date=functions.to_datetime("date")) + * ) + * query3 = ( + * ESQL.from_("addresses") + * .keep("city.name", "zip_code") + * .grok("zip_code", "%{WORD:zip_parts} %{WORD:zip_parts}") + * ) + */ + public function grok(string $input, string $pattern): GrokCommand + { + return new GrokCommand($this, $input, $pattern); + } + + /** + * The `KEEP` processing command enables you to specify what columns are returned + * and the order in which they are returned. + * + * @param string ...$columns The columns to keep, given as positional + * arguments. Supports wildcards. + * + * Examples: + * + * query1 = ESQL.from_("employees").keep("emp_no", "first_name", "last_name", "height") + * query2 = ESQL.from_("employees").keep("h*") + * query3 = ESQL.from_("employees").keep("h*", "*") + */ + public function keep(string ...$columns): KeepCommand + { + return new KeepCommand($this, $columns); + } + + /** + * The `LIMIT` processing command enables you to limit the number of rows that are + * returned. + * + * @param int $max_number_of_rows The maximum number of rows to return. + * + * Examples: + * + * query1 = ESQL.from_("employees").sort("emp_no ASC").limit(5) + * query2 = ESQL.from_("index").stats(functions.avg("field1")).by("field2").limit(20000) + */ + public function limit(int $max_number_of_rows): LimitCommand + { + return new LimitCommand($this, $max_number_of_rows); + } + + /** + * `LOOKUP JOIN` enables you to add data from another index, AKA a 'lookup' index, + * to your ES|QL query results, simplifying data enrichment and analysis workflows. + * + * @param string $lookup_index The name of the lookup index. This must be a + * specific index name - wildcards, aliases, and + * remote cluster references are not supported. + * Indices used for lookups must be configured + * with the lookup index mode. + * + * Examples: + * + * query1 = ( + * ESQL.from_("firewall_logs") + * .lookup_join("threat_list").on("source.IP") + * .where("threat_level IS NOT NULL") + * ) + * query2 = ( + * ESQL.from_("system_metrics") + * .lookup_join("host_inventory").on("host.name") + * .lookup_join("ownerships").on("host.name") + * ) + * query3 = ( + * ESQL.from_("app_logs") + * .lookup_join("service_owners").on("service_id") + * ) + * query4 = ( + * ESQL.from_("employees") + * .eval(language_code="languages") + * .where("emp_no >= 10091 AND emp_no < 10094") + * .lookup_join("languages_lookup").on("language_code") + * ) + */ + public function lookup_join(string $lookup_index): LookupJoinCommand + { + return new LookupJoinCommand($this, $lookup_index); + } + + /** + * The `MV_EXPAND` processing command expands multivalued columns into one row per + * value, duplicating other columns. + * + * @param string $column The multivalued column to expand. + * + * Examples: + * + * query = ESQL.row(a=[1, 2, 3], b="b", j=["a", "b"]).mv_expand("a") + */ + public function mv_expand(string $column): MvExpandCommand + { + return new MvExpandCommand($this, $column); + } + + /** + * The `RENAME` processing command renames one or more columns. + * + * @param string ...$columns The old and new column name pairs, given as + * named arguments. If a name conflicts with an + * existing column name, the existing column is + * dropped. If multiple columns are renamed to the + * same name, all but the rightmost column with + * the same new name are dropped. + * + * Examples: + * + * query = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "still_hired") + * .rename(still_hired="employed") + * ) + */ + public function rename(string ...$columns): RenameCommand + { + return new RenameCommand($this, $columns); + } + + /** + * The `RERANK` command uses an inference model to compute a new relevance score + * for an initial set of documents, directly within your ES|QL queries. + * + * @param string ...$query The query text used to rerank the documents. + * This is typically the same query used in the + * initial search. If given as a named argument, The + * argument name is used for the column name. If the + * query is given as a positional argument, the + * results will be stored in a column named `_score`. + * If the specified column already exists, it will + * be overwritten with the new results. + * + * Examples: + * + * query1 = ( + * ESQL.from_("books").metadata("_score") + * .where('MATCH(description, "hobbit")') + * .sort("_score DESC") + * .limit(100) + * .rerank("hobbit").on("description").with_(inference_id="test_reranker") + * .limit(3) + * .keep("title", "_score") + * ) + * query2 = ( + * ESQL.from_("books").metadata("_score") + * .where('MATCH(description, "hobbit") OR MATCH(author, "Tolkien")') + * .sort("_score DESC") + * .limit(100) + * .rerank(rerank_score="hobbit").on("description", "author").with_(inference_id="test_reranker") + * .sort("rerank_score") + * .limit(3) + * .keep("title", "_score", "rerank_score") + * ) + * query3 = ( + * ESQL.from_("books").metadata("_score") + * .where('MATCH(description, "hobbit") OR MATCH(author, "Tolkien")') + * .sort("_score DESC") + * .limit(100) + * .rerank(rerank_score="hobbit").on("description", "author").with_(inference_id="test_reranker") + * .eval(original_score="_score", _score="rerank_score + original_score") + * .sort("_score") + * .limit(3) + * .keep("title", "original_score", "rerank_score", "_score") + * ) + */ + public function rerank(string ...$query): RerankCommand + { + return new RerankCommand($this, $query); + } + + /** + * The `SAMPLE` command samples a fraction of the table rows. + * + * @param float $probability The probability that a row is included in the + * sample. The value must be between 0 and 1, + * exclusive. + * + * Examples: + * + * query = ESQL.from_("employees").keep("emp_no").sample(0.05) + */ + public function sample(float $probability): SampleCommand + { + return new SampleCommand($this, $probability); + } + + /** + * The `SORT` processing command sorts a table on one or more columns. + * + * @param string ...$columns: The columns to sort on. + * + * Examples: + * + * query1 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "height") + * .sort("height") + * ) + * query2 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "height") + * .sort("height DESC") + * ) + * query3 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "height") + * .sort("height DESC", "first_name ASC") + * ) + * query4 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "height") + * .sort("first_name ASC NULLS FIRST") + * ) + */ + public function sort(string ...$columns): SortCommand + { + return new SortCommand($this, $columns); + } + + /** + * The `STATS` processing command groups rows according to a common value and + * calculates one or more aggregated values over the grouped rows. + * + * @param string ...$expressions A list of expressions, given as positional + * or named arguments. The argument names are + * used for the returned aggregated values. + * + * Note that only one of `expressions` and `named_expressions` must be provided. + * + * Examples: + * + * query1 = ( + * ESQL.from_("employees") + * .stats(count=functions.count("emp_no")).by("languages") + * .sort("languages") + * ) + * query2 = ( + * ESQL.from_("employees") + * .stats(avg_lang=functions.avg("languages")) + * ) + * query3 = ( + * ESQL.from_("employees") + * .stats( + * avg_lang=functions.avg("languages"), + * max_lang=functions.max("languages") + * ) + * ) + * query4 = ( + * ESQL.from_("employees") + * .stats( + * avg50s=functions.avg("salary").where('birth_date < "1960-01-01"'), + * avg60s=functions.avg("salary").where('birth_date >= "1960-01-01"'), + * ).by("gender") + * .sort("gender") + * ) + * query5 = ( + * ESQL.from_("employees") + * .eval(Ks="salary / 1000") + * .stats( + * under_40K=functions.count("*").where("Ks < 40"), + * inbetween=functions.count("*").where("40 <= Ks AND Ks < 60"), + * over_60K=functions.count("*").where("60 <= Ks"), + * total=f.count("*") + * ) + * ) + * query6 = ( + * ESQL.row(i=1, a=["a", "b"]) + * .stats(functions.min("i")).by("a") + * .sort("a ASC") + * ) + * query7 = ( + * ESQL.from_("employees") + * .eval(hired=functions.date_format("hire_date", "yyyy")) + * .stats(avg_salary=functions.avg("salary")).by("hired", "languages.long") + * .eval(avg_salary=functions.round("avg_salary")) + * .sort("hired", "languages.long") + * + * ) + */ + public function stats(string ...$expressions): StatsCommand { - return new LimitCommand($this, $maxNumberOfRows); + return new StatsCommand($this, $expressions); } + /** + * The `WHERE` processing command produces a table that contains all the rows + * from the input table for which the provided condition evaluates to `true`. + * + * @param string ...$expressions A list of boolean expressions, given as + * positional or named arguments. These + * expressions are combined with an `AND` + * logical operator. + * + * Examples: + * + * query1 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "still_hired") + * .where("still_hired == true") + * ) + * query2 = ( + * ESQL.from_("sample_data") + * .where("@timestamp > NOW() - 1 hour") + * ) + * query3 = ( + * ESQL.from_("employees") + * .keep("first_name", "last_name", "height") + * .where("LENGTH(first_name) < 4") + * ) + */ public function where(string ...$expressions): WhereCommand { return new WhereCommand($this, $expressions); diff --git a/src/Helper/Esql/EvalCommand.php b/src/Helper/Esql/EvalCommand.php new file mode 100644 index 000000000..c6ad72681 --- /dev/null +++ b/src/Helper/Esql/EvalCommand.php @@ -0,0 +1,54 @@ +is_named_argument_list($columns)) { + $this->named_columns = $columns; + } + else { + $this->columns = $columns; + } + } + + protected function render_internal(): string + { + if ($this->named_columns) { + $items = array_map( + function(string $key): string { + return $this->format_id($key) . " = " . + $this->format_id($this->named_columns[$key]); + }, + array_keys($this->named_columns) + ); + } + else { + $items = array_map(fn($value): string => $this->format_id($value), $this->columns); + } + return "EVAL " . implode(", ", $items); + } +} diff --git a/src/Helper/Esql/ForkCommand.php b/src/Helper/Esql/ForkCommand.php new file mode 100644 index 000000000..dcbe92c59 --- /dev/null +++ b/src/Helper/Esql/ForkCommand.php @@ -0,0 +1,58 @@ +branches = [$fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8]; + } + + protected function render_internal(): string + { + $cmds = ""; + foreach ($this->branches as $branch) { + if ($branch) { + $cmd = str_replace("\n", " ", substr($branch->render(), 3)); + if ($cmds == "") { + $cmds = "( " . $cmd . " )"; + } + else { + $cmds += "\n ( " . $cmd . " )"; + } + } + } + return "FORK " . $cmds; + } +} diff --git a/src/Helper/Esql/GrokCommand.php b/src/Helper/Esql/GrokCommand.php new file mode 100644 index 000000000..ea3accd9b --- /dev/null +++ b/src/Helper/Esql/GrokCommand.php @@ -0,0 +1,38 @@ +input = $input; + $this->pattern = $pattern; + } + + protected function render_internal(): string + { + return "GROK " . $this->format_id($this->input) . " " . json_encode($this->pattern); + } +} diff --git a/src/Helper/Esql/KeepCommand.php b/src/Helper/Esql/KeepCommand.php new file mode 100644 index 000000000..e8350cac1 --- /dev/null +++ b/src/Helper/Esql/KeepCommand.php @@ -0,0 +1,38 @@ +columns = $columns; + } + + protected function render_internal(): string + { + return "KEEP " . implode( + ", ", array_map(array($this, "format_id"), $this->columns) + ); + } +} diff --git a/src/Helper/Esql/LimitCommand.php b/src/Helper/Esql/LimitCommand.php index ff0127b6d..ed98aa177 100644 --- a/src/Helper/Esql/LimitCommand.php +++ b/src/Helper/Esql/LimitCommand.php @@ -14,17 +14,23 @@ namespace Elastic\Elasticsearch\Helper\Esql; +/** + * Implementation of the `LIMIT` processing command. + * + * This class inherits from EsqlBase to make it possible to chain all the commands + * that belong to an ES|QL query in a single expression. + */ class LimitCommand extends EsqlBase { - private int $maxNumberOfRows; + private int $max_number_of_rows; - public function __construct(EsqlBase $parent, int $maxNumberOfRows) + public function __construct(EsqlBase $parent, int $max_number_of_rows) { parent::__construct($parent); - $this->maxNumberOfRows = $maxNumberOfRows; + $this->max_number_of_rows = $max_number_of_rows; } protected function render_internal(): string { - return "LIMIT " . json_encode($this->maxNumberOfRows); + return "LIMIT " . json_encode($this->max_number_of_rows); } } diff --git a/src/Helper/Esql/LookupJoinCommand.php b/src/Helper/Esql/LookupJoinCommand.php new file mode 100644 index 000000000..5c7a4e6ae --- /dev/null +++ b/src/Helper/Esql/LookupJoinCommand.php @@ -0,0 +1,58 @@ +lookup_index = $lookup_index; + } + + /** + * Continuation of the `LOOKUP_JOIN` command. + * + * @param string $field The field to join on. This field must exist in both + * your current query results and in the lookup index. + * If the field contains multi-valued entries, those + * entries will not match anything (the added fields + * will contain null for those rows). + */ + public function on(string $field): LookupJoinCommand + { + $this->field = $field; + return $this; + } + + protected function render_internal(): string + { + if (!$this->field) { + throw new RuntimeException ("Joins require a field to join on."); + } + return "LOOKUP JOIN " . $this->lookup_index . + " ON " . $this->format_id($this->field); + } +} diff --git a/src/Helper/Esql/MvExpandCommand.php b/src/Helper/Esql/MvExpandCommand.php new file mode 100644 index 000000000..c49326765 --- /dev/null +++ b/src/Helper/Esql/MvExpandCommand.php @@ -0,0 +1,36 @@ +column = $column; + } + + protected function render_internal(): string + { + return "MV_EXPAND " . $this->format_id($this->column); + } +} diff --git a/src/Helper/Esql/Query.php b/src/Helper/Esql/Query.php index f40d0dea0..8bf80a87a 100644 --- a/src/Helper/Esql/Query.php +++ b/src/Helper/Esql/Query.php @@ -15,13 +15,71 @@ namespace Elastic\Elasticsearch\Helper\Esql; abstract class Query { + /** + * The `FROM` source command returns a table with data from a data stream, + * index, or alias. + * + * @param string $indices A list of indices, data streams or aliases. Supports + * wildcards and date math. + * + * Examples: + * + * query1 = ESQL.from_("employees") + * query2 = ESQL.from_("") + * query3 = ESQL.from_("employees-00001", "other-employees-*") + * query4 = ESQL.from_("cluster_one:employees-00001", "cluster_two:other-employees-*") + * query5 = ESQL.from_("employees").metadata("_id") + */ public static function from(string ...$indices): FromCommand { return new FromCommand($indices); } + /** + * The ``ROW`` source command produces a row with one or more columns with + * values that you specify. This can be useful for testing. + * + * @param string ...$params the column values to produce, given as keyword + * arguments. + * + * Examples: + * + * query1 = ESQL.row(a=1, b="two", c=None) + * query2 = ESQL.row(a=[1, 2]) + * query3 = ESQL.row(a=functions.round(1.23, 0)) + */ public static function row(string ...$params): RowCommand { return new RowCommand($params); } + + /** + * The `SHOW` source command returns information about the deployment and + * its capabilities. + * + * @param string $item Can only be `INFO`. + * + * Examples: + * + * query = ESQL.show("INFO") + */ + public static function show(string $item): ShowCommand + { + return new ShowCommand($item); + } + + /** + * This method can only be used inside a `FORK` command to create each branch. + * + * Examples: + * + * query = ESQL.from_("employees").fork( + * ESQL.branch().where("emp_no == 10001"), + * ESQL.branch().where("emp_no == 10002"), + * ) + */ + public static function branch(): Branch + { + return new Branch(); + } } diff --git a/src/Helper/Esql/RenameCommand.php b/src/Helper/Esql/RenameCommand.php new file mode 100644 index 000000000..f18f7875c --- /dev/null +++ b/src/Helper/Esql/RenameCommand.php @@ -0,0 +1,49 @@ +is_named_argument_list($columns)) { + throw new RuntimeException("Only named arguments are valid"); + } + parent::__construct($parent); + $this->named_columns = $columns; + } + + protected function render_internal(): string + { + $items = array_map( + function(string $key): string { + return $this->format_id($key) . " AS " . + $this->format_id($this->named_columns[$key]); + }, + array_keys($this->named_columns) + ); + + return "RENAME " . implode(", ", $items); + } +} diff --git a/src/Helper/Esql/RerankCommand.php b/src/Helper/Esql/RerankCommand.php new file mode 100644 index 000000000..f759817a2 --- /dev/null +++ b/src/Helper/Esql/RerankCommand.php @@ -0,0 +1,96 @@ +is_named_argument_list($query)) { + $this->named_query = $query; + } + else { + $this->query = $query[0]; + } + } + + /** + * Continuation of the `RERANK` command. + * + * @param string ...$fields One or more fields to use for reranking. These + * fields should contain the text that the + * reranking model will evaluate. + */ + public function on(string ...$fields): RerankCommand + { + $this->fields = $fields; + return $this; + } + + /** + * Continuation of the `RERANK` command. + * + * @param string $inference_id The ID of the inference endpoint to use for + * the task. The inference endpoint must be + * configured with the `rerank` task type. + */ + public function with(string $inference_id): RerankCommand + { + $this->inference_id = $inference_id; + return $this; + } + + protected function render_internal(): string + { + if (!$this->fields) { + throw new RuntimeException( + "The rerank command requires one or more fields to rerank on" + ); + } + if (!$this->inference_id) { + throw new RuntimeException( + "The rerank command requires an inference ID" + ); + } + $with = ["inference_id" => $this->inference_id]; + if ($this->named_query) { + $column = array_keys($this->named_query)[0]; + $value = array_values($this->named_query)[0]; + $query = $this->format_id($column) . " = " . json_encode($value); + } + else { + $query = json_encode($this->query); + } + return "RERANK " . $query . + " ON " . implode(", ", array_map(array($this, "format_id"), $this->fields)) . + "WITH " . json_encode($with); + } +} diff --git a/src/Helper/Esql/RowCommand.php b/src/Helper/Esql/RowCommand.php index 9c18e3ed1..fb6cd604d 100644 --- a/src/Helper/Esql/RowCommand.php +++ b/src/Helper/Esql/RowCommand.php @@ -14,6 +14,12 @@ namespace Elastic\Elasticsearch\Helper\Esql; +/** + * Implementation of the `ROW` source command. + * + * This class inherits from EsqlBase to make it possible to chain all the commands + * that belong to an ES|QL query in a single expression. + */ class RowCommand extends EsqlBase { private array $params; diff --git a/src/Helper/Esql/SampleCommand.php b/src/Helper/Esql/SampleCommand.php new file mode 100644 index 000000000..08cf4ba4d --- /dev/null +++ b/src/Helper/Esql/SampleCommand.php @@ -0,0 +1,36 @@ +probability = $probability; + } + + protected function render_internal(): string + { + return "SAMPLE " . json_encode($this->probability); + } +} diff --git a/src/Helper/Esql/ShowCommand.php b/src/Helper/Esql/ShowCommand.php new file mode 100644 index 000000000..ad04eb179 --- /dev/null +++ b/src/Helper/Esql/ShowCommand.php @@ -0,0 +1,35 @@ +item = $item; + } + + protected function render_internal(): string + { + return "SHOW " . $this->format_id($this->item); + } +} diff --git a/src/Helper/Esql/SortCommand.php b/src/Helper/Esql/SortCommand.php new file mode 100644 index 000000000..1ce72ab53 --- /dev/null +++ b/src/Helper/Esql/SortCommand.php @@ -0,0 +1,42 @@ +columns = $columns; + } + + protected function render_internal(): string + { + $sorts = []; + foreach ($this->columns as $column) { + array_push($sorts, implode( + " ", array_map(array($this, "format_id"), str_split($column)) + )); + } + return "SORT " . implode(", ", $sorts); + } +} diff --git a/src/Helper/Esql/StatsCommand.php b/src/Helper/Esql/StatsCommand.php new file mode 100644 index 000000000..764d31b24 --- /dev/null +++ b/src/Helper/Esql/StatsCommand.php @@ -0,0 +1,74 @@ +is_named_argument_list($expressions)) { + $this->named_expressions = $expressions; + } + else { + $this->expressions = $expressions; + } + } + + /** + * Continuation of the `STATS` command. + * + * @param string ...$grouping_expressions Expressions that output the values + * to group by. If their names + * coincides with one of the computed + * columns, that column will be + * ignored. + */ + public function by(string ...$grouping_expressions): StatsCommand + { + $this->grouping_expressions = $grouping_expressions; + return $this; + } + + protected function render_internal(): string + { + if ($this->named_expressions) { + $items = array_map( + function(string $key): string { + return $this->format_id($key) . " = " . + $this->format_id($this->named_expressions[$key]); + }, + array_keys($this->named_expressions) + ); + } + else { + $items = array_map(fn($value): string => $this->format_id($value), $this->expressions); + } + $by = ""; + if ($this->grouping_expressions) { + $by = "\n BY " . implode(", ", $this->grouping_expressions); + } + return "STATS " . implode(",\n ", $items) . $by; + } +} diff --git a/src/Helper/Esql/WhereCommand.php b/src/Helper/Esql/WhereCommand.php index 9ef89145e..7501dbee1 100644 --- a/src/Helper/Esql/WhereCommand.php +++ b/src/Helper/Esql/WhereCommand.php @@ -14,6 +14,12 @@ namespace Elastic\Elasticsearch\Helper\Esql; +/** + * Implementation of the `WHERE` processing command. + * + * This class inherits from EsqlBase to make it possible to chain all the commands + * that belong to an ES|QL query in a single expression. + */ class WhereCommand extends EsqlBase { private array $expressions; From 85f63ccb6c57dee1a84ed99a0262af01cc13d2d5 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Tue, 7 Oct 2025 18:32:35 +0100 Subject: [PATCH 4/9] unit tests --- src/Helper/Esql/Branch.php | 2 +- src/Helper/Esql/ChangePointCommand.php | 6 +- src/Helper/Esql/CompletionCommand.php | 6 +- src/Helper/Esql/DissectCommand.php | 2 +- src/Helper/Esql/DropCommand.php | 2 +- src/Helper/Esql/EnrichCommand.php | 21 +- src/Helper/Esql/EsqlBase.php | 80 +-- src/Helper/Esql/EvalCommand.php | 8 +- src/Helper/Esql/ForkCommand.php | 4 +- src/Helper/Esql/FromCommand.php | 23 +- src/Helper/Esql/GrokCommand.php | 2 +- src/Helper/Esql/KeepCommand.php | 2 +- src/Helper/Esql/LimitCommand.php | 2 +- src/Helper/Esql/LookupJoinCommand.php | 2 +- src/Helper/Esql/MvExpandCommand.php | 2 +- src/Helper/Esql/Query.php | 2 +- src/Helper/Esql/RenameCommand.php | 2 +- src/Helper/Esql/RerankCommand.php | 18 +- src/Helper/Esql/RowCommand.php | 2 +- src/Helper/Esql/SampleCommand.php | 2 +- src/Helper/Esql/ShowCommand.php | 2 +- src/Helper/Esql/SortCommand.php | 4 +- src/Helper/Esql/StatsCommand.php | 12 +- src/Helper/Esql/WhereCommand.php | 2 +- tests/Helper/EsqlTest.php | 670 +++++++++++++++++++++++++ 25 files changed, 787 insertions(+), 93 deletions(-) create mode 100644 tests/Helper/EsqlTest.php diff --git a/src/Helper/Esql/Branch.php b/src/Helper/Esql/Branch.php index d6ce167e8..5a4586acd 100644 --- a/src/Helper/Esql/Branch.php +++ b/src/Helper/Esql/Branch.php @@ -26,7 +26,7 @@ public function __construct() parent::__construct(null); } - protected function render_internal(): string + protected function renderInternal(): string { return ""; } diff --git a/src/Helper/Esql/ChangePointCommand.php b/src/Helper/Esql/ChangePointCommand.php index 34a2a4863..652d4c2eb 100644 --- a/src/Helper/Esql/ChangePointCommand.php +++ b/src/Helper/Esql/ChangePointCommand.php @@ -23,8 +23,8 @@ class ChangePointCommand extends EsqlBase { private string $value; private string $key = ""; - private string $type_name = "type"; - private string $pvalue_name = "value"; + private string $type_name = ""; + private string $pvalue_name = ""; public function __construct(EsqlBase $parent, string $value) { @@ -60,7 +60,7 @@ public function as(string $type_name, string $pvalue_name): ChangePointCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { $key = $this->key ? " ON " . $this->format_id($this->key) : ""; $names = ($this->type_name && $this->pvalue_name) ? diff --git a/src/Helper/Esql/CompletionCommand.php b/src/Helper/Esql/CompletionCommand.php index a68fcb560..695f7d44f 100644 --- a/src/Helper/Esql/CompletionCommand.php +++ b/src/Helper/Esql/CompletionCommand.php @@ -24,8 +24,8 @@ */ class CompletionCommand extends EsqlBase { private string $prompt; - private array $named_prompt; - private string $inference_id; + private array $named_prompt = []; + private string $inference_id = ""; public function __construct(EsqlBase $parent, array $prompt) { @@ -54,7 +54,7 @@ public function with(string $inference_id): CompletionCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { if (!$this->inference_id) { throw new RuntimeException("The completion command requires an inference ID"); diff --git a/src/Helper/Esql/DissectCommand.php b/src/Helper/Esql/DissectCommand.php index 1faefaaeb..bbee39117 100644 --- a/src/Helper/Esql/DissectCommand.php +++ b/src/Helper/Esql/DissectCommand.php @@ -44,7 +44,7 @@ public function append_separator(string $separator): DissectCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { $sep = $this->separator ? " APPEND_SEPARATOR=" . json_encode($this->separator) : ""; return "DISSECT " . $this->format_id($this->input) . " " . json_encode($this->pattern) . $sep; diff --git a/src/Helper/Esql/DropCommand.php b/src/Helper/Esql/DropCommand.php index 0b55bde21..02848e3cb 100644 --- a/src/Helper/Esql/DropCommand.php +++ b/src/Helper/Esql/DropCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, array $columns) $this->columns = $columns; } - protected function render_internal(): string + protected function renderInternal(): string { return "DROP " . implode( ", ", array_map(array($this, "format_id"), $this->columns) diff --git a/src/Helper/Esql/EnrichCommand.php b/src/Helper/Esql/EnrichCommand.php index bde7fd795..aae807871 100644 --- a/src/Helper/Esql/EnrichCommand.php +++ b/src/Helper/Esql/EnrichCommand.php @@ -22,9 +22,9 @@ */ class EnrichCommand extends EsqlBase { private string $policy; - private string $match_field; - private array $fields; - private array $named_fields; + private string $match_field = ""; + private array $fields = []; + private array $named_fields = []; public function __construct(EsqlBase $parent, string $policy) { @@ -72,10 +72,12 @@ public function with(string ...$fields): EnrichCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { - $on = $this->match_field ? " ON " . $this->format_id($this->match_field) : ""; - if ($this->named_fields) { + $on = ($this->match_field != "") ? " ON " . $this->format_id($this->match_field) : ""; + $with = ""; + $items = []; + if (sizeof($this->named_fields)) { $items = array_map( function(string $key): string { return $this->format_id($key) . " = " . @@ -84,9 +86,12 @@ function(string $key): string { array_keys($this->named_fields) ); } - else { + else if (sizeof($this->fields)) { $items = array_map(fn($value): string => $this->format_id($value), $this->fields); } - return "ENRICH " . $this->policy . implode(", ", $items); + if (sizeof($items)) { + $with = " WITH " . implode(", ", $items); + } + return "ENRICH " . $this->policy . $on . $with; } } diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php index fb78ea38f..02039a87e 100644 --- a/src/Helper/Esql/EsqlBase.php +++ b/src/Helper/Esql/EsqlBase.php @@ -19,39 +19,31 @@ abstract class EsqlBase { private ?EsqlBase $parent = null; + protected function format_id(string $id, bool $allow_patterns = false): string + { + if ($allow_patterns && str_contains($id, "*")) { + // patterns cannot be escaped + return $id; + } + if (preg_match("/[A-Za-z_@][A-Za-z0-9_\\.]*/", $id)) { + // all safe characters, so no need to escape + return $id; + } + // apply escaping + return "`" . str_replace("`", "``", $id) . "`"; + } + protected function format_kv(array $map): string { return implode(", ", array_map( function($k, $v) { - return $k . "=" . json_encode($v); + return $k . " = " . json_encode($v); }, array_keys($map), $map, )); } - public function render(): string - { - $query = ""; - if ($this->parent) { - $query .= $this->parent->render() . "\n| "; - } - $query .= $this->render_internal(); - return $query; - } - - protected abstract function render_internal(): string; - - public function __construct(?EsqlBase $parent) - { - $this->parent = $parent; - } - - public function __toString(): string - { - return $this->render() . "\n"; - } - protected function is_named_argument_list(array $args): bool { $named_count = array_sum(array_map('is_string', array_keys($args))); if ($named_count == sizeof($args)) { @@ -63,20 +55,6 @@ protected function is_named_argument_list(array $args): bool { return false; } - protected function format_id(string $id, bool $allow_patterns = false): string - { - if ($allow_patterns && str_contains($id, "*")) { - // patterns cannot be escaped - return $id; - } - if (preg_match("/[A-Za-z_@][A-Za-z0-9_\\.]*/", $id)) { - // all safe characters, so no need to escape - return $id; - } - // apply escaping - return "`" . str_replace("`", "``", $id) . "`"; - } - protected function is_forked(): bool { if (get_class($this) == "ForkCommand") { @@ -88,6 +66,28 @@ protected function is_forked(): bool return false; } + public function __construct(?EsqlBase $parent) + { + $this->parent = $parent; + } + + public function render(): string + { + $query = ""; + if ($this->parent) { + $query .= $this->parent->render() . "\n| "; + } + $query .= $this->renderInternal(); + return $query; + } + + protected abstract function renderInternal(): string; + + public function __toString(): string + { + return $this->render() . "\n"; + } + /** * `CHANGE_POINT` detects spikes, dips, and change points in a metric. * @@ -105,7 +105,7 @@ protected function is_forked(): bool * .where("type IS NOT NULL") * ) */ - public function change_point(string $value): ChangePointCommand + public function changePoint(string $value): ChangePointCommand { return new ChangePointCommand($this, $value); } @@ -394,7 +394,7 @@ public function limit(int $max_number_of_rows): LimitCommand * .lookup_join("languages_lookup").on("language_code") * ) */ - public function lookup_join(string $lookup_index): LookupJoinCommand + public function lookupJoin(string $lookup_index): LookupJoinCommand { return new LookupJoinCommand($this, $lookup_index); } @@ -409,7 +409,7 @@ public function lookup_join(string $lookup_index): LookupJoinCommand * * query = ESQL.row(a=[1, 2, 3], b="b", j=["a", "b"]).mv_expand("a") */ - public function mv_expand(string $column): MvExpandCommand + public function mvExpand(string $column): MvExpandCommand { return new MvExpandCommand($this, $column); } diff --git a/src/Helper/Esql/EvalCommand.php b/src/Helper/Esql/EvalCommand.php index c6ad72681..158dd89a6 100644 --- a/src/Helper/Esql/EvalCommand.php +++ b/src/Helper/Esql/EvalCommand.php @@ -21,8 +21,8 @@ * that belong to an ES|QL query in a single expression. */ class EvalCommand extends EsqlBase { - private array $columns; - private array $named_columns; + private array $columns = []; + private array $named_columns = []; public function __construct(EsqlBase $parent, array $columns) { @@ -35,9 +35,9 @@ public function __construct(EsqlBase $parent, array $columns) } } - protected function render_internal(): string + protected function renderInternal(): string { - if ($this->named_columns) { + if (sizeof($this->named_columns)) { $items = array_map( function(string $key): string { return $this->format_id($key) . " = " . diff --git a/src/Helper/Esql/ForkCommand.php b/src/Helper/Esql/ForkCommand.php index dcbe92c59..6eaf3fa5e 100644 --- a/src/Helper/Esql/ForkCommand.php +++ b/src/Helper/Esql/ForkCommand.php @@ -39,7 +39,7 @@ public function __construct( $this->branches = [$fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8]; } - protected function render_internal(): string + protected function renderInternal(): string { $cmds = ""; foreach ($this->branches as $branch) { @@ -49,7 +49,7 @@ protected function render_internal(): string $cmds = "( " . $cmd . " )"; } else { - $cmds += "\n ( " . $cmd . " )"; + $cmds .= "\n ( " . $cmd . " )"; } } } diff --git a/src/Helper/Esql/FromCommand.php b/src/Helper/Esql/FromCommand.php index 2f54d41f1..30cb7550e 100644 --- a/src/Helper/Esql/FromCommand.php +++ b/src/Helper/Esql/FromCommand.php @@ -16,14 +16,33 @@ class FromCommand extends EsqlBase { private array $indices; + private array $metadata_fields = []; public function __construct(array $indices) { $this->indices = $indices; } - protected function render_internal(): string + /** + * Continuation of the `FROM` source command. + * + * *param string ...$metadata_fields Metadata fields to retrieve, given as + * positional arguments. + */ + public function metadata(string ...$metadata_fields): FromCommand { - return "FROM " . implode(", ", $this->indices); + $this->metadata_fields = $metadata_fields; + return $this; + } + + protected function renderInternal(): string + { + $s = "FROM " . implode(", ", $this->indices); + if (sizeof($this->metadata_fields)) { + $s .= " METADATA " . implode( + ", ", array_map(array($this, "format_id"), $this->metadata_fields) + ); + } + return $s; } } diff --git a/src/Helper/Esql/GrokCommand.php b/src/Helper/Esql/GrokCommand.php index ea3accd9b..d94a727a0 100644 --- a/src/Helper/Esql/GrokCommand.php +++ b/src/Helper/Esql/GrokCommand.php @@ -31,7 +31,7 @@ public function __construct(EsqlBase $parent, string $input, string $pattern) $this->pattern = $pattern; } - protected function render_internal(): string + protected function renderInternal(): string { return "GROK " . $this->format_id($this->input) . " " . json_encode($this->pattern); } diff --git a/src/Helper/Esql/KeepCommand.php b/src/Helper/Esql/KeepCommand.php index e8350cac1..f359041c8 100644 --- a/src/Helper/Esql/KeepCommand.php +++ b/src/Helper/Esql/KeepCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, array $columns) $this->columns = $columns; } - protected function render_internal(): string + protected function renderInternal(): string { return "KEEP " . implode( ", ", array_map(array($this, "format_id"), $this->columns) diff --git a/src/Helper/Esql/LimitCommand.php b/src/Helper/Esql/LimitCommand.php index ed98aa177..082ee59af 100644 --- a/src/Helper/Esql/LimitCommand.php +++ b/src/Helper/Esql/LimitCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, int $max_number_of_rows) $this->max_number_of_rows = $max_number_of_rows; } - protected function render_internal(): string + protected function renderInternal(): string { return "LIMIT " . json_encode($this->max_number_of_rows); } diff --git a/src/Helper/Esql/LookupJoinCommand.php b/src/Helper/Esql/LookupJoinCommand.php index 5c7a4e6ae..e43c192c7 100644 --- a/src/Helper/Esql/LookupJoinCommand.php +++ b/src/Helper/Esql/LookupJoinCommand.php @@ -47,7 +47,7 @@ public function on(string $field): LookupJoinCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { if (!$this->field) { throw new RuntimeException ("Joins require a field to join on."); diff --git a/src/Helper/Esql/MvExpandCommand.php b/src/Helper/Esql/MvExpandCommand.php index c49326765..0f500488c 100644 --- a/src/Helper/Esql/MvExpandCommand.php +++ b/src/Helper/Esql/MvExpandCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, string $column) $this->column = $column; } - protected function render_internal(): string + protected function renderInternal(): string { return "MV_EXPAND " . $this->format_id($this->column); } diff --git a/src/Helper/Esql/Query.php b/src/Helper/Esql/Query.php index 8bf80a87a..383dc758d 100644 --- a/src/Helper/Esql/Query.php +++ b/src/Helper/Esql/Query.php @@ -48,7 +48,7 @@ public static function from(string ...$indices): FromCommand * query2 = ESQL.row(a=[1, 2]) * query3 = ESQL.row(a=functions.round(1.23, 0)) */ - public static function row(string ...$params): RowCommand + public static function row(mixed ...$params): RowCommand { return new RowCommand($params); } diff --git a/src/Helper/Esql/RenameCommand.php b/src/Helper/Esql/RenameCommand.php index f18f7875c..265fa96e0 100644 --- a/src/Helper/Esql/RenameCommand.php +++ b/src/Helper/Esql/RenameCommand.php @@ -34,7 +34,7 @@ public function __construct(EsqlBase $parent, array $columns) $this->named_columns = $columns; } - protected function render_internal(): string + protected function renderInternal(): string { $items = array_map( function(string $key): string { diff --git a/src/Helper/Esql/RerankCommand.php b/src/Helper/Esql/RerankCommand.php index f759817a2..8cd4fdd82 100644 --- a/src/Helper/Esql/RerankCommand.php +++ b/src/Helper/Esql/RerankCommand.php @@ -23,10 +23,10 @@ * that belong to an ES|QL query in a single expression. */ class RerankCommand extends EsqlBase { - private string $query; - private array $named_query; - private array $fields; - private string $inference_id; + private string $query = ""; + private array $named_query = []; + private array $fields = []; + private string $inference_id = ""; public function __construct(EsqlBase $parent, array $query) { @@ -68,20 +68,20 @@ public function with(string $inference_id): RerankCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { - if (!$this->fields) { + if (sizeof($this->fields) == 0) { throw new RuntimeException( "The rerank command requires one or more fields to rerank on" ); } - if (!$this->inference_id) { + if ($this->inference_id == "") { throw new RuntimeException( "The rerank command requires an inference ID" ); } $with = ["inference_id" => $this->inference_id]; - if ($this->named_query) { + if (sizeof($this->named_query)) { $column = array_keys($this->named_query)[0]; $value = array_values($this->named_query)[0]; $query = $this->format_id($column) . " = " . json_encode($value); @@ -91,6 +91,6 @@ protected function render_internal(): string } return "RERANK " . $query . " ON " . implode(", ", array_map(array($this, "format_id"), $this->fields)) . - "WITH " . json_encode($with); + " WITH " . json_encode($with); } } diff --git a/src/Helper/Esql/RowCommand.php b/src/Helper/Esql/RowCommand.php index fb6cd604d..c14479b31 100644 --- a/src/Helper/Esql/RowCommand.php +++ b/src/Helper/Esql/RowCommand.php @@ -28,7 +28,7 @@ public function __construct(array $params) $this->params = $params; } - protected function render_internal(): string + protected function renderInternal(): string { return "ROW " . $this->format_kv($this->params); } diff --git a/src/Helper/Esql/SampleCommand.php b/src/Helper/Esql/SampleCommand.php index 08cf4ba4d..44cc9ba2b 100644 --- a/src/Helper/Esql/SampleCommand.php +++ b/src/Helper/Esql/SampleCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, float $probability) $this->probability = $probability; } - protected function render_internal(): string + protected function renderInternal(): string { return "SAMPLE " . json_encode($this->probability); } diff --git a/src/Helper/Esql/ShowCommand.php b/src/Helper/Esql/ShowCommand.php index ad04eb179..d9c79dbfa 100644 --- a/src/Helper/Esql/ShowCommand.php +++ b/src/Helper/Esql/ShowCommand.php @@ -28,7 +28,7 @@ public function __construct(string $item) $this->item = $item; } - protected function render_internal(): string + protected function renderInternal(): string { return "SHOW " . $this->format_id($this->item); } diff --git a/src/Helper/Esql/SortCommand.php b/src/Helper/Esql/SortCommand.php index 1ce72ab53..7b8ebbeca 100644 --- a/src/Helper/Esql/SortCommand.php +++ b/src/Helper/Esql/SortCommand.php @@ -29,12 +29,12 @@ public function __construct(EsqlBase $parent, array $columns) $this->columns = $columns; } - protected function render_internal(): string + protected function renderInternal(): string { $sorts = []; foreach ($this->columns as $column) { array_push($sorts, implode( - " ", array_map(array($this, "format_id"), str_split($column)) + " ", array_map(array($this, "format_id"), explode(" ", $column)) )); } return "SORT " . implode(", ", $sorts); diff --git a/src/Helper/Esql/StatsCommand.php b/src/Helper/Esql/StatsCommand.php index 764d31b24..771699ab3 100644 --- a/src/Helper/Esql/StatsCommand.php +++ b/src/Helper/Esql/StatsCommand.php @@ -21,9 +21,9 @@ * that belong to an ES|QL query in a single expression. */ class StatsCommand extends EsqlBase { - private array $expressions; - private array $named_expressions; - private array $grouping_expressions; + private array $expressions = []; + private array $named_expressions = []; + private array $grouping_expressions = []; public function __construct(EsqlBase $parent, array $expressions) { @@ -51,9 +51,9 @@ public function by(string ...$grouping_expressions): StatsCommand return $this; } - protected function render_internal(): string + protected function renderInternal(): string { - if ($this->named_expressions) { + if (sizeof($this->named_expressions)) { $items = array_map( function(string $key): string { return $this->format_id($key) . " = " . @@ -66,7 +66,7 @@ function(string $key): string { $items = array_map(fn($value): string => $this->format_id($value), $this->expressions); } $by = ""; - if ($this->grouping_expressions) { + if (sizeof($this->grouping_expressions)) { $by = "\n BY " . implode(", ", $this->grouping_expressions); } return "STATS " . implode(",\n ", $items) . $by; diff --git a/src/Helper/Esql/WhereCommand.php b/src/Helper/Esql/WhereCommand.php index 7501dbee1..9d588a281 100644 --- a/src/Helper/Esql/WhereCommand.php +++ b/src/Helper/Esql/WhereCommand.php @@ -29,7 +29,7 @@ public function __construct(EsqlBase $parent, array $expressions) $this->expressions = $expressions; } - protected function render_internal(): string + protected function renderInternal(): string { return "WHERE " . implode(" AND ", $this->expressions); } diff --git a/tests/Helper/EsqlTest.php b/tests/Helper/EsqlTest.php new file mode 100644 index 000000000..c5290d7a6 --- /dev/null +++ b/tests/Helper/EsqlTest.php @@ -0,0 +1,670 @@ +assertEquals( + "FROM employees\n", + $query->__toString() + ); + + $query = Query::from(""); + $this->assertEquals( + "FROM \n", + $query->__toString() + ); + + $query = Query::from("employees-00001", "other-employees-*"); + $this->assertEquals( + "FROM employees-00001, other-employees-*\n", + $query->__toString() + ); + + $query = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); + $this->assertEquals( + "FROM cluster_one:employees-00001, cluster_two:other-employees-*\n", + $query->__toString() + ); + + $query = Query::from("employees")->metadata("_id"); + $this->assertEquals( + "FROM employees METADATA _id\n", + $query->__toString() + ); + } + + public function testRow(): void + { + $query = Query::row(a: 1, b: "two", c: null); + $this->assertEquals( + "ROW a = 1, b = \"two\", c = null\n", + $query->__toString() + ); + + $query = Query::row(a: [2, 1]); + $this->assertEquals( + "ROW a = [2,1]\n", + $query->__toString() + ); + } + + public function testShow(): void + { + $query = Query::show("INFO"); + $this->assertEquals( + "SHOW INFO\n", + $query->__toString() + ); + } + + public function testChangePoint(): void + { + $query = Query::row(key: range(1, 25)) + ->mvExpand("key") + ->eval(value: "CASE(key < 13, 0, 42)") + ->changePoint("value") + ->on("key") + ->where("type IS NOT NULL"); + $this->assertEquals(<<__toString() + ); + } + + public function testCompletion(): void + { + $query = Query::row(question: "What is Elasticsearch?") + ->completion("question")->with("test_completion_model") + ->keep("question", "completion"); + $this->assertEquals(<<__toString() + ); + + $query = Query::row(question: "What is Elasticsearch?") + ->completion(answer: "question")->with("test_completion_model") + ->keep("question", "answer"); + $this->assertEquals(<<__toString() + ); + + $query = Query::from("movies") + ->sort("rating DESC") + ->limit(10) + ->eval(prompt: "CONCAT(\n" . + " \"Summarize this movie using the following information: \\n\",\n" . + " \"Title: \", title, \"\\n\",\n" . + " \"Synopsis: \", synopsis, \"\\n\",\n" . + " \"Actors: \", MV_CONCAT(actors, \", \"), \"\\n\",\n" . + " )" + ) + ->completion(summary: "prompt")->with("test_completion_model") + ->keep("title", "summary", "rating"); + $this->assertEquals(<<__toString() + ); + } + + public function testDissect(): void + { + $query = Query::row(a: "2023-01-23T12:15:00.000Z - some text - 127.0.0.1") + ->dissect("a", "%{date} - %{msg} - %{ip}") + ->keep("date", "msg", "ip"); + $this->assertEquals(<<__toString() + ); + } + + public function testDrop(): void + { + $query = Query::from("employees")->drop("height"); + $this->assertEquals("FROM employees\n| DROP height\n", $query->__toString()); + $query = Query::from("employees")->drop("height*"); + $this->assertEquals("FROM employees\n| DROP height*\n", $query->__toString()); + } + + public function testEnrich(): void + { + $query = Query::row(language_code: "1")->enrich("languages_policy"); + $this->assertEquals(<<__toString() + ); + $query = Query::row(language_code: "1")->enrich("languages_policy")->on("a"); + $this->assertEquals(<<__toString() + ); + $query = Query::row(language_code: "1") + ->enrich("languages_policy")->on("a")->with(name: "language_name"); + $this->assertEquals(<<__toString() + ); + } + + public function testEval(): void + { + $query = Query::from("employees") + ->sort("emp_no") + ->keep("first_name", "last_name", "height") + ->eval(height_feet: "height * 3.281", height_cm: "height * 100"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->sort("emp_no") + ->keep("first_name", "last_name", "height") + ->eval("height * 3.281"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->eval("height * 3.281") + ->stats(avg_height_feet: "AVG(`height * 3.281`)"); + $this->assertEquals(<<__toString() + ); + } + + public function testFork(): void + { + $query = Query::from("employees") + ->fork( + Query::branch()->where("emp_no == 10001"), + Query::branch()->where("emp_no == 10002"), + ) + ->keep("emp_no", "_fork") + ->sort("emp_no"); + $this->assertEquals(<<__toString() + ); + } + + public function testGrok(): void + { + $query = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + ->grok( + "a", + "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}", + ) + ->keep("date", "ip", "email", "num"); + $this->assertEquals(<<__toString() + ); + $query = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + ->grok( + "a", + "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}", + ) + ->keep("date", "ip", "email", "num") + ->eval(date: "TO_DATETIME(date)"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("addresses") + ->keep("city.name", "zip_code") + ->grok("zip_code", "%{WORD:zip_parts} %{WORD:zip_parts}"); + $this->assertEquals(<<__toString() + ); + } + + public function testKeep(): void + { + $query = Query::from("employees") + ->keep("emp_no", "first_name", "last_name", "height"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("h*"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("h*", "first_name"); + $this->assertEquals(<<__toString() + ); + } + + public function testLimit(): void + { + $query = Query::from("index") + ->where("field == \"value\"") + ->limit(1000); + $this->assertEquals(<<__toString() + ); + $query = Query::from("index") + ->stats("AVG(field1)")->by("field2") + ->limit(20000); + $this->assertEquals(<<__toString() + ); + } + + public function testLookupJoin(): void + { + $query = Query::from("firewall_logs") + ->lookupJoin("threat_list")->on("source.IP") + ->where("threat_level IS NOT NULL"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("system_metrics") + ->lookupJoin("host_inventory")->on("host.name") + ->lookupJoin("ownerships")->on("host.name"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("app_logs") + ->lookupJoin("service_owners")->on("service_id"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->eval(language_code: "languages") + ->where("emp_no >= 10091", "emp_no < 10094") + ->lookupJoin("languages_lookup")->on("language_code"); + $this->assertEquals(<<= 10091 AND emp_no < 10094 + | LOOKUP JOIN languages_lookup ON language_code\n + ESQL, + $query->__toString() + ); + } + + public function testMvExpand(): void + { + $query = Query::row(a: [1, 2, 3], b: "b", j: ["a", "b"]) + ->mvExpand("a"); + $this->assertEquals(<<__toString() + ); + } + + public function testRename(): void + { + $query = Query::from("employees") + ->keep("first_name", "last_name", "still_hired") + ->rename(still_hired: "employed"); + $this->assertEquals(<<__toString() + ); + } + + public function testRerank(): void + { + $query = Query::from("books")->metadata("_score") + ->where("MATCH(description, \"hobbit\")") + ->sort("_score DESC") + ->limit(100) + ->rerank("hobbit")->on("description")->with("test_reranker") + ->limit(3) + ->keep("title", "_score"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("books")->metadata("_score") + ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") + ->sort("_score DESC") + ->limit(100) + ->rerank(rerank_score: "hobbit")->on("description", "author")->with("test_reranker") + ->sort("rerank_score") + ->limit(3) + ->keep("title", "_score", "rerank_score"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("books")->metadata("_score") + ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") + ->sort("_score DESC") + ->limit(100) + ->rerank(rerank_score: "hobbit")->on("description", "author")->with("test_reranker") + ->eval(original_score: "_score", _score: "rerank_score + original_score") + ->sort("_score") + ->limit(3) + ->keep("title", "original_score", "rerank_score", "_score"); + $this->assertEquals(<<__toString() + ); + } + + public function testSample(): void + { + $query = Query::from("employees") + ->keep("emp_no") + ->sample(0.05); + $this->assertEquals(<<__toString() + ); + } + + public function testSort(): void + { + $query = Query::from("employees") + ->keep("first_name", "last_name", "height") + ->sort("height"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("first_name", "last_name", "height") + ->sort("height DESC"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("first_name", "last_name", "height") + ->sort("height DESC", "first_name ASC"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("first_name", "last_name", "height") + ->sort("first_name ASC NULLS FIRST"); + $this->assertEquals(<<__toString() + ); + } + + public function testStats(): void + { + $query = Query::from("employees") + ->stats(count: "COUNT(emp_no)")->by("languages") + ->sort("languages"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->stats(avg_lang: "AVG(languages)"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->stats( + avg_lang: "AVG(languages)", + max_lang: "MAX(languages)", + ); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->stats( + avg50s: "AVG(salary) WHERE birth_date < \"1960-01-01\"", + avg60s: "AVG(salary) WHERE birth_date >= \"1960-01-01\"" + )->by("gender") + ->sort("gender"); + $this->assertEquals(<<= "1960-01-01" + BY gender + | SORT gender\n + ESQL, + $query->__toString() + ); + $query = Query::from("employees") + ->eval(Ks: "salary / 1000") + ->stats( + under_40K: "COUNT(*) WHERE Ks < 40", + inbetween: "COUNT(*) WHERE (40 <= Ks) AND (Ks < 60)", + over_60K: "COUNT(*) WHERE 60 <= Ks", + total: "COUNT(*)", + ); + $this->assertEquals(<<__toString() + ); + $query = Query::row(i: 1, a: ["a", "b"]) + ->stats("MIN(i)")->by("a") + ->sort("a ASC"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->eval(hired: "DATE_FORMAT(\"yyyy\", hire_date)") + ->stats(avg_salary: "AVG(salary)")->by("hired", "languages.long") + ->eval(avg_salary: "ROUND(avg_salary)") + ->sort("hired", "languages.long"); + $this->assertEquals(<<__toString() + ); + } + + public function testWhere(): void + { + $query = Query::from("employees") + ->keep("first_name", "last_name", "still_hired") + ->where("still_hired == true"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("sample_data") + ->where("@timestamp > NOW() - 1 hour"); + $this->assertEquals(<< NOW() - 1 hour\n + ESQL, + $query->__toString() + ); + $query = Query::from("employees") + ->keep("first_name", "last_name", "height") + ->where("LENGTH(first_name) < 4"); + $this->assertEquals(<<__toString() + ); + } +} From bee8abbd31b38ff115647c75c25922710faa1d0d Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 8 Oct 2025 16:49:26 +0100 Subject: [PATCH 5/9] documentation examples --- src/Helper/Esql/ChangePointCommand.php | 6 +- src/Helper/Esql/CompletionCommand.php | 8 +- src/Helper/Esql/DissectCommand.php | 2 +- src/Helper/Esql/DropCommand.php | 2 +- src/Helper/Esql/EnrichCommand.php | 20 +- src/Helper/Esql/EsqlBase.php | 442 ++++++++++++------------- src/Helper/Esql/EvalCommand.php | 17 +- src/Helper/Esql/FromCommand.php | 2 +- src/Helper/Esql/GrokCommand.php | 2 +- src/Helper/Esql/KeepCommand.php | 2 +- src/Helper/Esql/LookupJoinCommand.php | 2 +- src/Helper/Esql/MvExpandCommand.php | 2 +- src/Helper/Esql/Query.php | 58 ++-- src/Helper/Esql/RenameCommand.php | 12 +- src/Helper/Esql/RerankCommand.php | 6 +- src/Helper/Esql/RowCommand.php | 2 +- src/Helper/Esql/ShowCommand.php | 2 +- src/Helper/Esql/SortCommand.php | 2 +- src/Helper/Esql/StatsCommand.php | 17 +- tests/Helper/EsqlTest.php | 2 +- 20 files changed, 280 insertions(+), 328 deletions(-) diff --git a/src/Helper/Esql/ChangePointCommand.php b/src/Helper/Esql/ChangePointCommand.php index 652d4c2eb..44670355b 100644 --- a/src/Helper/Esql/ChangePointCommand.php +++ b/src/Helper/Esql/ChangePointCommand.php @@ -62,10 +62,10 @@ public function as(string $type_name, string $pvalue_name): ChangePointCommand protected function renderInternal(): string { - $key = $this->key ? " ON " . $this->format_id($this->key) : ""; + $key = $this->key ? " ON " . $this->formatId($this->key) : ""; $names = ($this->type_name && $this->pvalue_name) ? - " AS " . $this->format_id($this->type_name) . ", " . - $this->format_id($this->pvalue_name) + " AS " . $this->formatId($this->type_name) . ", " . + $this->formatId($this->pvalue_name) : ""; return "CHANGE_POINT " . $this->value . $key . $names; } diff --git a/src/Helper/Esql/CompletionCommand.php b/src/Helper/Esql/CompletionCommand.php index 695f7d44f..5727cd86f 100644 --- a/src/Helper/Esql/CompletionCommand.php +++ b/src/Helper/Esql/CompletionCommand.php @@ -33,7 +33,7 @@ public function __construct(EsqlBase $parent, array $prompt) throw new RuntimeException("Only one prompt is supported"); } parent::__construct($parent); - if ($this->is_named_argument_list($prompt)) { + if ($this->isNamedArgumentList($prompt)) { $this->named_prompt = $prompt; } else { @@ -62,12 +62,12 @@ protected function renderInternal(): string $with = ["inference_id" => $this->inference_id]; if ($this->named_prompt) { return "COMPLETION " . - $this->format_id(array_keys($this->named_prompt)[0]) . " = " . - $this->format_id(array_values($this->named_prompt)[0]) . + $this->formatId(array_keys($this->named_prompt)[0]) . " = " . + $this->formatId(array_values($this->named_prompt)[0]) . " WITH " . json_encode($with); } else { - return "COMPLETION " . $this->format_id($this->prompt) . + return "COMPLETION " . $this->formatId($this->prompt) . " WITH " . json_encode($with); } } diff --git a/src/Helper/Esql/DissectCommand.php b/src/Helper/Esql/DissectCommand.php index bbee39117..0781ed452 100644 --- a/src/Helper/Esql/DissectCommand.php +++ b/src/Helper/Esql/DissectCommand.php @@ -47,6 +47,6 @@ public function append_separator(string $separator): DissectCommand protected function renderInternal(): string { $sep = $this->separator ? " APPEND_SEPARATOR=" . json_encode($this->separator) : ""; - return "DISSECT " . $this->format_id($this->input) . " " . json_encode($this->pattern) . $sep; + return "DISSECT " . $this->formatId($this->input) . " " . json_encode($this->pattern) . $sep; } } diff --git a/src/Helper/Esql/DropCommand.php b/src/Helper/Esql/DropCommand.php index 02848e3cb..fb8738012 100644 --- a/src/Helper/Esql/DropCommand.php +++ b/src/Helper/Esql/DropCommand.php @@ -32,7 +32,7 @@ public function __construct(EsqlBase $parent, array $columns) protected function renderInternal(): string { return "DROP " . implode( - ", ", array_map(array($this, "format_id"), $this->columns) + ", ", array_map(array($this, "formatId"), $this->columns) ); } } diff --git a/src/Helper/Esql/EnrichCommand.php b/src/Helper/Esql/EnrichCommand.php index aae807871..8a4419b37 100644 --- a/src/Helper/Esql/EnrichCommand.php +++ b/src/Helper/Esql/EnrichCommand.php @@ -63,7 +63,7 @@ public function on(string $match_field): EnrichCommand */ public function with(string ...$fields): EnrichCommand { - if ($this->is_named_argument_list($fields)) { + if ($this->isNamedArgumentList($fields)) { $this->named_fields = $fields; } else { @@ -74,23 +74,17 @@ public function with(string ...$fields): EnrichCommand protected function renderInternal(): string { - $on = ($this->match_field != "") ? " ON " . $this->format_id($this->match_field) : ""; + $on = ($this->match_field != "") ? " ON " . $this->formatId($this->match_field) : ""; $with = ""; $items = []; if (sizeof($this->named_fields)) { - $items = array_map( - function(string $key): string { - return $this->format_id($key) . " = " . - $this->format_id($this->named_fields[$key]); - }, - array_keys($this->named_fields) - ); + $with = " WITH " . $this->formatKeyValues($this->named_fields); } else if (sizeof($this->fields)) { - $items = array_map(fn($value): string => $this->format_id($value), $this->fields); - } - if (sizeof($items)) { - $with = " WITH " . implode(", ", $items); + $with = implode( + ", ", + array_map(fn($value): string => $this->formatId($value), $this->fields) + ); } return "ENRICH " . $this->policy . $on . $with; } diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php index 02039a87e..65ef2bfba 100644 --- a/src/Helper/Esql/EsqlBase.php +++ b/src/Helper/Esql/EsqlBase.php @@ -19,7 +19,11 @@ abstract class EsqlBase { private ?EsqlBase $parent = null; - protected function format_id(string $id, bool $allow_patterns = false): string + /** + * Formatting helper that renders an identifier using proper escaping rules. + * Used by several ES|QL commands. + */ + protected function formatId(string $id, bool $allow_patterns = false): string { if ($allow_patterns && str_contains($id, "*")) { // patterns cannot be escaped @@ -33,18 +37,29 @@ protected function format_id(string $id, bool $allow_patterns = false): string return "`" . str_replace("`", "``", $id) . "`"; } - protected function format_kv(array $map): string + /** + * Formatting helper that renders an associative array as needed by ES|QL. + * Used by several ES|QL commands. + */ + protected function formatKeyValues( + array $map, string $joinText = "=", + string $implodeText = ", ", + bool $jsonEncode = false): string { - return implode(", ", array_map( - function($k, $v) { - return $k . " = " . json_encode($v); + return implode($implodeText, array_map( + function(string $key, mixed $value) use ($joinText) { + return $key . " " . $joinText . " " . $value; }, array_keys($map), - $map, + array_map($jsonEncode ? 'json_encode' : array($this, 'formatId'), $map), )); } - protected function is_named_argument_list(array $args): bool { + /** + * Helper function that checks if the arguments are positional or named. + * Used by several ES|QL commands. + */ + protected function isNamedArgumentList(array $args): bool { $named_count = array_sum(array_map('is_string', array_keys($args))); if ($named_count == sizeof($args)) { return true; @@ -55,13 +70,16 @@ protected function is_named_argument_list(array $args): bool { return false; } - protected function is_forked(): bool + /** + * Helper function that checks if a forking command has been issued already. + */ + protected function isForked(): bool { if (get_class($this) == "ForkCommand") { return true; } if ($this->parent) { - return $this->parent->is_forked(); + return $this->parent->isForked(); } return false; } @@ -71,6 +89,9 @@ public function __construct(?EsqlBase $parent) $this->parent = $parent; } + /** + * Render the ES|QL command to a string. + */ public function render(): string { $query = ""; @@ -81,6 +102,9 @@ public function render(): string return $query; } + /** + * Abstract method implemented by all the command subclasses. + */ protected abstract function renderInternal(): string; public function __toString(): string @@ -96,14 +120,12 @@ public function __toString(): string * * Examples: * - * query = ( - * ESQL.row(key=list(range(1, 26))) - * .mv_expand("key") - * .eval(value=functions.case("key<13", 0, 42)) - * .change_point("value") - * .on("key") - * .where("type IS NOT NULL") - * ) + * $query = Query::row(key: range(1, 25)) + * ->mvExpand("key") + * ->eval(value: "CASE(key < 13, 0, 42)") + * ->changePoint("value") + * ->on("key") + * ->where("type IS NOT NULL"); */ public function changePoint(string $value): ChangePointCommand { @@ -126,29 +148,24 @@ public function changePoint(string $value): ChangePointCommand * * Examples: * - * query1 = ( - * ESQL.row(question="What is Elasticsearch?") - * .completion("question").with_("test_completion_model") - * .keep("question", "completion") - * ) - * query2 = ( - * ESQL.row(question="What is Elasticsearch?") - * .completion(answer="question").with_("test_completion_model") - * .keep("question", "answer") - * ) - * query3 = ( - * ESQL.from_("movies") - * .sort("rating DESC") - * .limit(10) - * .eval(prompt=\"\"\"CONCAT( - * "Summarize this movie using the following information: \\n", - * "Title: ", title, "\\n", - * "Synopsis: ", synopsis, "\\n", - * "Actors: ", MV_CONCAT(actors, ", "), "\\n", - * )\"\"\") - * .completion(summary="prompt").with_("test_completion_model") - * .keep("title", "summary", "rating") - * ) + * $query1 = Query::row(question: "What is Elasticsearch?") + * ->completion("question")->with("test_completion_model") + * ->keep("question", "completion"); + * $query2 = Query::row(question: "What is Elasticsearch?") + * ->completion(answer: "question")->with("test_completion_model") + * ->keep("question", "answer"); + * $query3 = Query::from("movies") + * ->sort("rating DESC") + * ->limit(10) + * ->eval(prompt: "CONCAT(\n" . + * " \"Summarize this movie using the following information: \\n\",\n" . + * " \"Title: \", title, \"\\n\",\n" . + * " \"Synopsis: \", synopsis, \"\\n\",\n" . + * " \"Actors: \", MV_CONCAT(actors, \", \"), \"\\n\",\n" . + * " )" + * ) + * ->completion(summary: "prompt")->with("test_completion_model") + * ->keep("title", "summary", "rating"); */ public function completion(string ...$prompt): CompletionCommand { @@ -168,12 +185,9 @@ public function completion(string ...$prompt): CompletionCommand * * Examples: * - * query = ( - * ESQL.row(a="2023-01-23T12:15:00.000Z - some text - 127.0.0.1") - * .dissect("a", "%{date} - %{msg} - %{ip}") - * .keep("date", "msg", "ip") - * .eval(date="TO_DATETIME(date)") - * ) + * $query = Query::row(a: "2023-01-23T12:15:00.000Z - some text - 127.0.0.1") + * ->dissect("a", "%{date} - %{msg} - %{ip}") + * ->keep("date", "msg", "ip"); */ public function dissect(string $input, string $pattern): DissectCommand { @@ -188,8 +202,8 @@ public function dissect(string $input, string $pattern): DissectCommand * * Examples: * - * query1 = ESQL.from_("employees").drop("height") - * query2 = ESQL.from_("employees").drop("height*") + * $query1 = Query::from("employees")->drop("height"); + * $query2 = Query::from("employees")->drop("height*"); */ public function drop(string ...$columns): DropCommand { @@ -205,14 +219,12 @@ public function drop(string ...$columns): DropCommand * * Examples: * - * query1 = ( - * ESQL.row(a="1") - * .enrich("languages_policy").on("a").with_("language_name") - * ) - * query2 = ( - * ESQL.row(a="1") - * .enrich("languages_policy").on("a").with_(name="language_name") - * ) + * $query1 = Query::row(language_code: "1") + * ->enrich("languages_policy"); + * $query2 = Query::row(language_code: "1") + * ->enrich("languages_policy")->on("a"); + * $query3 = Query::row(language_code: "1") + * ->enrich("languages_policy")->on("a")->with(name: "language_name"); */ public function enrich(string $policy): EnrichCommand { @@ -235,17 +247,17 @@ public function enrich(string $policy): EnrichCommand * * Examples: * - * query1 = ( - * ESQL.from_("employees") - * .sort("emp_no") - * .keep("first_name", "last_name", "height") - * .eval(height_feet="height * 3.281", height_cm="height * 100") - * ) - * query2 = ( - * ESQL.from_("employees") - * .eval("height * 3.281") - * .stats(avg_height_feet=functions.avg("`height * 3.281`")) - * ) + * $query1 = Query::from("employees") + * ->sort("emp_no") + * ->keep("first_name", "last_name", "height") + * ->eval(height_feet: "height * 3.281", height_cm: "height * 100"); + * $query2 = Query::from("employees") + * ->sort("emp_no") + * ->keep("first_name", "last_name", "height") + * ->eval("height * 3.281"); + * $query3 = Query::from("employees") + * ->eval("height * 3.281") + * ->stats(avg_height_feet: "AVG(`height * 3.281`)"); */ public function eval(string ...$columns): EvalCommand { @@ -261,15 +273,13 @@ public function eval(string ...$columns): EvalCommand * * Examples: * - * query = ( - * ESQL.from_("employees") - * .fork( - * ESQL.branch().where("emp_no == 10001"), - * ESQL.branch().where("emp_no == 10002"), + * $query = Query::from("employees") + * ->fork( + * Query::branch()->where("emp_no == 10001"), + * Query::branch()->where("emp_no == 10002"), * ) - * .keep("emp_no", "_fork") - * .sort("emp_no") - * ) + * ->keep("emp_no", "_fork") + * ->sort("emp_no"); */ public function fork( EsqlBase $fork1, @@ -282,7 +292,7 @@ public function fork( ?EsqlBase $fork8 = null, ): ForkCommand { - if ($this->is_forked()) { + if ($this->isForked()) { throw new RuntimeException("a query can only have one fork"); } return new ForkCommand($this, $fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8); @@ -302,25 +312,22 @@ public function fork( * * Examples: * - * query1 = ( - * ESQL.row(a="2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") - * .grok("a", "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}") - * .keep("date", "ip", "email", "num") - * ) - * query2 = ( - * ESQL.row(a="2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") - * .grok( + * $query1 = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + * ->grok( + * "a", + * "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}", + * ) + * ->keep("date", "ip", "email", "num"); + * $query2 = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") + * ->grok( * "a", * "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}", * ) - * .keep("date", "ip", "email", "num") - * .eval(date=functions.to_datetime("date")) - * ) - * query3 = ( - * ESQL.from_("addresses") - * .keep("city.name", "zip_code") - * .grok("zip_code", "%{WORD:zip_parts} %{WORD:zip_parts}") - * ) + * ->keep("date", "ip", "email", "num") + * ->eval(date: "TO_DATETIME(date)"); + * $query3 = Query::from("addresses") + * ->keep("city.name", "zip_code") + * ->grok("zip_code", "%{WORD:zip_parts} %{WORD:zip_parts}"); */ public function grok(string $input, string $pattern): GrokCommand { @@ -336,9 +343,12 @@ public function grok(string $input, string $pattern): GrokCommand * * Examples: * - * query1 = ESQL.from_("employees").keep("emp_no", "first_name", "last_name", "height") - * query2 = ESQL.from_("employees").keep("h*") - * query3 = ESQL.from_("employees").keep("h*", "*") + * $query1 = Query::from("employees") + * ->keep("emp_no", "first_name", "last_name", "height"); + * $query2 = Query::from("employees") + * ->keep("h*"); + * $query3 = Query::from("employees") + * ->keep("h*", "first_name"); */ public function keep(string ...$columns): KeepCommand { @@ -353,8 +363,12 @@ public function keep(string ...$columns): KeepCommand * * Examples: * - * query1 = ESQL.from_("employees").sort("emp_no ASC").limit(5) - * query2 = ESQL.from_("index").stats(functions.avg("field1")).by("field2").limit(20000) + * $query1 = Query::from("index") + * ->where("field == \"value\"") + * ->limit(1000); + * $query2 = Query::from("index") + * ->stats("AVG(field1)")->by("field2") + * ->limit(20000); */ public function limit(int $max_number_of_rows): LimitCommand { @@ -373,26 +387,18 @@ public function limit(int $max_number_of_rows): LimitCommand * * Examples: * - * query1 = ( - * ESQL.from_("firewall_logs") - * .lookup_join("threat_list").on("source.IP") - * .where("threat_level IS NOT NULL") - * ) - * query2 = ( - * ESQL.from_("system_metrics") - * .lookup_join("host_inventory").on("host.name") - * .lookup_join("ownerships").on("host.name") - * ) - * query3 = ( - * ESQL.from_("app_logs") - * .lookup_join("service_owners").on("service_id") - * ) - * query4 = ( - * ESQL.from_("employees") - * .eval(language_code="languages") - * .where("emp_no >= 10091 AND emp_no < 10094") - * .lookup_join("languages_lookup").on("language_code") - * ) + * $query1 = Query::from("firewall_logs") + * ->lookupJoin("threat_list")->on("source.IP") + * ->where("threat_level IS NOT NULL"); + * $query2 = Query::from("system_metrics") + * ->lookupJoin("host_inventory")->on("host.name") + * ->lookupJoin("ownerships")->on("host.name"); + * $query3 = Query::from("app_logs") + * ->lookupJoin("service_owners")->on("service_id"); + * $query4 = Query::from("employees") + * ->eval(language_code: "languages") + * ->where("emp_no >= 10091", "emp_no < 10094") + * ->lookupJoin("languages_lookup")->on("language_code"); */ public function lookupJoin(string $lookup_index): LookupJoinCommand { @@ -407,7 +413,8 @@ public function lookupJoin(string $lookup_index): LookupJoinCommand * * Examples: * - * query = ESQL.row(a=[1, 2, 3], b="b", j=["a", "b"]).mv_expand("a") + * $query = Query::row(a: [1, 2, 3], b: "b", j: ["a", "b"]) + * ->mvExpand("a"); */ public function mvExpand(string $column): MvExpandCommand { @@ -426,11 +433,9 @@ public function mvExpand(string $column): MvExpandCommand * * Examples: * - * query = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "still_hired") - * .rename(still_hired="employed") - * ) + * $query = Query::from("employees") + * ->keep("first_name", "last_name", "still_hired") + * ->rename(still_hired: "employed"); */ public function rename(string ...$columns): RenameCommand { @@ -452,36 +457,30 @@ public function rename(string ...$columns): RenameCommand * * Examples: * - * query1 = ( - * ESQL.from_("books").metadata("_score") - * .where('MATCH(description, "hobbit")') - * .sort("_score DESC") - * .limit(100) - * .rerank("hobbit").on("description").with_(inference_id="test_reranker") - * .limit(3) - * .keep("title", "_score") - * ) - * query2 = ( - * ESQL.from_("books").metadata("_score") - * .where('MATCH(description, "hobbit") OR MATCH(author, "Tolkien")') - * .sort("_score DESC") - * .limit(100) - * .rerank(rerank_score="hobbit").on("description", "author").with_(inference_id="test_reranker") - * .sort("rerank_score") - * .limit(3) - * .keep("title", "_score", "rerank_score") - * ) - * query3 = ( - * ESQL.from_("books").metadata("_score") - * .where('MATCH(description, "hobbit") OR MATCH(author, "Tolkien")') - * .sort("_score DESC") - * .limit(100) - * .rerank(rerank_score="hobbit").on("description", "author").with_(inference_id="test_reranker") - * .eval(original_score="_score", _score="rerank_score + original_score") - * .sort("_score") - * .limit(3) - * .keep("title", "original_score", "rerank_score", "_score") - * ) + * $query1 = Query::from("books")->metadata("_score") + * ->where("MATCH(description, \"hobbit\")") + * ->sort("_score DESC") + * ->limit(100) + * ->rerank("hobbit")->on("description")->with("test_reranker") + * ->limit(3) + * ->keep("title", "_score"); + * $query2 = Query::from("books")->metadata("_score") + * ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") + * ->sort("_score DESC") + * ->limit(100) + * ->rerank(rerank_score: "hobbit")->on("description", "author")->with("test_reranker") + * ->sort("rerank_score") + * ->limit(3) + * ->keep("title", "_score", "rerank_score"); + * $query3 = Query::from("books")->metadata("_score") + * ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") + * ->sort("_score DESC") + * ->limit(100) + * ->rerank(rerank_score: "hobbit")->on("description", "author")->with("test_reranker") + * ->eval(original_score: "_score", _score: "rerank_score + original_score") + * ->sort("_score") + * ->limit(3) + * ->keep("title", "original_score", "rerank_score", "_score"); */ public function rerank(string ...$query): RerankCommand { @@ -497,7 +496,9 @@ public function rerank(string ...$query): RerankCommand * * Examples: * - * query = ESQL.from_("employees").keep("emp_no").sample(0.05) + * $query = Query::from("employees") + * ->keep("emp_no") + * ->sample(0.05); */ public function sample(float $probability): SampleCommand { @@ -511,26 +512,18 @@ public function sample(float $probability): SampleCommand * * Examples: * - * query1 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "height") - * .sort("height") - * ) - * query2 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "height") - * .sort("height DESC") - * ) - * query3 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "height") - * .sort("height DESC", "first_name ASC") - * ) - * query4 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "height") - * .sort("first_name ASC NULLS FIRST") - * ) + * $query1 = Query::from("employees") + * ->keep("first_name", "last_name", "height") + * ->sort("height"); + * $query2 = Query::from("employees") + * ->keep("first_name", "last_name", "height") + * ->sort("height DESC"); + * $query3 = Query::from("employees") + * ->keep("first_name", "last_name", "height") + * ->sort("height DESC", "first_name ASC"); + * $query4 = Query::from("employees") + * ->keep("first_name", "last_name", "height") + * ->sort("first_name ASC NULLS FIRST"); */ public function sort(string ...$columns): SortCommand { @@ -549,53 +542,38 @@ public function sort(string ...$columns): SortCommand * * Examples: * - * query1 = ( - * ESQL.from_("employees") - * .stats(count=functions.count("emp_no")).by("languages") - * .sort("languages") - * ) - * query2 = ( - * ESQL.from_("employees") - * .stats(avg_lang=functions.avg("languages")) - * ) - * query3 = ( - * ESQL.from_("employees") - * .stats( - * avg_lang=functions.avg("languages"), - * max_lang=functions.max("languages") - * ) - * ) - * query4 = ( - * ESQL.from_("employees") - * .stats( - * avg50s=functions.avg("salary").where('birth_date < "1960-01-01"'), - * avg60s=functions.avg("salary").where('birth_date >= "1960-01-01"'), - * ).by("gender") - * .sort("gender") - * ) - * query5 = ( - * ESQL.from_("employees") - * .eval(Ks="salary / 1000") - * .stats( - * under_40K=functions.count("*").where("Ks < 40"), - * inbetween=functions.count("*").where("40 <= Ks AND Ks < 60"), - * over_60K=functions.count("*").where("60 <= Ks"), - * total=f.count("*") - * ) - * ) - * query6 = ( - * ESQL.row(i=1, a=["a", "b"]) - * .stats(functions.min("i")).by("a") - * .sort("a ASC") - * ) - * query7 = ( - * ESQL.from_("employees") - * .eval(hired=functions.date_format("hire_date", "yyyy")) - * .stats(avg_salary=functions.avg("salary")).by("hired", "languages.long") - * .eval(avg_salary=functions.round("avg_salary")) - * .sort("hired", "languages.long") - * - * ) + * $query1 = Query::from("employees") + * ->stats(count: "COUNT(emp_no)")->by("languages") + * ->sort("languages"); + * $query2 = Query::from("employees") + * ->stats(avg_lang: "AVG(languages)"); + * $query3 = Query::from("employees") + * ->stats( + * avg_lang: "AVG(languages)", + * max_lang: "MAX(languages)", + * ); + * $query4 = Query::from("employees") + * ->stats( + * avg50s: "AVG(salary) WHERE birth_date < \"1960-01-01\"", + * avg60s: "AVG(salary) WHERE birth_date >= \"1960-01-01\"" + * )->by("gender") + * ->sort("gender"); + * $query5 = Query::from("employees") + * ->eval(Ks: "salary / 1000") + * ->stats( + * under_40K: "COUNT(*) WHERE Ks < 40", + * inbetween: "COUNT(*) WHERE (40 <= Ks) AND (Ks < 60)", + * over_60K: "COUNT(*) WHERE 60 <= Ks", + * total: "COUNT(*)", + * ); + * $query6 = Query::row(i: 1, a: ["a", "b"]) + * ->stats("MIN(i)")->by("a") + * ->sort("a ASC"); + * $query7 = Query::from("employees") + * ->eval(hired: "DATE_FORMAT(\"yyyy\", hire_date)") + * ->stats(avg_salary: "AVG(salary)")->by("hired", "languages.long") + * ->eval(avg_salary: "ROUND(avg_salary)") + * ->sort("hired", "languages.long"); */ public function stats(string ...$expressions): StatsCommand { @@ -613,20 +591,14 @@ public function stats(string ...$expressions): StatsCommand * * Examples: * - * query1 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "still_hired") - * .where("still_hired == true") - * ) - * query2 = ( - * ESQL.from_("sample_data") - * .where("@timestamp > NOW() - 1 hour") - * ) - * query3 = ( - * ESQL.from_("employees") - * .keep("first_name", "last_name", "height") - * .where("LENGTH(first_name) < 4") - * ) + * $query1 = Query::from("employees") + * ->keep("first_name", "last_name", "still_hired") + * ->where("still_hired == true"); + * $query2 = Query::from("sample_data") + * ->where("@timestamp > NOW() - 1 hour"); + * $query3 = Query::from("employees") + * ->keep("first_name", "last_name", "height") + * ->where("LENGTH(first_name) < 4"); */ public function where(string ...$expressions): WhereCommand { diff --git a/src/Helper/Esql/EvalCommand.php b/src/Helper/Esql/EvalCommand.php index 158dd89a6..55595f2a4 100644 --- a/src/Helper/Esql/EvalCommand.php +++ b/src/Helper/Esql/EvalCommand.php @@ -27,7 +27,7 @@ class EvalCommand extends EsqlBase { public function __construct(EsqlBase $parent, array $columns) { parent::__construct($parent); - if ($this->is_named_argument_list($columns)) { + if ($this->isNamedArgumentList($columns)) { $this->named_columns = $columns; } else { @@ -38,17 +38,14 @@ public function __construct(EsqlBase $parent, array $columns) protected function renderInternal(): string { if (sizeof($this->named_columns)) { - $items = array_map( - function(string $key): string { - return $this->format_id($key) . " = " . - $this->format_id($this->named_columns[$key]); - }, - array_keys($this->named_columns) - ); + $eval = $this->formatKeyValues($this->named_columns); } else { - $items = array_map(fn($value): string => $this->format_id($value), $this->columns); + $eval = implode( + ", ", + array_map(fn($value): string => $this->formatId($value), $this->columns) + ); } - return "EVAL " . implode(", ", $items); + return "EVAL " . $eval; } } diff --git a/src/Helper/Esql/FromCommand.php b/src/Helper/Esql/FromCommand.php index 30cb7550e..5dc5cc543 100644 --- a/src/Helper/Esql/FromCommand.php +++ b/src/Helper/Esql/FromCommand.php @@ -40,7 +40,7 @@ protected function renderInternal(): string $s = "FROM " . implode(", ", $this->indices); if (sizeof($this->metadata_fields)) { $s .= " METADATA " . implode( - ", ", array_map(array($this, "format_id"), $this->metadata_fields) + ", ", array_map(array($this, "formatId"), $this->metadata_fields) ); } return $s; diff --git a/src/Helper/Esql/GrokCommand.php b/src/Helper/Esql/GrokCommand.php index d94a727a0..43bec6487 100644 --- a/src/Helper/Esql/GrokCommand.php +++ b/src/Helper/Esql/GrokCommand.php @@ -33,6 +33,6 @@ public function __construct(EsqlBase $parent, string $input, string $pattern) protected function renderInternal(): string { - return "GROK " . $this->format_id($this->input) . " " . json_encode($this->pattern); + return "GROK " . $this->formatId($this->input) . " " . json_encode($this->pattern); } } diff --git a/src/Helper/Esql/KeepCommand.php b/src/Helper/Esql/KeepCommand.php index f359041c8..9d9c8bf42 100644 --- a/src/Helper/Esql/KeepCommand.php +++ b/src/Helper/Esql/KeepCommand.php @@ -32,7 +32,7 @@ public function __construct(EsqlBase $parent, array $columns) protected function renderInternal(): string { return "KEEP " . implode( - ", ", array_map(array($this, "format_id"), $this->columns) + ", ", array_map(array($this, "formatId"), $this->columns) ); } } diff --git a/src/Helper/Esql/LookupJoinCommand.php b/src/Helper/Esql/LookupJoinCommand.php index e43c192c7..fbadba190 100644 --- a/src/Helper/Esql/LookupJoinCommand.php +++ b/src/Helper/Esql/LookupJoinCommand.php @@ -53,6 +53,6 @@ protected function renderInternal(): string throw new RuntimeException ("Joins require a field to join on."); } return "LOOKUP JOIN " . $this->lookup_index . - " ON " . $this->format_id($this->field); + " ON " . $this->formatId($this->field); } } diff --git a/src/Helper/Esql/MvExpandCommand.php b/src/Helper/Esql/MvExpandCommand.php index 0f500488c..99e7a62c5 100644 --- a/src/Helper/Esql/MvExpandCommand.php +++ b/src/Helper/Esql/MvExpandCommand.php @@ -31,6 +31,6 @@ public function __construct(EsqlBase $parent, string $column) protected function renderInternal(): string { - return "MV_EXPAND " . $this->format_id($this->column); + return "MV_EXPAND " . $this->formatId($this->column); } } diff --git a/src/Helper/Esql/Query.php b/src/Helper/Esql/Query.php index 383dc758d..88e1c3db4 100644 --- a/src/Helper/Esql/Query.php +++ b/src/Helper/Esql/Query.php @@ -16,19 +16,19 @@ abstract class Query { /** - * The `FROM` source command returns a table with data from a data stream, - * index, or alias. + The `FROM` source command returns a table with data from a data stream, + index, or alias. * - * @param string $indices A list of indices, data streams or aliases. Supports - * wildcards and date math. + @param string $indices A list of indices, data streams or aliases. Supports + wildcards and date math. * - * Examples: + Examples: * - * query1 = ESQL.from_("employees") - * query2 = ESQL.from_("") - * query3 = ESQL.from_("employees-00001", "other-employees-*") - * query4 = ESQL.from_("cluster_one:employees-00001", "cluster_two:other-employees-*") - * query5 = ESQL.from_("employees").metadata("_id") + $query1 = Query::from("employees"); + $query2 = Query::from(""); + $query3 = Query::from("employees-00001", "other-employees-*"); + $query4 = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); + $query5 = Query::from("employees")->metadata("_id"); */ public static function from(string ...$indices): FromCommand { @@ -36,17 +36,16 @@ public static function from(string ...$indices): FromCommand } /** - * The ``ROW`` source command produces a row with one or more columns with - * values that you specify. This can be useful for testing. + The ``ROW`` source command produces a row with one or more columns with + values that you specify. This can be useful for testing. * - * @param string ...$params the column values to produce, given as keyword - * arguments. + @param string ...$params the column values to produce, given as keyword + arguments. * - * Examples: + Examples: * - * query1 = ESQL.row(a=1, b="two", c=None) - * query2 = ESQL.row(a=[1, 2]) - * query3 = ESQL.row(a=functions.round(1.23, 0)) + $query1 = Query::row(a: 1, b: "two", c: null); + $query2 = Query::row(a: [2, 1]); */ public static function row(mixed ...$params): RowCommand { @@ -54,14 +53,14 @@ public static function row(mixed ...$params): RowCommand } /** - * The `SHOW` source command returns information about the deployment and - * its capabilities. + The `SHOW` source command returns information about the deployment and + its capabilities. * - * @param string $item Can only be `INFO`. + @param string $item Can only be `INFO`. * - * Examples: + Examples: * - * query = ESQL.show("INFO") + $query = Query::show("INFO"); */ public static function show(string $item): ShowCommand { @@ -69,14 +68,15 @@ public static function show(string $item): ShowCommand } /** - * This method can only be used inside a `FORK` command to create each branch. + This method can only be used inside a `FORK` command to create each branch. * - * Examples: + Examples: * - * query = ESQL.from_("employees").fork( - * ESQL.branch().where("emp_no == 10001"), - * ESQL.branch().where("emp_no == 10002"), - * ) + $query = Query::from("employees") + ->fork( + Query::branch()->where("emp_no == 10001"), + Query::branch()->where("emp_no == 10002"), + ) */ public static function branch(): Branch { diff --git a/src/Helper/Esql/RenameCommand.php b/src/Helper/Esql/RenameCommand.php index 265fa96e0..09feec834 100644 --- a/src/Helper/Esql/RenameCommand.php +++ b/src/Helper/Esql/RenameCommand.php @@ -27,7 +27,7 @@ class RenameCommand extends EsqlBase { public function __construct(EsqlBase $parent, array $columns) { - if (!$this->is_named_argument_list($columns)) { + if (!$this->isNamedArgumentList($columns)) { throw new RuntimeException("Only named arguments are valid"); } parent::__construct($parent); @@ -36,14 +36,6 @@ public function __construct(EsqlBase $parent, array $columns) protected function renderInternal(): string { - $items = array_map( - function(string $key): string { - return $this->format_id($key) . " AS " . - $this->format_id($this->named_columns[$key]); - }, - array_keys($this->named_columns) - ); - - return "RENAME " . implode(", ", $items); + return "RENAME " . $this->formatKeyValues($this->named_columns, joinText: "AS"); } } diff --git a/src/Helper/Esql/RerankCommand.php b/src/Helper/Esql/RerankCommand.php index 8cd4fdd82..02c713839 100644 --- a/src/Helper/Esql/RerankCommand.php +++ b/src/Helper/Esql/RerankCommand.php @@ -34,7 +34,7 @@ public function __construct(EsqlBase $parent, array $query) throw new RuntimeException("Only one query is supported"); } parent::__construct($parent); - if ($this->is_named_argument_list($query)) { + if ($this->isNamedArgumentList($query)) { $this->named_query = $query; } else { @@ -84,13 +84,13 @@ protected function renderInternal(): string if (sizeof($this->named_query)) { $column = array_keys($this->named_query)[0]; $value = array_values($this->named_query)[0]; - $query = $this->format_id($column) . " = " . json_encode($value); + $query = $this->formatId($column) . " = " . json_encode($value); } else { $query = json_encode($this->query); } return "RERANK " . $query . - " ON " . implode(", ", array_map(array($this, "format_id"), $this->fields)) . + " ON " . implode(", ", array_map(array($this, "formatId"), $this->fields)) . " WITH " . json_encode($with); } } diff --git a/src/Helper/Esql/RowCommand.php b/src/Helper/Esql/RowCommand.php index c14479b31..778e96fbe 100644 --- a/src/Helper/Esql/RowCommand.php +++ b/src/Helper/Esql/RowCommand.php @@ -30,6 +30,6 @@ public function __construct(array $params) protected function renderInternal(): string { - return "ROW " . $this->format_kv($this->params); + return "ROW " . $this->formatKeyValues($this->params, jsonEncode: true); } } diff --git a/src/Helper/Esql/ShowCommand.php b/src/Helper/Esql/ShowCommand.php index d9c79dbfa..aff14b0db 100644 --- a/src/Helper/Esql/ShowCommand.php +++ b/src/Helper/Esql/ShowCommand.php @@ -30,6 +30,6 @@ public function __construct(string $item) protected function renderInternal(): string { - return "SHOW " . $this->format_id($this->item); + return "SHOW " . $this->formatId($this->item); } } diff --git a/src/Helper/Esql/SortCommand.php b/src/Helper/Esql/SortCommand.php index 7b8ebbeca..8161afd8f 100644 --- a/src/Helper/Esql/SortCommand.php +++ b/src/Helper/Esql/SortCommand.php @@ -34,7 +34,7 @@ protected function renderInternal(): string $sorts = []; foreach ($this->columns as $column) { array_push($sorts, implode( - " ", array_map(array($this, "format_id"), explode(" ", $column)) + " ", array_map(array($this, "formatId"), explode(" ", $column)) )); } return "SORT " . implode(", ", $sorts); diff --git a/src/Helper/Esql/StatsCommand.php b/src/Helper/Esql/StatsCommand.php index 771699ab3..db4e80d25 100644 --- a/src/Helper/Esql/StatsCommand.php +++ b/src/Helper/Esql/StatsCommand.php @@ -28,7 +28,7 @@ class StatsCommand extends EsqlBase { public function __construct(EsqlBase $parent, array $expressions) { parent::__construct($parent); - if ($this->is_named_argument_list($expressions)) { + if ($this->isNamedArgumentList($expressions)) { $this->named_expressions = $expressions; } else { @@ -54,21 +54,18 @@ public function by(string ...$grouping_expressions): StatsCommand protected function renderInternal(): string { if (sizeof($this->named_expressions)) { - $items = array_map( - function(string $key): string { - return $this->format_id($key) . " = " . - $this->format_id($this->named_expressions[$key]); - }, - array_keys($this->named_expressions) - ); + $expr = $this->formatKeyValues($this->named_expressions, implodeText: ",\n "); } else { - $items = array_map(fn($value): string => $this->format_id($value), $this->expressions); + $expr = implode( + ", ", + array_map(fn($value): string => $this->formatId($value), $this->expressions) + ); } $by = ""; if (sizeof($this->grouping_expressions)) { $by = "\n BY " . implode(", ", $this->grouping_expressions); } - return "STATS " . implode(",\n ", $items) . $by; + return "STATS " . $expr . $by; } } diff --git a/tests/Helper/EsqlTest.php b/tests/Helper/EsqlTest.php index c5290d7a6..5b045c15d 100644 --- a/tests/Helper/EsqlTest.php +++ b/tests/Helper/EsqlTest.php @@ -22,7 +22,7 @@ class EsqlTest extends TestCase { public function testFrom(): void { - $query = Query::from("employees"); + $query = Query::from("employees"); $this->assertEquals( "FROM employees\n", $query->__toString() From 491b3b200300b0e1bb5f6fa4fff40a902af902d1 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Fri, 10 Oct 2025 16:01:14 +0100 Subject: [PATCH 6/9] add latest ES|QL commands --- src/Helper/Esql/EsqlBase.php | 37 ++++++- src/Helper/Esql/FromCommand.php | 5 +- src/Helper/Esql/FuseCommand.php | 56 ++++++++++ src/Helper/Esql/InlineStatsCommand.php | 25 +++++ src/Helper/Esql/Query.php | 75 ++++++++------ src/Helper/Esql/StatsCommand.php | 8 +- src/Helper/Esql/TSCommand.php | 19 ++++ tests/Helper/EsqlTest.php | 138 +++++++++++++++++++++++++ 8 files changed, 327 insertions(+), 36 deletions(-) create mode 100644 src/Helper/Esql/FuseCommand.php create mode 100644 src/Helper/Esql/InlineStatsCommand.php create mode 100644 src/Helper/Esql/TSCommand.php diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php index 65ef2bfba..15cf3b4ad 100644 --- a/src/Helper/Esql/EsqlBase.php +++ b/src/Helper/Esql/EsqlBase.php @@ -298,6 +298,22 @@ public function fork( return new ForkCommand($this, $fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8); } + /** + * The `FUSE` processing command merges rows from multiple result sets and assigns + * new relevance scores. + * + * @param string $method Defaults to `RRF`. Can be one of `RRF` (for Reciprocal Rank Fusion) + * or `LINEAR` (for linear combination of scores). Designates which + * method to use to assign new relevance scores. + * + * Examples: + * + */ + public function fuse(string $method = ""): FuseCommand + { + return new FuseCommand($this, $method); + } + /** * `GROK` enables you to extract structured data out of a string. * @@ -334,6 +350,25 @@ public function grok(string $input, string $pattern): GrokCommand return new GrokCommand($this, $input, $pattern); } + /** + * The `INLINE STATS` processing command groups rows according to a common value + * and calculates one or more aggregated values over the grouped rows. + * + * The command is identical to ``STATS`` except that it preserves all the columns from + * the input table. + * + * @param string ...$expressions A list of boolean expressions, given as + * positional or named arguments. These + * expressions are combined with an `AND` + * logical operator. + * + * Examples: + */ + public function inlineStats(string ...$expressions): InlineStatsCommand + { + return new InlineStatsCommand($this, $expressions); + } + /** * The `KEEP` processing command enables you to specify what columns are returned * and the order in which they are returned. @@ -538,8 +573,6 @@ public function sort(string ...$columns): SortCommand * or named arguments. The argument names are * used for the returned aggregated values. * - * Note that only one of `expressions` and `named_expressions` must be provided. - * * Examples: * * $query1 = Query::from("employees") diff --git a/src/Helper/Esql/FromCommand.php b/src/Helper/Esql/FromCommand.php index 5dc5cc543..334e7652b 100644 --- a/src/Helper/Esql/FromCommand.php +++ b/src/Helper/Esql/FromCommand.php @@ -15,6 +15,7 @@ namespace Elastic\Elasticsearch\Helper\Esql; class FromCommand extends EsqlBase { + const name = "FROM"; private array $indices; private array $metadata_fields = []; @@ -24,7 +25,7 @@ public function __construct(array $indices) } /** - * Continuation of the `FROM` source command. + * Continuation of the `FROM` or `TS` source commands. * * *param string ...$metadata_fields Metadata fields to retrieve, given as * positional arguments. @@ -37,7 +38,7 @@ public function metadata(string ...$metadata_fields): FromCommand protected function renderInternal(): string { - $s = "FROM " . implode(", ", $this->indices); + $s = $this::name . " " . implode(", ", $this->indices); if (sizeof($this->metadata_fields)) { $s .= " METADATA " . implode( ", ", array_map(array($this, "formatId"), $this->metadata_fields) diff --git a/src/Helper/Esql/FuseCommand.php b/src/Helper/Esql/FuseCommand.php new file mode 100644 index 000000000..08190a8f1 --- /dev/null +++ b/src/Helper/Esql/FuseCommand.php @@ -0,0 +1,56 @@ +method = $method; + } + + public function by(string ...$columns): FuseCommand + { + $this->columns = $columns; + return $this; + } + + public function with(mixed ...$options): FuseCommand + { + $this->options = $options; + return $this; + } + + protected function renderInternal(): string + { + $method = ($this->method != "") ? " " . strtoupper($this->method) : ""; + $by = sizeof($this->columns) ? " " . implode(" ", array_map(function($column) { + return "BY " . $column; + }, $this->columns)) : ""; + $with = sizeof($this->options) ? " WITH " . json_encode($this->options) : ""; + return "FUSE" . $method . $by . $with; + } + +} diff --git a/src/Helper/Esql/InlineStatsCommand.php b/src/Helper/Esql/InlineStatsCommand.php new file mode 100644 index 000000000..ce41b4d55 --- /dev/null +++ b/src/Helper/Esql/InlineStatsCommand.php @@ -0,0 +1,25 @@ +"); - $query3 = Query::from("employees-00001", "other-employees-*"); - $query4 = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); - $query5 = Query::from("employees")->metadata("_id"); + * $query1 = Query::from("employees"); + * $query2 = Query::from(""); + * $query3 = Query::from("employees-00001", "other-employees-*"); + * $query4 = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); + * $query5 = Query::from("employees")->metadata("_id"); */ public static function from(string ...$indices): FromCommand { @@ -36,16 +36,16 @@ public static function from(string ...$indices): FromCommand } /** - The ``ROW`` source command produces a row with one or more columns with - values that you specify. This can be useful for testing. + * The ``ROW`` source command produces a row with one or more columns with + * values that you specify. This can be useful for testing. * - @param string ...$params the column values to produce, given as keyword - arguments. + * @param string ...$params the column values to produce, given as keyword + * arguments. * - Examples: + * Examples: * - $query1 = Query::row(a: 1, b: "two", c: null); - $query2 = Query::row(a: [2, 1]); + * $query1 = Query::row(a: 1, b: "two", c: null); + * $query2 = Query::row(a: [2, 1]); */ public static function row(mixed ...$params): RowCommand { @@ -53,14 +53,14 @@ public static function row(mixed ...$params): RowCommand } /** - The `SHOW` source command returns information about the deployment and - its capabilities. + * The `SHOW` source command returns information about the deployment and + * its capabilities. * - @param string $item Can only be `INFO`. + * @param string $item Can only be `INFO`. * - Examples: + * Examples: * - $query = Query::show("INFO"); + * $query = Query::show("INFO"); */ public static function show(string $item): ShowCommand { @@ -68,15 +68,32 @@ public static function show(string $item): ShowCommand } /** - This method can only be used inside a `FORK` command to create each branch. + * The `TS` source command is similar to ``FROM``, but for time series indices. * - Examples: + * @param string $indices A list of indices, data streams or aliases. Supports + * wildcards and date math. * - $query = Query::from("employees") - ->fork( - Query::branch()->where("emp_no == 10001"), - Query::branch()->where("emp_no == 10002"), - ) + * Examples: + * + * $query = Query::ts("metrics") + * ->where("@timestamp >= now() - 1 day") + * ->stats("SUM(AVG_OVER_TIME(memory_usage))").by("host", "TBUCKET(1 hour)") + */ + public static function ts(string ...$indices): TSCommand + { + return new TSCommand($indices); + } + + /** + * This method can only be used inside a `FORK` command to create each branch. + * + * Examples: + * + * $query = Query::from("employees") + * ->fork( + * Query::branch()->where("emp_no == 10001"), + * Query::branch()->where("emp_no == 10002"), + * ) */ public static function branch(): Branch { diff --git a/src/Helper/Esql/StatsCommand.php b/src/Helper/Esql/StatsCommand.php index db4e80d25..e2f15782e 100644 --- a/src/Helper/Esql/StatsCommand.php +++ b/src/Helper/Esql/StatsCommand.php @@ -21,6 +21,7 @@ * that belong to an ES|QL query in a single expression. */ class StatsCommand extends EsqlBase { + const name = "STATS"; private array $expressions = []; private array $named_expressions = []; private array $grouping_expressions = []; @@ -53,8 +54,9 @@ public function by(string ...$grouping_expressions): StatsCommand protected function renderInternal(): string { + $indent = str_repeat(" ", strlen($this::name) + 3); if (sizeof($this->named_expressions)) { - $expr = $this->formatKeyValues($this->named_expressions, implodeText: ",\n "); + $expr = $this->formatKeyValues($this->named_expressions, implodeText: ",\n" . $indent); } else { $expr = implode( @@ -64,8 +66,8 @@ protected function renderInternal(): string } $by = ""; if (sizeof($this->grouping_expressions)) { - $by = "\n BY " . implode(", ", $this->grouping_expressions); + $by = "\n" . $indent . "BY " . implode(", ", $this->grouping_expressions); } - return "STATS " . $expr . $by; + return $this::name . " " . $expr . $by; } } diff --git a/src/Helper/Esql/TSCommand.php b/src/Helper/Esql/TSCommand.php new file mode 100644 index 000000000..73ec6cc73 --- /dev/null +++ b/src/Helper/Esql/TSCommand.php @@ -0,0 +1,19 @@ +where("@timestamp >= now() - 1 day") + ->stats("SUM(AVG_OVER_TIME(memory_usage))")->by("host", "TBUCKET(1 hour)"); + $this->assertEquals(<<= now() - 1 day + | STATS SUM(AVG_OVER_TIME(memory_usage)) + BY host, TBUCKET(1 hour)\n + ESQL, + $query->__toString() + ); + + } + public function testChangePoint(): void { $query = Query::row(key: range(1, 25)) @@ -255,6 +271,66 @@ public function testFork(): void ); } + public function testFuse(): void + { + $query = Query::from("books")->metadata("_id", "_index", "_score") + ->fork( + Query::branch()->where('title:"Shakespeare"')->sort("_score DESC"), + Query::branch()->where('semantic_title:"Shakespeare"')->sort("_score DESC") + ) + ->fuse(); + $this->assertEquals(<<__toString() + ); + $query = Query::from("books")->metadata("_id", "_index", "_score") + ->fork( + Query::branch()->where('title:"Shakespeare"')->sort("_score DESC"), + Query::branch()->where('semantic_title:"Shakespeare"')->sort("_score DESC") + ) + ->fuse("linear"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("books")->metadata("_id", "_index", "_score") + ->fork( + Query::branch()->where('title:"Shakespeare"')->sort("_score DESC"), + Query::branch()->where('semantic_title:"Shakespeare"')->sort("_score DESC") + ) + ->fuse("linear")->by("title", "description"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("books")->metadata("_id", "_index", "_score") + ->fork( + Query::branch()->where('title:"Shakespeare"')->sort("_score DESC"), + Query::branch()->where('semantic_title:"Shakespeare"')->sort("_score DESC") + ) + ->fuse("linear")->with(normalizer: "minmax"); + $this->assertEquals(<<__toString() + ); + } + public function testGrok(): void { $query = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") @@ -297,6 +373,68 @@ public function testGrok(): void ); } + public function testInlineStats(): void + { + $query = Query::from("employees") + ->keep("emp_no", "languages", "salary") + ->inlineStats(max_salary: "MAX(salary)")->by("languages"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("emp_no", "languages", "salary") + ->inlineStats(max_salary: "MAX(salary)"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->where("still_hired") + ->keep("emp_no", "languages", "salary", "hire_date") + ->eval(tenure: "DATE_DIFF(\"year\", hire_date, \"2025-09-18T00:00:00\")") + ->drop("hire_date") + ->inlineStats( + avg_salary: "AVG(salary)", + count: "COUNT(*)", + )->by("languages", "tenure"); + $this->assertEquals(<<__toString() + ); + $query = Query::from("employees") + ->keep("emp_no", "salary") + ->inlineStats( + avg_lt_50: "ROUND(AVG(salary)) WHERE salary < 50000", + avg_lt_60: "ROUND(AVG(salary)) WHERE salary >= 50000 AND salary < 60000", + avg_gt_60: "ROUND(AVG(salary)) WHERE salary >= 60000", + ); + $this->assertEquals(<<= 50000 AND salary < 60000, + avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000\n + ESQL, + $query->__toString() + ); + } + public function testKeep(): void { $query = Query::from("employees") From 94723e807105355ece8c31db5fe4a5d9f95b6fee Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 5 Nov 2025 12:37:14 +0000 Subject: [PATCH 7/9] rename $parent to $previous_command --- src/Helper/Esql/ChangePointCommand.php | 4 ++-- src/Helper/Esql/CompletionCommand.php | 4 ++-- src/Helper/Esql/DissectCommand.php | 4 ++-- src/Helper/Esql/DropCommand.php | 4 ++-- src/Helper/Esql/EnrichCommand.php | 4 ++-- src/Helper/Esql/EsqlBase.php | 14 +++++++------- src/Helper/Esql/EvalCommand.php | 4 ++-- src/Helper/Esql/ForkCommand.php | 4 ++-- src/Helper/Esql/FuseCommand.php | 4 ++-- src/Helper/Esql/GrokCommand.php | 4 ++-- src/Helper/Esql/KeepCommand.php | 4 ++-- src/Helper/Esql/LimitCommand.php | 4 ++-- src/Helper/Esql/LookupJoinCommand.php | 4 ++-- src/Helper/Esql/MvExpandCommand.php | 4 ++-- src/Helper/Esql/RenameCommand.php | 4 ++-- src/Helper/Esql/RerankCommand.php | 4 ++-- src/Helper/Esql/SampleCommand.php | 4 ++-- src/Helper/Esql/SortCommand.php | 4 ++-- src/Helper/Esql/StatsCommand.php | 4 ++-- src/Helper/Esql/WhereCommand.php | 4 ++-- 20 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/Helper/Esql/ChangePointCommand.php b/src/Helper/Esql/ChangePointCommand.php index 44670355b..c6d3287d8 100644 --- a/src/Helper/Esql/ChangePointCommand.php +++ b/src/Helper/Esql/ChangePointCommand.php @@ -26,9 +26,9 @@ class ChangePointCommand extends EsqlBase { private string $type_name = ""; private string $pvalue_name = ""; - public function __construct(EsqlBase $parent, string $value) + public function __construct(EsqlBase $previous_command, string $value) { - parent::__construct($parent); + parent::__construct($previous_command); $this->value = $value; } diff --git a/src/Helper/Esql/CompletionCommand.php b/src/Helper/Esql/CompletionCommand.php index 5727cd86f..f4ab1d588 100644 --- a/src/Helper/Esql/CompletionCommand.php +++ b/src/Helper/Esql/CompletionCommand.php @@ -27,12 +27,12 @@ class CompletionCommand extends EsqlBase { private array $named_prompt = []; private string $inference_id = ""; - public function __construct(EsqlBase $parent, array $prompt) + public function __construct(EsqlBase $previous_command, array $prompt) { if (sizeof($prompt) != 1) { throw new RuntimeException("Only one prompt is supported"); } - parent::__construct($parent); + parent::__construct($previous_command); if ($this->isNamedArgumentList($prompt)) { $this->named_prompt = $prompt; } diff --git a/src/Helper/Esql/DissectCommand.php b/src/Helper/Esql/DissectCommand.php index 0781ed452..f664b55ad 100644 --- a/src/Helper/Esql/DissectCommand.php +++ b/src/Helper/Esql/DissectCommand.php @@ -25,9 +25,9 @@ class DissectCommand extends EsqlBase { private string $pattern; private string $separator = ""; - public function __construct(EsqlBase $parent, string $input, string $pattern) + public function __construct(EsqlBase $previous_command, string $input, string $pattern) { - parent::__construct($parent); + parent::__construct($previous_command); $this->input = $input; $this->pattern = $pattern; } diff --git a/src/Helper/Esql/DropCommand.php b/src/Helper/Esql/DropCommand.php index fb8738012..353d85e9e 100644 --- a/src/Helper/Esql/DropCommand.php +++ b/src/Helper/Esql/DropCommand.php @@ -23,9 +23,9 @@ class DropCommand extends EsqlBase { private array $columns; - public function __construct(EsqlBase $parent, array $columns) + public function __construct(EsqlBase $previous_command, array $columns) { - parent::__construct($parent); + parent::__construct($previous_command); $this->columns = $columns; } diff --git a/src/Helper/Esql/EnrichCommand.php b/src/Helper/Esql/EnrichCommand.php index 8a4419b37..1c5c8fc75 100644 --- a/src/Helper/Esql/EnrichCommand.php +++ b/src/Helper/Esql/EnrichCommand.php @@ -26,9 +26,9 @@ class EnrichCommand extends EsqlBase { private array $fields = []; private array $named_fields = []; - public function __construct(EsqlBase $parent, string $policy) + public function __construct(EsqlBase $previous_command, string $policy) { - parent::__construct($parent); + parent::__construct($previous_command); $this->policy = $policy; } diff --git a/src/Helper/Esql/EsqlBase.php b/src/Helper/Esql/EsqlBase.php index 15cf3b4ad..04347815e 100644 --- a/src/Helper/Esql/EsqlBase.php +++ b/src/Helper/Esql/EsqlBase.php @@ -17,7 +17,7 @@ use RuntimeException; abstract class EsqlBase { - private ?EsqlBase $parent = null; + private ?EsqlBase $previous_command = null; /** * Formatting helper that renders an identifier using proper escaping rules. @@ -78,15 +78,15 @@ protected function isForked(): bool if (get_class($this) == "ForkCommand") { return true; } - if ($this->parent) { - return $this->parent->isForked(); + if ($this->previous_command) { + return $this->previous_command->isForked(); } return false; } - public function __construct(?EsqlBase $parent) + public function __construct(?EsqlBase $previous_command) { - $this->parent = $parent; + $this->previous_command = $previous_command; } /** @@ -95,8 +95,8 @@ public function __construct(?EsqlBase $parent) public function render(): string { $query = ""; - if ($this->parent) { - $query .= $this->parent->render() . "\n| "; + if ($this->previous_command) { + $query .= $this->previous_command->render() . "\n| "; } $query .= $this->renderInternal(); return $query; diff --git a/src/Helper/Esql/EvalCommand.php b/src/Helper/Esql/EvalCommand.php index 55595f2a4..c2736eb62 100644 --- a/src/Helper/Esql/EvalCommand.php +++ b/src/Helper/Esql/EvalCommand.php @@ -24,9 +24,9 @@ class EvalCommand extends EsqlBase { private array $columns = []; private array $named_columns = []; - public function __construct(EsqlBase $parent, array $columns) + public function __construct(EsqlBase $previous_command, array $columns) { - parent::__construct($parent); + parent::__construct($previous_command); if ($this->isNamedArgumentList($columns)) { $this->named_columns = $columns; } diff --git a/src/Helper/Esql/ForkCommand.php b/src/Helper/Esql/ForkCommand.php index 6eaf3fa5e..0c50e3b7b 100644 --- a/src/Helper/Esql/ForkCommand.php +++ b/src/Helper/Esql/ForkCommand.php @@ -24,7 +24,7 @@ class ForkCommand extends EsqlBase { private array $branches; public function __construct( - EsqlBase $parent, + EsqlBase $previous_command, EsqlBase $fork1, ?EsqlBase $fork2 = null, ?EsqlBase $fork3 = null, @@ -35,7 +35,7 @@ public function __construct( ?EsqlBase $fork8 = null ) { - parent::__construct($parent); + parent::__construct($previous_command); $this->branches = [$fork1, $fork2, $fork3, $fork4, $fork5, $fork6, $fork7, $fork8]; } diff --git a/src/Helper/Esql/FuseCommand.php b/src/Helper/Esql/FuseCommand.php index 08190a8f1..b5bebf8fb 100644 --- a/src/Helper/Esql/FuseCommand.php +++ b/src/Helper/Esql/FuseCommand.php @@ -25,9 +25,9 @@ class FuseCommand extends EsqlBase { private array $columns = []; private array $options = []; - public function __construct(EsqlBase $parent, string $method) + public function __construct(EsqlBase $previous_command, string $method) { - parent::__construct($parent); + parent::__construct($previous_command); $this->method = $method; } diff --git a/src/Helper/Esql/GrokCommand.php b/src/Helper/Esql/GrokCommand.php index 43bec6487..b4a0e87cb 100644 --- a/src/Helper/Esql/GrokCommand.php +++ b/src/Helper/Esql/GrokCommand.php @@ -24,9 +24,9 @@ class GrokCommand extends EsqlBase { private string $input; private string $pattern; - public function __construct(EsqlBase $parent, string $input, string $pattern) + public function __construct(EsqlBase $previous_command, string $input, string $pattern) { - parent::__construct($parent); + parent::__construct($previous_command); $this->input = $input; $this->pattern = $pattern; } diff --git a/src/Helper/Esql/KeepCommand.php b/src/Helper/Esql/KeepCommand.php index 9d9c8bf42..95919531d 100644 --- a/src/Helper/Esql/KeepCommand.php +++ b/src/Helper/Esql/KeepCommand.php @@ -23,9 +23,9 @@ class KeepCommand extends EsqlBase { private array $columns; - public function __construct(EsqlBase $parent, array $columns) + public function __construct(EsqlBase $previous_command, array $columns) { - parent::__construct($parent); + parent::__construct($previous_command); $this->columns = $columns; } diff --git a/src/Helper/Esql/LimitCommand.php b/src/Helper/Esql/LimitCommand.php index 082ee59af..8248544a8 100644 --- a/src/Helper/Esql/LimitCommand.php +++ b/src/Helper/Esql/LimitCommand.php @@ -23,9 +23,9 @@ class LimitCommand extends EsqlBase { private int $max_number_of_rows; - public function __construct(EsqlBase $parent, int $max_number_of_rows) + public function __construct(EsqlBase $previous_command, int $max_number_of_rows) { - parent::__construct($parent); + parent::__construct($previous_command); $this->max_number_of_rows = $max_number_of_rows; } diff --git a/src/Helper/Esql/LookupJoinCommand.php b/src/Helper/Esql/LookupJoinCommand.php index fbadba190..64d22a30c 100644 --- a/src/Helper/Esql/LookupJoinCommand.php +++ b/src/Helper/Esql/LookupJoinCommand.php @@ -26,9 +26,9 @@ class LookupJoinCommand extends EsqlBase { private string $lookup_index; private string $field; - public function __construct(EsqlBase $parent, string $lookup_index) + public function __construct(EsqlBase $previous_command, string $lookup_index) { - parent::__construct($parent); + parent::__construct($previous_command); $this->lookup_index = $lookup_index; } diff --git a/src/Helper/Esql/MvExpandCommand.php b/src/Helper/Esql/MvExpandCommand.php index 99e7a62c5..e8d98d4b7 100644 --- a/src/Helper/Esql/MvExpandCommand.php +++ b/src/Helper/Esql/MvExpandCommand.php @@ -23,9 +23,9 @@ class MvExpandCommand extends EsqlBase { private string $column; - public function __construct(EsqlBase $parent, string $column) + public function __construct(EsqlBase $previous_command, string $column) { - parent::__construct($parent); + parent::__construct($previous_command); $this->column = $column; } diff --git a/src/Helper/Esql/RenameCommand.php b/src/Helper/Esql/RenameCommand.php index 09feec834..949b4da4c 100644 --- a/src/Helper/Esql/RenameCommand.php +++ b/src/Helper/Esql/RenameCommand.php @@ -25,12 +25,12 @@ class RenameCommand extends EsqlBase { private array $named_columns; - public function __construct(EsqlBase $parent, array $columns) + public function __construct(EsqlBase $previous_command, array $columns) { if (!$this->isNamedArgumentList($columns)) { throw new RuntimeException("Only named arguments are valid"); } - parent::__construct($parent); + parent::__construct($previous_command); $this->named_columns = $columns; } diff --git a/src/Helper/Esql/RerankCommand.php b/src/Helper/Esql/RerankCommand.php index 02c713839..c8288846a 100644 --- a/src/Helper/Esql/RerankCommand.php +++ b/src/Helper/Esql/RerankCommand.php @@ -28,12 +28,12 @@ class RerankCommand extends EsqlBase { private array $fields = []; private string $inference_id = ""; - public function __construct(EsqlBase $parent, array $query) + public function __construct(EsqlBase $previous_command, array $query) { if (sizeof($query) != 1) { throw new RuntimeException("Only one query is supported"); } - parent::__construct($parent); + parent::__construct($previous_command); if ($this->isNamedArgumentList($query)) { $this->named_query = $query; } diff --git a/src/Helper/Esql/SampleCommand.php b/src/Helper/Esql/SampleCommand.php index 44cc9ba2b..115f47875 100644 --- a/src/Helper/Esql/SampleCommand.php +++ b/src/Helper/Esql/SampleCommand.php @@ -23,9 +23,9 @@ class SampleCommand extends EsqlBase { private float $probability; - public function __construct(EsqlBase $parent, float $probability) + public function __construct(EsqlBase $previous_command, float $probability) { - parent::__construct($parent); + parent::__construct($previous_command); $this->probability = $probability; } diff --git a/src/Helper/Esql/SortCommand.php b/src/Helper/Esql/SortCommand.php index 8161afd8f..c9d0eb91c 100644 --- a/src/Helper/Esql/SortCommand.php +++ b/src/Helper/Esql/SortCommand.php @@ -23,9 +23,9 @@ class SortCommand extends EsqlBase { private array $columns; - public function __construct(EsqlBase $parent, array $columns) + public function __construct(EsqlBase $previous_command, array $columns) { - parent::__construct($parent); + parent::__construct($previous_command); $this->columns = $columns; } diff --git a/src/Helper/Esql/StatsCommand.php b/src/Helper/Esql/StatsCommand.php index e2f15782e..042fb5179 100644 --- a/src/Helper/Esql/StatsCommand.php +++ b/src/Helper/Esql/StatsCommand.php @@ -26,9 +26,9 @@ class StatsCommand extends EsqlBase { private array $named_expressions = []; private array $grouping_expressions = []; - public function __construct(EsqlBase $parent, array $expressions) + public function __construct(EsqlBase $previous_command, array $expressions) { - parent::__construct($parent); + parent::__construct($previous_command); if ($this->isNamedArgumentList($expressions)) { $this->named_expressions = $expressions; } diff --git a/src/Helper/Esql/WhereCommand.php b/src/Helper/Esql/WhereCommand.php index 9d588a281..2af2df827 100644 --- a/src/Helper/Esql/WhereCommand.php +++ b/src/Helper/Esql/WhereCommand.php @@ -23,9 +23,9 @@ class WhereCommand extends EsqlBase { private array $expressions; - public function __construct(EsqlBase $parent, array $expressions) + public function __construct(EsqlBase $previous_command, array $expressions) { - parent::__construct($parent); + parent::__construct($previous_command); $this->expressions = $expressions; } From 5468f6fa505abdb0044c3a48c68632fa09ae5751 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 5 Nov 2025 12:49:08 +0000 Subject: [PATCH 8/9] use a cast instead of a direct call to __toString() --- tests/Helper/EsqlTest.php | 126 +++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/tests/Helper/EsqlTest.php b/tests/Helper/EsqlTest.php index 85d7e4c92..a6cfeb506 100644 --- a/tests/Helper/EsqlTest.php +++ b/tests/Helper/EsqlTest.php @@ -25,31 +25,31 @@ public function testFrom(): void $query = Query::from("employees"); $this->assertEquals( "FROM employees\n", - $query->__toString() + (string) $query ); $query = Query::from(""); $this->assertEquals( "FROM \n", - $query->__toString() + (string) $query ); $query = Query::from("employees-00001", "other-employees-*"); $this->assertEquals( "FROM employees-00001, other-employees-*\n", - $query->__toString() + (string) $query ); $query = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); $this->assertEquals( "FROM cluster_one:employees-00001, cluster_two:other-employees-*\n", - $query->__toString() + (string) $query ); $query = Query::from("employees")->metadata("_id"); $this->assertEquals( "FROM employees METADATA _id\n", - $query->__toString() + (string) $query ); } @@ -58,13 +58,13 @@ public function testRow(): void $query = Query::row(a: 1, b: "two", c: null); $this->assertEquals( "ROW a = 1, b = \"two\", c = null\n", - $query->__toString() + (string) $query ); $query = Query::row(a: [2, 1]); $this->assertEquals( "ROW a = [2,1]\n", - $query->__toString() + (string) $query ); } @@ -73,7 +73,7 @@ public function testShow(): void $query = Query::show("INFO"); $this->assertEquals( "SHOW INFO\n", - $query->__toString() + (string) $query ); } @@ -88,7 +88,7 @@ public function testTS(): void | STATS SUM(AVG_OVER_TIME(memory_usage)) BY host, TBUCKET(1 hour)\n ESQL, - $query->__toString() + (string) $query ); } @@ -108,7 +108,7 @@ public function testChangePoint(): void | CHANGE_POINT value ON key | WHERE type IS NOT NULL\n ESQL, - $query->__toString() + (string) $query ); } @@ -122,7 +122,7 @@ public function testCompletion(): void | COMPLETION question WITH {"inference_id":"test_completion_model"} | KEEP question, completion\n ESQL, - $query->__toString() + (string) $query ); $query = Query::row(question: "What is Elasticsearch?") @@ -133,7 +133,7 @@ public function testCompletion(): void | COMPLETION answer = question WITH {"inference_id":"test_completion_model"} | KEEP question, answer\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("movies") @@ -161,7 +161,7 @@ public function testCompletion(): void | COMPLETION summary = prompt WITH {"inference_id":"test_completion_model"} | KEEP title, summary, rating\n ESQL, - $query->__toString() + (string) $query ); } @@ -175,16 +175,16 @@ public function testDissect(): void | DISSECT a "%{date} - %{msg} - %{ip}" | KEEP date, msg, ip\n ESQL, - $query->__toString() + (string) $query ); } public function testDrop(): void { $query = Query::from("employees")->drop("height"); - $this->assertEquals("FROM employees\n| DROP height\n", $query->__toString()); + $this->assertEquals("FROM employees\n| DROP height\n", (string) $query); $query = Query::from("employees")->drop("height*"); - $this->assertEquals("FROM employees\n| DROP height*\n", $query->__toString()); + $this->assertEquals("FROM employees\n| DROP height*\n", (string) $query); } public function testEnrich(): void @@ -194,14 +194,14 @@ public function testEnrich(): void ROW language_code = "1" | ENRICH languages_policy\n ESQL, - $query->__toString() + (string) $query ); $query = Query::row(language_code: "1")->enrich("languages_policy")->on("a"); $this->assertEquals(<<__toString() + (string) $query ); $query = Query::row(language_code: "1") ->enrich("languages_policy")->on("a")->with(name: "language_name"); @@ -209,7 +209,7 @@ public function testEnrich(): void ROW language_code = "1" | ENRICH languages_policy ON a WITH name = language_name\n ESQL, - $query->__toString() + (string) $query ); } @@ -225,7 +225,7 @@ public function testEval(): void | KEEP first_name, last_name, height | EVAL height_feet = height * 3.281, height_cm = height * 100\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->sort("emp_no") @@ -237,7 +237,7 @@ public function testEval(): void | KEEP first_name, last_name, height | EVAL height * 3.281\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->eval("height * 3.281") @@ -247,7 +247,7 @@ public function testEval(): void | EVAL height * 3.281 | STATS avg_height_feet = AVG(`height * 3.281`)\n ESQL, - $query->__toString() + (string) $query ); } @@ -267,7 +267,7 @@ public function testFork(): void | KEEP emp_no, _fork | SORT emp_no\n ESQL, - $query->__toString() + (string) $query ); } @@ -285,7 +285,7 @@ public function testFuse(): void ( WHERE semantic_title:"Shakespeare" | SORT _score DESC ) | FUSE\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("books")->metadata("_id", "_index", "_score") ->fork( @@ -299,7 +299,7 @@ public function testFuse(): void ( WHERE semantic_title:"Shakespeare" | SORT _score DESC ) | FUSE LINEAR\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("books")->metadata("_id", "_index", "_score") ->fork( @@ -313,7 +313,7 @@ public function testFuse(): void ( WHERE semantic_title:"Shakespeare" | SORT _score DESC ) | FUSE LINEAR BY title BY description\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("books")->metadata("_id", "_index", "_score") ->fork( @@ -327,7 +327,7 @@ public function testFuse(): void ( WHERE semantic_title:"Shakespeare" | SORT _score DESC ) | FUSE LINEAR WITH {"normalizer":"minmax"}\n ESQL, - $query->__toString() + (string) $query ); } @@ -344,7 +344,7 @@ public function testGrok(): void | GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}" | KEEP date, ip, email, num\n ESQL, - $query->__toString() + (string) $query ); $query = Query::row(a: "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42") ->grok( @@ -359,7 +359,7 @@ public function testGrok(): void | KEEP date, ip, email, num | EVAL date = TO_DATETIME(date)\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("addresses") ->keep("city.name", "zip_code") @@ -369,7 +369,7 @@ public function testGrok(): void | KEEP city.name, zip_code | GROK zip_code "%{WORD:zip_parts} %{WORD:zip_parts}"\n ESQL, - $query->__toString() + (string) $query ); } @@ -384,7 +384,7 @@ public function testInlineStats(): void | INLINE STATS max_salary = MAX(salary) BY languages\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("emp_no", "languages", "salary") @@ -394,7 +394,7 @@ public function testInlineStats(): void | KEEP emp_no, languages, salary | INLINE STATS max_salary = MAX(salary)\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->where("still_hired") @@ -415,7 +415,7 @@ public function testInlineStats(): void count = COUNT(*) BY languages, tenure\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("emp_no", "salary") @@ -431,7 +431,7 @@ public function testInlineStats(): void avg_lt_60 = ROUND(AVG(salary)) WHERE salary >= 50000 AND salary < 60000, avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000\n ESQL, - $query->__toString() + (string) $query ); } @@ -443,7 +443,7 @@ public function testKeep(): void FROM employees | KEEP emp_no, first_name, last_name, height\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("h*"); @@ -451,7 +451,7 @@ public function testKeep(): void FROM employees | KEEP h*\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("h*", "first_name"); @@ -459,7 +459,7 @@ public function testKeep(): void FROM employees | KEEP h*, first_name\n ESQL, - $query->__toString() + (string) $query ); } @@ -473,7 +473,7 @@ public function testLimit(): void | WHERE field == "value" | LIMIT 1000\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("index") ->stats("AVG(field1)")->by("field2") @@ -484,7 +484,7 @@ public function testLimit(): void BY field2 | LIMIT 20000\n ESQL, - $query->__toString() + (string) $query ); } @@ -498,7 +498,7 @@ public function testLookupJoin(): void | LOOKUP JOIN threat_list ON source.IP | WHERE threat_level IS NOT NULL\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("system_metrics") ->lookupJoin("host_inventory")->on("host.name") @@ -508,7 +508,7 @@ public function testLookupJoin(): void | LOOKUP JOIN host_inventory ON host.name | LOOKUP JOIN ownerships ON host.name\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("app_logs") ->lookupJoin("service_owners")->on("service_id"); @@ -516,7 +516,7 @@ public function testLookupJoin(): void FROM app_logs | LOOKUP JOIN service_owners ON service_id\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->eval(language_code: "languages") @@ -528,7 +528,7 @@ public function testLookupJoin(): void | WHERE emp_no >= 10091 AND emp_no < 10094 | LOOKUP JOIN languages_lookup ON language_code\n ESQL, - $query->__toString() + (string) $query ); } @@ -540,7 +540,7 @@ public function testMvExpand(): void ROW a = [1,2,3], b = "b", j = ["a","b"] | MV_EXPAND a\n ESQL, - $query->__toString() + (string) $query ); } @@ -554,7 +554,7 @@ public function testRename(): void | KEEP first_name, last_name, still_hired | RENAME still_hired AS employed\n ESQL, - $query->__toString() + (string) $query ); } @@ -576,7 +576,7 @@ public function testRerank(): void | LIMIT 3 | KEEP title, _score\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("books")->metadata("_score") ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") @@ -596,7 +596,7 @@ public function testRerank(): void | LIMIT 3 | KEEP title, _score, rerank_score\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("books")->metadata("_score") ->where("MATCH(description, \"hobbit\") OR MATCH(author, \"Tolkien\")") @@ -618,7 +618,7 @@ public function testRerank(): void | LIMIT 3 | KEEP title, original_score, rerank_score, _score\n ESQL, - $query->__toString() + (string) $query ); } @@ -632,7 +632,7 @@ public function testSample(): void | KEEP emp_no | SAMPLE 0.05\n ESQL, - $query->__toString() + (string) $query ); } @@ -646,7 +646,7 @@ public function testSort(): void | KEEP first_name, last_name, height | SORT height\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("first_name", "last_name", "height") @@ -656,7 +656,7 @@ public function testSort(): void | KEEP first_name, last_name, height | SORT height DESC\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("first_name", "last_name", "height") @@ -666,7 +666,7 @@ public function testSort(): void | KEEP first_name, last_name, height | SORT height DESC, first_name ASC\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("first_name", "last_name", "height") @@ -676,7 +676,7 @@ public function testSort(): void | KEEP first_name, last_name, height | SORT first_name ASC NULLS FIRST\n ESQL, - $query->__toString() + (string) $query ); } @@ -691,7 +691,7 @@ public function testStats(): void BY languages | SORT languages\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->stats(avg_lang: "AVG(languages)"); @@ -699,7 +699,7 @@ public function testStats(): void FROM employees | STATS avg_lang = AVG(languages)\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->stats( @@ -711,7 +711,7 @@ public function testStats(): void | STATS avg_lang = AVG(languages), max_lang = MAX(languages)\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->stats( @@ -726,7 +726,7 @@ public function testStats(): void BY gender | SORT gender\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->eval(Ks: "salary / 1000") @@ -744,7 +744,7 @@ public function testStats(): void over_60K = COUNT(*) WHERE 60 <= Ks, total = COUNT(*)\n ESQL, - $query->__toString() + (string) $query ); $query = Query::row(i: 1, a: ["a", "b"]) ->stats("MIN(i)")->by("a") @@ -755,7 +755,7 @@ public function testStats(): void BY a | SORT a ASC\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->eval(hired: "DATE_FORMAT(\"yyyy\", hire_date)") @@ -770,7 +770,7 @@ public function testStats(): void | EVAL avg_salary = ROUND(avg_salary) | SORT hired, languages.long\n ESQL, - $query->__toString() + (string) $query ); } @@ -784,7 +784,7 @@ public function testWhere(): void | KEEP first_name, last_name, still_hired | WHERE still_hired == true\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("sample_data") ->where("@timestamp > NOW() - 1 hour"); @@ -792,7 +792,7 @@ public function testWhere(): void FROM sample_data | WHERE @timestamp > NOW() - 1 hour\n ESQL, - $query->__toString() + (string) $query ); $query = Query::from("employees") ->keep("first_name", "last_name", "height") @@ -802,7 +802,7 @@ public function testWhere(): void | KEEP first_name, last_name, height | WHERE LENGTH(first_name) < 4\n ESQL, - $query->__toString() + (string) $query ); } } From 9e24bec90ddb83eacae3269ee4d755e9b8571762 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Thu, 6 Nov 2025 11:18:14 +0000 Subject: [PATCH 9/9] documentation --- docs/reference/esql.md | 69 ++++++++++++++++++ docs/reference/images/autocompleting-from.png | Bin 0 -> 217704 bytes .../reference/images/autocompleting-query.png | Bin 0 -> 110392 bytes tests/Helper/EsqlTest.php | 1 - 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 docs/reference/images/autocompleting-from.png create mode 100644 docs/reference/images/autocompleting-query.png diff --git a/docs/reference/esql.md b/docs/reference/esql.md index a4cd11655..0b730daac 100644 --- a/docs/reference/esql.md +++ b/docs/reference/esql.md @@ -14,6 +14,7 @@ There are two ways to use ES|QL in the PHP client: * Use the Elasticsearch [ES|QL API](https://www.elastic.co/docs/api/doc/elasticsearch/group/endpoint-esql) directly: This is the most flexible approach, but it’s also the most complex because you must handle results in their raw form. You can choose the precise format of results, such as JSON, CSV, or text. * Use ES|QL `mapTo($class)` helper. This mapper takes care of parsing the raw response and converting into an array of objects. If you don’t specify the class using the `$class` parameter, the mapper uses [stdClass](https://www.php.net/manual/en/class.stdclass.php). +ES|QL queries can be given directly as regular strings or heredoc strings, or for a more convenient option you can use the [ES|QL query builder](#esql-query-builder) helper, which can define ES|QL queries using PHP code. ## How to use the ES|QL API [esql-how-to] @@ -206,3 +207,71 @@ $result = $client->esql()->query([ $books = $result->mapTo(Book::class); // Array of Book ``` +## Using the ES|QL query builder [esql-query-builder] + +::::{warning} +This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. +:::: + +The ES|QL query builder allows you to construct ES|QL queries using PHP syntax. Consider the following example: + +```php +use Elastic\Elasticsearch\Helper\Esql\Query; + +$query = Query::from("employees") + ->sort("emp_no") + ->keep("first_name", "last_name", "height") + ->eval(height_feet: "height * 3.281", height_cm: "height * 100") + ->limit(3); +``` + +Casting this query object to a string returns the raw ES|QL query, which you can send to the Elasticsearch ES|QL API: + +```php +$result = $client->esql()->query([ + 'body' => ['query' => (string)$query] +]); +``` + +### Creating an ES|QL query + +To construct an ES|QL query object you typically use `Query::from()`, although there are more [source commands](https://www.elastic.co/docs/reference/query-languages/esql/commands/source-commands) available. Here are some examples: + +```php +// FROM employees +$query = Query::from("employees"); + +// FROM +$query = Query::from(""); + +// FROM employees-00001, other-employees-* +$query = Query::from("employees-00001", "other-employees-*"); + +// FROM cluster_one:employees-00001, cluster_two:other-employees-* +$query = Query::from("cluster_one:employees-00001", "cluster_two:other-employees-*"); + +// FROM employees METADATA _id +$query = Query::from("employees")->metadata("_id"); +``` + +Note how in the last example the optional `METADATA` clause of the `FROM` command is added as a chained method. + +### Adding processing commands + +Once you have a query object, you can add one or more processing commands to it by chaining them. The following example shows how to create a query that uses the `WHERE` and `LIMIT` processing commands to filter the results: + +```php +$query = Query::from("employees") + ->where("still_hired == true") + ->limit(10); +``` + +The ES|QL documentation includes the complete list of available [processing commands](https://www.elastic.co/docs/reference/query-languages/esql/commands/processing-commands). + +### Using Code completion + +You can rely on autocompletion as an aid in constructing ES|QL queries with the query builder. Note that this requires an IDE that is configured with a PHP language server. + +![Autocompleting Query::](images/autocompleting-query.png) + +![Autocompleting from()](images/autocompleting-from.png) diff --git a/docs/reference/images/autocompleting-from.png b/docs/reference/images/autocompleting-from.png new file mode 100644 index 0000000000000000000000000000000000000000..10e83dead0e911f9a798830451f3df631310ab34 GIT binary patch literal 217704 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

aOPd^W1peT;-bRH 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