+ */
+ public function toArray(array|Json|string $value) : array
+ {
+ if ($value instanceof Json) {
+ return $value->toArray();
+ }
+
+ if (\is_string($value)) {
+ $decoded = \json_decode($value, true);
+ return \is_array($decoded) ? $decoded : [];
}
- return str_pad($input, $length, $padString, $padType);
+ return $value;
}
}
diff --git a/web/landing/templates/completers/_macros.twig b/web/landing/templates/completers/_macros.twig
new file mode 100644
index 0000000000..6d0315e3af
--- /dev/null
+++ b/web/landing/templates/completers/_macros.twig
@@ -0,0 +1,36 @@
+{#
+ # Macros for building CodeMirror completer data
+ #}
+
+{#
+ # Builds a single parameter with HTML spans
+ # @param object param - {name, type, has_default_value, default_value}
+ # @return string - HTML span elements for the parameter
+ #}
+{% macro build_param(param) %}
+{%- set types = param.type|to_array -%}
+{%- if types is not empty -%}
+{{ types|format_type }} {% endif -%}
+${{ param.name }}
+{%- if param.has_default_value and param.default_value is defined %} = {{ param.default_value }} {% endif -%}
+{% endmacro %}
+
+{#
+ # Builds the full highlighted signature HTML
+ # @param string name - method/function name
+ # @param array parameters - array of parameter objects
+ # @param array return_type - array of return type objects (optional)
+ # @return string - Complete HTML signature
+ #}
+{% macro highlighted_signature(name, parameters, return_type) %}
+{%- import _self as macros -%}
+{%- set params = parameters|to_array -%}
+{%- set ret_type = return_type|to_array -%}
+{{ name }} (
+{%- for param in params -%}
+{{ macros.build_param(param) }}
+{%- if not loop.last -%}, {% endif -%}
+{%- endfor -%}
+)
+{%- if ret_type is not empty %} : {{ ret_type|format_type }} {% endif -%}
+{% endmacro %}
diff --git a/web/landing/templates/completers/dataframe-codemirror.js.twig b/web/landing/templates/completers/dataframe-codemirror.js.twig
index 03da5c1568..8da5cd867c 100644
--- a/web/landing/templates/completers/dataframe-codemirror.js.twig
+++ b/web/landing/templates/completers/dataframe-codemirror.js.twig
@@ -1,3 +1,4 @@
+{% import 'completers/_macros.twig' as macros %}
/**
* CodeMirror Completer for Flow PHP DataFrame Methods
*
@@ -15,28 +16,30 @@ const dataframeReturningMethods = {{ dataframe_returning_methods|json_encode|raw
// DataFrame methods
const dataframeMethods = [
{% for method in dataframe_methods %}
- {
+{%- set params = method.parameters|to_array -%}
+{%- set doc = method.doc_comment|format_doc_comment -%}
+ {
label: "{{ method.name }}",
type: "method",
- detail: "{{ method.className|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
+ detail: "{{ method.class|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- {{ method.highlightedSignature|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ macros.highlighted_signature(method.name, method.parameters, method.return_type)|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
- {% if method.docComment %}
+ {% if doc %}
- {{ method.docComment|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ doc|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
{% endif %}
`
return div
},
- apply: snippet("{{ method.name }}({% if method.parameters|length > 0 %}{% for param in method.parameters %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
+ apply: snippet("{{ method.name }}({% if params|length > 0 %}{% for param in params %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
boost: 10
}{% if not loop.last %},{% endif %}
- {% endfor %}
+ {% endfor %}
]
/**
diff --git a/web/landing/templates/completers/dsl-codemirror.js.twig b/web/landing/templates/completers/dsl-codemirror.js.twig
index b6e46a7259..3cea414303 100644
--- a/web/landing/templates/completers/dsl-codemirror.js.twig
+++ b/web/landing/templates/completers/dsl-codemirror.js.twig
@@ -1,3 +1,4 @@
+{% import 'completers/_macros.twig' as macros %}
/**
* CodeMirror Completer for Flow PHP DSL Functions
*
@@ -18,6 +19,8 @@ import { CompletionContext, snippet } from "@codemirror/autocomplete"
// All DSL functions
const dslFunctions = [
{% for func in functions %}
+ {% set params = func.parameters|to_array %}
+ {% set doc = func.doc_comment|format_doc_comment %}
{
label: "{{ func.name }}",
type: "function",
@@ -26,17 +29,17 @@ const dslFunctions = [
const div = document.createElement("div")
div.innerHTML = `
- {{ func.highlightedSignature|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'})|raw }}
+ {{ macros.highlighted_signature(func.name, func.parameters, func.return_type)|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'})|raw }}
- {% if func.docComment %}
+ {% if doc %}
- {{ func.docComment|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ doc|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
{% endif %}
`
return div
},
- apply: snippet("{{ func.fullName }}({% if func.parameters|length > 0 %}{% for param in func.parameters %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
+ apply: snippet("{{ func.fullName }}({% if params|length > 0 %}{% for param in params %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
boost: 10
}{% if not loop.last %},{% endif %}
{% endfor %}
diff --git a/web/landing/templates/completers/flow-codemirror.js.twig b/web/landing/templates/completers/flow-codemirror.js.twig
index 8085200b39..edecd61e96 100644
--- a/web/landing/templates/completers/flow-codemirror.js.twig
+++ b/web/landing/templates/completers/flow-codemirror.js.twig
@@ -1,3 +1,4 @@
+{% import 'completers/_macros.twig' as macros %}
/**
* CodeMirror Completer for Flow PHP Flow Methods
*
@@ -17,25 +18,27 @@ const flowFunctions = [
// Flow methods
const flowMethods = [
{% for method in flow_methods %}
+ {% set params = method.parameters|to_array %}
+ {% set doc = method.doc_comment|format_doc_comment %}
{
label: "{{ method.name }}",
type: "method",
- detail: "{{ method.className|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
+ detail: "{{ method.class|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- {{ method.highlightedSignature|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'})|raw }}
+ {{ macros.highlighted_signature(method.name, method.parameters, method.return_type)|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'})|raw }}
- {% if method.docComment %}
+ {% if doc %}
- {{ method.docComment|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ doc|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
{% endif %}
`
return div
},
- apply: snippet("{{ method.name }}({% if method.hasParameters %}{% for param in method.parameters %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
+ apply: snippet("{{ method.name }}({% if params|length > 0 %}{% for param in params %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
boost: 10
}{% if not loop.last %},{% endif %}
{% endfor %}
diff --git a/web/landing/templates/completers/scalarfunctionchain-codemirror.js.twig b/web/landing/templates/completers/scalarfunctionchain-codemirror.js.twig
index 364e2bddf0..c5b537f383 100644
--- a/web/landing/templates/completers/scalarfunctionchain-codemirror.js.twig
+++ b/web/landing/templates/completers/scalarfunctionchain-codemirror.js.twig
@@ -1,3 +1,4 @@
+{% import 'completers/_macros.twig' as macros %}
/**
* CodeMirror Completer for Flow PHP ScalarFunctionChain Methods
*
@@ -17,25 +18,27 @@ const scalarFunctionChainFunctions = [
// ScalarFunctionChain methods
const scalarFunctionChainMethods = [
{% for method in scalarfunctionchain_methods %}
+ {% set params = method.parameters|to_array %}
+ {% set doc = method.doc_comment|format_doc_comment %}
{
label: "{{ method.name }}",
type: "method",
- detail: "{{ method.className|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
+ detail: "{{ method.class|replace({'"': '\\"', "'": "\\'", '\\': '\\\\'}) }}",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- {{ method.highlightedSignature|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ macros.highlighted_signature(method.name, method.parameters, method.return_type)|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
- {% if method.docComment %}
+ {% if doc %}
- {{ method.docComment|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
+ {{ doc|replace({'"': '\\"', "'": "\\'", '\\': '\\\\', '`': '\\`'})|raw }}
{% endif %}
`
return div
},
- apply: snippet("{{ method.name }}({% if method.parameters|length > 0 %}{% for param in method.parameters %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
+ apply: snippet("{{ method.name }}({% if params|length > 0 %}{% for param in params %}" + "$" + "{" + "{{ loop.index }}:{{ param.name }}" + "}" + "{% if not loop.last %}, {% endif %}{% endfor %}{% endif %})"),
boost: 10
}{% if not loop.last %},{% endif %}
{% endfor %}
diff --git a/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dataframe.js b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dataframe.js
new file mode 100644
index 0000000000..2cb5686d4c
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dataframe.js
@@ -0,0 +1,1201 @@
+/**
+ * CodeMirror Completer for Flow PHP DataFrame Methods
+ *
+ * DataFrame methods: 61
+ * DataFrame-returning methods from classes: 3
+ *
+ * This completer triggers after DataFrame-returning methods
+ */
+
+import { CompletionContext, snippet } from "@codemirror/autocomplete"
+
+// Map of DataFrame-returning methods grouped by class
+const dataframeReturningMethods = {"flow":["extract","from","process","read"],"dataframe":["aggregate","autoCast","batchBy","batchSize","cache","collect","collectRefs","constrain","crossJoin","drop","dropDuplicates","dropPartitions","duplicateRow","filter","filterPartitions","filters","join","joinEach","limit","load","map","match","mode","offset","onError","partitionBy","pivot","rename","renameAll","renameAllLowerCase","renameAllStyle","renameAllUpperCase","renameAllUpperCaseFirst","renameAllUpperCaseWord","renameEach","reorderEntries","rows","saveMode","select","sortBy","transform","until","validate","void","with","withEntries","withEntry","write"],"groupeddataframe":["aggregate"]};
+
+// DataFrame methods
+const dataframeMethods = [
+ {
+ label: "aggregate",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ aggregate ( AggregatingFunction $aggregations ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("aggregate(" + "$" + "{" + "1:aggregations" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "autoCast",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ autoCast ( ) : self
+
+ `
+ return div
+ },
+ apply: snippet("autoCast()"),
+ boost: 10
+ }, {
+ label: "batchBy",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batchBy ( Reference|string $column , int $minSize = null ) : self
+
+
+ Merge/Split Rows yielded by Extractor into batches but keep those with common value in given column together. This works properly only on sorted datasets. When minSize is not provided, batches will be created only when there is a change in value of the column. When minSize is provided, batches will be created only when there is a change in value of the column or when there are at least minSize rows in the batch. @param Reference|string $column - column to group by (all rows with same value stay together) @param null|int<1, max> $minSize - optional minimum rows per batch for efficiency @lazy @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("batchBy(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:minSize" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batchSize",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batchSize ( int $size ) : self
+
+
+ Merge/Split Rows yielded by Extractor into batches of given size. For example, when Extractor is yielding one row at time, this method will merge them into batches of given size before passing them to the next pipeline element. Similarly when Extractor is yielding batches of rows, this method will split them into smaller batches of given size. In order to merge all Rows into a single batch use DataFrame::collect() method or set size to -1 or 0. @param int<1, max> $size @lazy
+
+ `
+ return div
+ },
+ apply: snippet("batchSize(" + "$" + "{" + "1:size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cache",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cache ( string $id = null , int $cacheBatchSize = null ) : self
+
+
+ Start processing rows up to this moment and put each instance of Rows into previously defined cache. Cache type can be set through ConfigBuilder. By default everything is cached in system tmp dir. Important: cache batch size might significantly improve performance when processing large amount of rows. Larger batch size will increase memory consumption but will reduce number of IO operations. When not set, the batch size is taken from the last DataFrame::batchSize() call. @lazy @param null|string $id @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("cache(" + "$" + "{" + "1:id" + "}" + ", " + "$" + "{" + "2:cacheBatchSize" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "collect",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ collect ( ) : self
+
+
+ Before transforming rows, collect them and merge into single Rows instance. This might lead to memory issues when processing large amount of rows, use with caution. @lazy
+
+ `
+ return div
+ },
+ apply: snippet("collect()"),
+ boost: 10
+ }, {
+ label: "collectRefs",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ collectRefs ( References $references ) : self
+
+
+ This method allows to collect references to all entries used in this pipeline. \`\`\`php (new Flow()) ->read(From::chain()) ->collectRefs($refs = refs()) ->run(); \`\`\` @lazy
+
+ `
+ return div
+ },
+ apply: snippet("collectRefs(" + "$" + "{" + "1:references" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "constrain",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ constrain ( Constraint $constraint , Constraint $constraints ) : self
+
+ `
+ return div
+ },
+ apply: snippet("constrain(" + "$" + "{" + "1:constraint" + "}" + ", " + "$" + "{" + "2:constraints" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "count",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ count ( ) : int
+
+
+ @trigger Return total count of rows processed by this pipeline.
+
+ `
+ return div
+ },
+ apply: snippet("count()"),
+ boost: 10
+ }, {
+ label: "crossJoin",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ crossJoin ( self $dataFrame , string $prefix = '' ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("crossJoin(" + "$" + "{" + "1:dataFrame" + "}" + ", " + "$" + "{" + "2:prefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "display",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ display ( int $limit = 20 , int|bool $truncate = 20 , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... ) : string
+
+
+ @param int $limit maximum numbers of rows to display @param bool|int $truncate false or if set to 0 columns are not truncated, otherwise default truncate to 20 characters @param Formatter $formatter @trigger @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("display(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:truncate" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "drop",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ drop ( Reference|string $entries ) : self
+
+
+ Drop given entries. @lazy
+
+ `
+ return div
+ },
+ apply: snippet("drop(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dropDuplicates",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dropDuplicates ( Reference|string $entries ) : self
+
+
+ @param Reference|string ...$entries @lazy @return $this
+
+ `
+ return div
+ },
+ apply: snippet("dropDuplicates(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dropPartitions",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dropPartitions ( bool $dropPartitionColumns = false ) : self
+
+
+ Drop all partitions from Rows, additionally when $dropPartitionColumns is set to true, partition columns are also removed. @lazy
+
+ `
+ return div
+ },
+ apply: snippet("dropPartitions(" + "$" + "{" + "1:dropPartitionColumns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "duplicateRow",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ duplicateRow ( mixed $condition , WithEntry $entries ) : self
+
+ `
+ return div
+ },
+ apply: snippet("duplicateRow(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "fetch",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ fetch ( int $limit = null ) : Rows
+
+
+ Be aware that fetch is not memory safe and will load all rows into memory. If you want to safely iterate over Rows use oe of the following methods:. DataFrame::get() : \\Generator DataFrame::getAsArray() : \\Generator DataFrame::getEach() : \\Generator DataFrame::getEachAsArray() : \\Generator @trigger @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("fetch(" + "$" + "{" + "1:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filter",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filter ( ScalarFunction $function ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("filter(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filterPartitions",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filterPartitions ( Filter|ScalarFunction $filter ) : self
+
+
+ @lazy @throws RuntimeException
+
+ `
+ return div
+ },
+ apply: snippet("filterPartitions(" + "$" + "{" + "1:filter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filters",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filters ( array $functions ) : self
+
+
+ @lazy @param array $functions
+
+ `
+ return div
+ },
+ apply: snippet("filters(" + "$" + "{" + "1:functions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "forEach",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ forEach ( callable $callback = null ) : void
+
+
+ @trigger @param null|callable(Rows $rows) : void $callback
+
+ `
+ return div
+ },
+ apply: snippet("forEach(" + "$" + "{" + "1:callback" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "get",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ get ( ) : Generator
+
+
+ Yields each row as an instance of Rows. @trigger @return \\Generator
+
+ `
+ return div
+ },
+ apply: snippet("get()"),
+ boost: 10
+ }, {
+ label: "getAsArray",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ getAsArray ( ) : Generator
+
+
+ Yields each row as an array.
@trigger
@return \\Generator
>>
+
+ `
+ return div
+ },
+ apply: snippet("getAsArray()"),
+ boost: 10
+ }, {
+ label: "getEach",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ getEach ( ) : Generator
+
+
+ Yield each row as an instance of Row. @trigger @return \\Generator
+
+ `
+ return div
+ },
+ apply: snippet("getEach()"),
+ boost: 10
+ }, {
+ label: "getEachAsArray",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ getEachAsArray ( ) : Generator
+
+
+ Yield each row as an array.
@trigger
@return \\Generator
>
+
+ `
+ return div
+ },
+ apply: snippet("getEachAsArray()"),
+ boost: 10
+ }, {
+ label: "groupBy",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ groupBy ( Reference|string $entries ) : GroupedDataFrame
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("groupBy(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "join",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ join ( self $dataFrame , Expression $on , Join|string $type = Flow\\ETL\\Join\\Join::... ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("join(" + "$" + "{" + "1:dataFrame" + "}" + ", " + "$" + "{" + "2:on" + "}" + ", " + "$" + "{" + "3:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "joinEach",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ joinEach ( DataFrameFactory $factory , Expression $on , Join|string $type = Flow\\ETL\\Join\\Join::... ) : self
+
+
+ @lazy @psalm-param string|Join $type
+
+ `
+ return div
+ },
+ apply: snippet("joinEach(" + "$" + "{" + "1:factory" + "}" + ", " + "$" + "{" + "2:on" + "}" + ", " + "$" + "{" + "3:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "limit",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ limit ( int $limit ) : self
+
+
+ @lazy @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("limit(" + "$" + "{" + "1:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "load",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ load ( Loader $loader ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("load(" + "$" + "{" + "1:loader" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "map",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ map ( callable $callback ) : self
+
+
+ @lazy @param callable(Row $row) : Row $callback
+
+ `
+ return div
+ },
+ apply: snippet("map(" + "$" + "{" + "1:callback" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "match",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ match ( Schema $schema , SchemaValidator $validator = null ) : self
+
+
+ @lazy @param null|SchemaValidator $validator - when null, StrictValidator gets initialized
+
+ `
+ return div
+ },
+ apply: snippet("match(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:validator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "mode",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ mode ( SaveMode|ExecutionMode $mode ) : self
+
+
+ This method is used to set the behavior of the DataFrame. Available modes: - SaveMode defines how Flow should behave when writing to a file/files that already exists. - ExecutionMode - defines how functions should behave when they encounter unexpected data (e.g., type mismatches, missing values). @lazy @return $this
+
+ `
+ return div
+ },
+ apply: snippet("mode(" + "$" + "{" + "1:mode" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "offset",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ offset ( int $offset ) : self
+
+
+ Skip given number of rows from the beginning of the dataset. When $offset is null, nothing happens (no rows are skipped). Performance Note: DataFrame must iterate through and process all skipped rows to reach the offset position. For large offsets, this can impact performance as the data source still needs to be read and processed up to the offset point. @param ?int<0, max> $offset @lazy @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("offset(" + "$" + "{" + "1:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "onError",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ onError ( ErrorHandler $handler ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("onError(" + "$" + "{" + "1:handler" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "partitionBy",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ partitionBy ( Reference|string $entry , Reference|string $entries ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("partitionBy(" + "$" + "{" + "1:entry" + "}" + ", " + "$" + "{" + "2:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pivot",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pivot ( Reference $ref ) : self
+
+ `
+ return div
+ },
+ apply: snippet("pivot(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "printRows",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ printRows ( int $limit = 20 , int|bool $truncate = 20 , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... ) : void
+
+
+ @trigger
+
+ `
+ return div
+ },
+ apply: snippet("printRows(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:truncate" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "printSchema",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ printSchema ( int $limit = 20 , SchemaFormatter $formatter = Flow\\ETL\\Row\\Formatter\\ASCIISchemaFormatter::... ) : void
+
+
+ @trigger
+
+ `
+ return div
+ },
+ apply: snippet("printSchema(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rename",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rename ( string $from , string $to ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("rename(" + "$" + "{" + "1:from" + "}" + ", " + "$" + "{" + "2:to" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "renameAll",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAll ( string $search , string $replace ) : self
+
+
+ @lazy Iterate over all entry names and replace the given search string with replace string. @deprecated use DataFrame::renameEach() with a RenameReplaceStrategy
+
+ `
+ return div
+ },
+ apply: snippet("renameAll(" + "$" + "{" + "1:search" + "}" + ", " + "$" + "{" + "2:replace" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "renameAllLowerCase",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAllLowerCase ( ) : self
+
+
+ @lazy @deprecated use DataFrame::renameEach() with a selected StringStyles
+
+ `
+ return div
+ },
+ apply: snippet("renameAllLowerCase()"),
+ boost: 10
+ }, {
+ label: "renameAllStyle",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAllStyle ( StringStyles|StringStyles|string $style ) : self
+
+
+ @lazy Rename all entries to a given style. Please look into \\Flow\\ETL\\Function\\StyleConverter\\StringStyles class for all available styles. @deprecated use DataFrame::renameEach() with a selected Style
+
+ `
+ return div
+ },
+ apply: snippet("renameAllStyle(" + "$" + "{" + "1:style" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "renameAllUpperCase",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAllUpperCase ( ) : self
+
+
+ @lazy @deprecated use DataFrame::renameEach() with a selected Style
+
+ `
+ return div
+ },
+ apply: snippet("renameAllUpperCase()"),
+ boost: 10
+ }, {
+ label: "renameAllUpperCaseFirst",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAllUpperCaseFirst ( ) : self
+
+
+ @lazy @deprecated use DataFrame::renameEach() with a selected Style
+
+ `
+ return div
+ },
+ apply: snippet("renameAllUpperCaseFirst()"),
+ boost: 10
+ }, {
+ label: "renameAllUpperCaseWord",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameAllUpperCaseWord ( ) : self
+
+
+ @lazy @deprecated use DataFrame::renameEach() with a selected Style
+
+ `
+ return div
+ },
+ apply: snippet("renameAllUpperCaseWord()"),
+ boost: 10
+ }, {
+ label: "renameEach",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ renameEach ( RenameEntryStrategy $strategies ) : self
+
+ `
+ return div
+ },
+ apply: snippet("renameEach(" + "$" + "{" + "1:strategies" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reorderEntries",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reorderEntries ( Comparator $comparator = Flow\\ETL\\Transformer\\OrderEntries\\TypeComparator::... ) : self
+
+ `
+ return div
+ },
+ apply: snippet("reorderEntries(" + "$" + "{" + "1:comparator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rows",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rows ( Transformer|Transformation $transformer ) : self
+
+
+ @lazy Alias for ETL::transform method.
+
+ `
+ return div
+ },
+ apply: snippet("rows(" + "$" + "{" + "1:transformer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "run",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ run ( callable $callback = null , Analyze|bool $analyze = false ) : Report
+
+
+ @trigger When analyzing pipeline execution we can chose to collect various metrics through analyze()->with*() method - column statistics - analyze()->withColumnStatistics() - schema - analyze()->withSchema() @param null|callable(Rows $rows, FlowContext $context): void $callback @param Analyze|bool $analyze - when set run will return Report @return ($analyze is Analyze|true ? Report : null)
+
+ `
+ return div
+ },
+ apply: snippet("run(" + "$" + "{" + "1:callback" + "}" + ", " + "$" + "{" + "2:analyze" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "saveMode",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ saveMode ( SaveMode $mode ) : self
+
+
+ Alias for DataFrame::mode. @lazy
+
+ `
+ return div
+ },
+ apply: snippet("saveMode(" + "$" + "{" + "1:mode" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema ( ) : Schema
+
+
+ @trigger @return Schema
+
+ `
+ return div
+ },
+ apply: snippet("schema()"),
+ boost: 10
+ }, {
+ label: "select",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ select ( Reference|string $entries ) : self
+
+
+ @lazy Keep only given entries.
+
+ `
+ return div
+ },
+ apply: snippet("select(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sortBy",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sortBy ( Reference $entries ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("sortBy(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "transform",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ transform ( Transformer|Transformation|Transformations|WithEntry $transformer ) : self
+
+
+ Alias for DataFrame::with(). @lazy
+
+ `
+ return div
+ },
+ apply: snippet("transform(" + "$" + "{" + "1:transformer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "until",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ until ( ScalarFunction $function ) : self
+
+
+ The difference between filter and until is that filter will keep filtering rows until extractors finish yielding rows. Until will send a STOP signal to the Extractor when the condition is not met. @lazy
+
+ `
+ return div
+ },
+ apply: snippet("until(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "validate",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ validate ( Schema $schema , SchemaValidator $validator = null ) : self
+
+
+ @deprecated Please use DataFrame::match instead @lazy @param null|SchemaValidator $validator - when null, StrictValidator gets initialized
+
+ `
+ return div
+ },
+ apply: snippet("validate(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:validator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "void",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void ( ) : self
+
+
+ @lazy This method is useful mostly in development when you want to pause processing at certain moment without removing code. All operations will get processed up to this point, from here no rows are passed forward.
+
+ `
+ return div
+ },
+ apply: snippet("void()"),
+ boost: 10
+ }, {
+ label: "with",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ with ( Transformer|Transformation|Transformations|WithEntry $transformer ) : self
+
+
+ @lazy
+
+ `
+ return div
+ },
+ apply: snippet("with(" + "$" + "{" + "1:transformer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "withEntries",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ withEntries ( array $references ) : self
+
+
+ @lazy @param array|array $references
+
+ `
+ return div
+ },
+ apply: snippet("withEntries(" + "$" + "{" + "1:references" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "withEntry",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ withEntry ( Definition|string $entry , ScalarFunction|WindowFunction $reference ) : self
+
+
+ @param Definition|string $entry @lazy
+
+ `
+ return div
+ },
+ apply: snippet("withEntry(" + "$" + "{" + "1:entry" + "}" + ", " + "$" + "{" + "2:reference" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "write",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\DataFrame",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ write ( Loader $loader ) : self
+
+
+ @lazy Alias for ETL::load function.
+
+ `
+ return div
+ },
+ apply: snippet("write(" + "$" + "{" + "1:loader" + "}" + ")"),
+ boost: 10
+ } ]
+
+/**
+ * DataFrame method completion source for CodeMirror
+ * @param {CompletionContext} context
+ * @returns {CompletionResult|null}
+ */
+export function dataframeCompletions(context) {
+ // Get text before cursor (potentially across multiple lines)
+ // Look back up to 2000 characters to find the pattern
+ const maxLookback = 2000
+ const docText = context.state.doc.toString()
+ const startPos = Math.max(0, context.pos - maxLookback)
+ const textBefore = docText.slice(startPos, context.pos)
+
+ // Check if we're directly after -> (method chaining context)
+ // Match pattern: ->word* at the end
+ if (!new RegExp('->\\w*$').test(textBefore)) {
+ return null
+ }
+
+ // Collect all DataFrame-returning method names
+ const allMethods = []
+ for (const [className, methods] of Object.entries(dataframeReturningMethods)) {
+ allMethods.push(...methods)
+ }
+
+ if (allMethods.length === 0) {
+ return null
+ }
+
+ // Walk backwards to find the most recent completed method call at top level
+ // Strategy: find the last occurrence of methodName()->... pattern where parens are balanced
+ const methodPattern = new RegExp('\\b(' + allMethods.join('|') + ')\\s*\\(', 'g')
+ let matches = []
+ let match
+
+ while ((match = methodPattern.exec(textBefore)) !== null) {
+ matches.push({ name: match[1], index: match.index, endOfName: match.index + match[0].length })
+ }
+
+ // Walk backwards from cursor tracking parenthesis depth
+ // to find what context we're in
+ let depth = 0
+ let i = textBefore.length - 1
+
+ // Skip back past the -> and any word being typed
+ while (i >= 0 && /[\w>-]/.test(textBefore[i])) {
+ i--
+ }
+
+ // Now count parentheses going backwards
+ while (i >= 0) {
+ if (textBefore[i] === ')') depth++
+ else if (textBefore[i] === '(') {
+ depth--
+ // If we're back to depth 0, check if this ( belongs to a DataFrame method
+ if (depth === 0) {
+ // Look backwards to find the method name
+ let methodEnd = i
+ while (methodEnd > 0 && /\s/.test(textBefore[methodEnd - 1])) {
+ methodEnd--
+ }
+ let methodStart = methodEnd
+ while (methodStart > 0 && /\w/.test(textBefore[methodStart - 1])) {
+ methodStart--
+ }
+ const methodName = textBefore.slice(methodStart, methodEnd)
+
+ // Check if this is a DataFrame-returning method
+ if (allMethods.includes(methodName)) {
+ // This is it! We're directly after this method call
+ return continueWithCompletions()
+ }
+ // If not, we're done checking - we're inside some other call
+ return null
+ }
+ }
+ i--
+ }
+
+ return null
+
+ function continueWithCompletions() {
+ // Match word being typed (method name after ->)
+ const word = context.matchBefore(/\w*/)
+
+ // If no word and not explicit, don't show completions
+ if (!word && !context.explicit) {
+ return null
+ }
+
+ // Filter methods based on what's being typed
+ const prefix = word ? word.text.toLowerCase() : ''
+ const options = dataframeMethods.filter(method =>
+ !prefix || method.label.toLowerCase().startsWith(prefix)
+ )
+
+ return {
+ from: word ? word.from : context.pos,
+ options: options,
+ validFor: new RegExp('^\\w*$') // Reuse while typing word characters
+ }
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dsl.js b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dsl.js
new file mode 100644
index 0000000000..43f906df1d
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/dsl.js
@@ -0,0 +1,12032 @@
+/**
+ * CodeMirror Completer for Flow PHP DSL Functions
+ *
+ * Total functions: 703
+ *
+ * This completer provides autocompletion for all Flow PHP DSL functions:
+ * - Extractors (flow-extractors)
+ * - Loaders (flow-loaders)
+ * - Transformers (flow-transformers)
+ * - Scalar Functions (flow-scalar-functions)
+ * - Aggregating Functions (flow-aggregating-functions)
+ * - Window Functions (flow-window-functions)
+ * - And more...
+ */
+
+import { CompletionContext, snippet } from "@codemirror/autocomplete"
+
+// All DSL functions
+const dslFunctions = [
+ {
+ label: "add_row_index",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ add_row_index ( string $column = 'index' , StartFrom $startFrom = Flow\\ETL\\Transformation\\AddRowIndex\\StartFrom::... ) : AddRowIndex
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\add_row_index(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:startFrom" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg ( string $name , array $args = [] , bool $distinct = false ) : AggregateCall
+
+
+ Create an aggregate function call (COUNT, SUM, AVG, etc.). @param string $name Aggregate function name @param list $args Function arguments @param bool $distinct Use DISTINCT modifier
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:args" + "}" + ", " + "$" + "{" + "3:distinct" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg_avg",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg_avg ( Expression $expr , bool $distinct = false ) : AggregateCall
+
+
+ Create AVG aggregate.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg_avg(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:distinct" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg_count",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg_count ( Expression $expr = null , bool $distinct = false ) : AggregateCall
+
+
+ Create COUNT(*) aggregate.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg_count(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:distinct" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg_max",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg_max ( Expression $expr ) : AggregateCall
+
+
+ Create MAX aggregate.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg_max(" + "$" + "{" + "1:expr" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg_min",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg_min ( Expression $expr ) : AggregateCall
+
+
+ Create MIN aggregate.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg_min(" + "$" + "{" + "1:expr" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "agg_sum",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ agg_sum ( Expression $expr , bool $distinct = false ) : AggregateCall
+
+
+ Create SUM aggregate.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\agg_sum(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:distinct" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ all ( ScalarFunction $functions ) : All
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\all(" + "$" + "{" + "1:functions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "all_sub_select",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ all_sub_select ( Expression $left , ComparisonOperator $operator , SelectFinalStep $subquery ) : All
+
+
+ Create an ALL condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\all_sub_select(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:operator" + "}" + ", " + "$" + "{" + "3:subquery" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "alter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ alter ( ) : AlterFactory
+
+
+ Create a factory for building ALTER statements. Provides a unified entry point for all ALTER operations: - alter()->table() - ALTER TABLE - alter()->index() - ALTER INDEX - alter()->view() - ALTER VIEW - alter()->materializedView() - ALTER MATERIALIZED VIEW - alter()->sequence() - ALTER SEQUENCE - alter()->schema() - ALTER SCHEMA - alter()->role() - ALTER ROLE - alter()->function() - ALTER FUNCTION - alter()->procedure() - ALTER PROCEDURE - alter()->trigger() - ALTER TRIGGER - alter()->extension() - ALTER EXTENSION - alter()->enumType() - ALTER TYPE (enum) - alter()->domain() - ALTER DOMAIN Rename operations are also under alter(): - alter()->index(\'old\')->renameTo(\'new\') - alter()->view(\'old\')->renameTo(\'new\') - alter()->schema(\'old\')->renameTo(\'new\') - alter()->role(\'old\')->renameTo(\'new\') - alter()->trigger(\'old\')->on(\'table\')->renameTo(\'new\') Example: alter()->table(\'users\')->addColumn(col_def(\'email\', data_type_text())) Example: alter()->sequence(\'user_id_seq\')->restart(1000)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\alter()"),
+ boost: 10
+ }, {
+ label: "always_off_exemplar_filter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ always_off_exemplar_filter ( ) : AlwaysOffExemplarFilter
+
+
+ Create an AlwaysOffExemplarFilter. Never records exemplars. Use this filter to disable exemplar collection entirely for performance optimization.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\always_off_exemplar_filter()"),
+ boost: 10
+ }, {
+ label: "always_on_exemplar_filter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ always_on_exemplar_filter ( ) : AlwaysOnExemplarFilter
+
+
+ Create an AlwaysOnExemplarFilter. Records exemplars whenever a span context is present. Use this filter for debugging or when complete trace context is important.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\always_on_exemplar_filter()"),
+ boost: 10
+ }, {
+ label: "analyze",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ analyze ( ) : Analyze
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\analyze()"),
+ boost: 10
+ }, {
+ label: "analyze",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ analyze ( ) : AnalyzeFinalStep
+
+
+ Create an ANALYZE builder. Example: analyze()->table(\'users\') Produces: ANALYZE users
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\analyze()"),
+ boost: 10
+ }, {
+ label: "any",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ any ( ScalarFunction $values ) : Any
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\any(" + "$" + "{" + "1:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "any_sub_select",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ any_sub_select ( Expression $left , ComparisonOperator $operator , SelectFinalStep $subquery ) : Any
+
+
+ Create an ANY condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\any_sub_select(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:operator" + "}" + ", " + "$" + "{" + "3:subquery" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "append",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ append ( ) : SaveMode
+
+
+ Alias for save_mode_append().
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\append()"),
+ boost: 10
+ }, {
+ label: "array_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_carrier ( array $data = [] ) : ArrayCarrier
+
+
+ Create an ArrayCarrier. Carrier backed by an associative array with case-insensitive key lookup. @param array $data Initial carrier data
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\array_carrier(" + "$" + "{" + "1:data" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_contained_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_contained_by ( Expression $left , Expression $right ) : OperatorCondition
+
+
+ Create an array is contained by condition (<@). Example: array_contained_by(col(\'tags\'), raw_expr(\"ARRAY[\'sale\', \'featured\', \'new\']\")) Produces: tags <@ ARRAY[\'sale\', \'featured\', \'new\']
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\array_contained_by(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_contains",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_contains ( Expression $left , Expression $right ) : OperatorCondition
+
+
+ Create an array contains condition (@>). Example: array_contains(col(\'tags\'), raw_expr(\"ARRAY[\'sale\']\")) Produces: tags @> ARRAY[\'sale\']
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\array_contains(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_exists ( ScalarFunction|array $ref , ScalarFunction|string $path ) : ArrayPathExists
+
+
+ @param array
|ScalarFunction $ref
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_exists(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_expand",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_expand ( ScalarFunction $function , ArrayExpand $expand = Flow\\ETL\\Function\\ArrayExpand\\ArrayExpand::... ) : ArrayExpand
+
+
+ Expands each value into entry, if there are more than one value, multiple rows will be created. Array keys are ignored, only values are used to create new rows. Before: +--+-------------------+ |id| array| +--+-------------------+ | 1|{\"a\":1,\"b\":2,\"c\":3}| +--+-------------------+ After: +--+--------+ |id|expanded| +--+--------+ | 1| 1| | 1| 2| | 1| 3| +--+--------+
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_expand(" + "$" + "{" + "1:function" + "}" + ", " + "$" + "{" + "2:expand" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_expr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_expr ( array $elements ) : ArrayExpression
+
+
+ Create an array expression. @param list $elements Array elements
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\array_expr(" + "$" + "{" + "1:elements" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_get",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_get ( ScalarFunction $ref , ScalarFunction|string $path ) : ArrayGet
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_get(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_get_collection",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_get_collection ( ScalarFunction $ref , ScalarFunction|array $keys ) : ArrayGetCollection
+
+
+ @param array
|ScalarFunction $keys
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_get_collection(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_get_collection_first",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_get_collection_first ( ScalarFunction $ref , string $keys ) : ArrayGetCollection
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_get_collection_first(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_keys_style_convert",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_keys_style_convert ( ScalarFunction $ref , StringStyles|StringStyles|string $style = Flow\\ETL\\String\\StringStyles::... ) : ArrayKeysStyleConvert
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_keys_style_convert(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:style" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_key_rename",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_key_rename ( ScalarFunction $ref , ScalarFunction|string $path , ScalarFunction|string $newName ) : ArrayKeyRename
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_key_rename(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:path" + "}" + ", " + "$" + "{" + "3:newName" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_merge",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_merge ( ScalarFunction|array $left , ScalarFunction|array $right ) : ArrayMerge
+
+
+ @param array
|ScalarFunction $left @param array|ScalarFunction $right
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_merge(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_merge_collection",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_merge_collection ( ScalarFunction|array $array ) : ArrayMergeCollection
+
+
+ @param array
|ScalarFunction $array
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_merge_collection(" + "$" + "{" + "1:array" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_overlap",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_overlap ( Expression $left , Expression $right ) : OperatorCondition
+
+
+ Create an array overlap condition (&&). Example: array_overlap(col(\'tags\'), raw_expr(\"ARRAY[\'sale\', \'featured\']\")) Produces: tags && ARRAY[\'sale\', \'featured\']
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\array_overlap(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_reverse",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_reverse ( ScalarFunction|array $function , ScalarFunction|bool $preserveKeys = false ) : ArrayReverse
+
+
+ @param array
|ScalarFunction $function
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_reverse(" + "$" + "{" + "1:function" + "}" + ", " + "$" + "{" + "2:preserveKeys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_sort",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_sort ( ScalarFunction $function , ScalarFunction|Sort|null $sort_function = null , ScalarFunction|int|null $flags = null , ScalarFunction|bool $recursive = true ) : ArraySort
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_sort(" + "$" + "{" + "1:function" + "}" + ", " + "$" + "{" + "2:sort_function" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:recursive" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_to_generator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_to_generator ( array $data ) : Generator
+
+
+ @template T @param array $data @return \\Generator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\array_to_generator(" + "$" + "{" + "1:data" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_to_row",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_to_row ( array $data , EntryFactory $entryFactory , Partitions|array $partitions = [] , Schema $schema = null ) : Row
+
+
+ @param array
>|array $data @param array|Partitions $partitions @param null|Schema $schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_to_row(" + "$" + "{" + "1:data" + "}" + ", " + "$" + "{" + "2:entryFactory" + "}" + ", " + "$" + "{" + "3:partitions" + "}" + ", " + "$" + "{" + "4:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_to_rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_to_rows ( array $data , EntryFactory $entryFactory , Partitions|array $partitions = [] , Schema $schema = null ) : Rows
+
+
+ @param array
>|array $data @param array|Partitions $partitions @param null|Schema $schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_to_rows(" + "$" + "{" + "1:data" + "}" + ", " + "$" + "{" + "2:entryFactory" + "}" + ", " + "$" + "{" + "3:partitions" + "}" + ", " + "$" + "{" + "4:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "array_unpack",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ array_unpack ( ScalarFunction|array $array , ScalarFunction|array $skip_keys = [] , ScalarFunction|string|null $entry_prefix = null ) : ArrayUnpack
+
+
+ @param array
|ScalarFunction $array @param array|ScalarFunction $skip_keys
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\array_unpack(" + "$" + "{" + "1:array" + "}" + ", " + "$" + "{" + "2:skip_keys" + "}" + ", " + "$" + "{" + "3:entry_prefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "asc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ asc ( Expression $expr , NullsPosition $nulls = Flow\\PostgreSql\\QueryBuilder\\Clause\\NullsPosition::... ) : OrderBy
+
+
+ Create an ORDER BY item with ASC direction.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\asc(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:nulls" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "average",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ average ( EntryReference|string $ref , int $scale = 2 , Rounding $rounding = Flow\\Calculator\\Rounding::... ) : Average
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\average(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ", " + "$" + "{" + "3:rounding" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "aws_s3_client",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ aws_s3_client ( array $configuration ) : S3Client
+
+
+ @param array $configuration - for details please see https://async-aws.com/clients/s3.html
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\Bridge\\AsyncAWS\\DSL\\aws_s3_client(" + "$" + "{" + "1:configuration" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "aws_s3_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ aws_s3_filesystem ( string $bucket , S3Client $s3Client , Options $options = Flow\\Filesystem\\Bridge\\AsyncAWS\\Options::... ) : AsyncAWSS3Filesystem
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\Bridge\\AsyncAWS\\DSL\\aws_s3_filesystem(" + "$" + "{" + "1:bucket" + "}" + ", " + "$" + "{" + "2:s3Client" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_blob_service",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_blob_service ( Configuration $configuration , AuthorizationFactory $azure_authorization_factory , ClientInterface $client = null , HttpFactory $azure_http_factory = null , URLFactory $azure_url_factory = null , LoggerInterface $logger = null ) : BlobServiceInterface
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azure_blob_service(" + "$" + "{" + "1:configuration" + "}" + ", " + "$" + "{" + "2:azure_authorization_factory" + "}" + ", " + "$" + "{" + "3:client" + "}" + ", " + "$" + "{" + "4:azure_http_factory" + "}" + ", " + "$" + "{" + "5:azure_url_factory" + "}" + ", " + "$" + "{" + "6:logger" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_blob_service_config",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_blob_service_config ( string $account , string $container ) : Configuration
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azure_blob_service_config(" + "$" + "{" + "1:account" + "}" + ", " + "$" + "{" + "2:container" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_filesystem ( BlobServiceInterface $blob_service , Options $options = Flow\\Filesystem\\Bridge\\Azure\\Options::... ) : AzureBlobFilesystem
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\Bridge\\Azure\\DSL\\azure_filesystem(" + "$" + "{" + "1:blob_service" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_filesystem_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_filesystem_options ( ) : Options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\Bridge\\Azure\\DSL\\azure_filesystem_options()"),
+ boost: 10
+ }, {
+ label: "azure_http_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_http_factory ( RequestFactoryInterface $request_factory , StreamFactoryInterface $stream_factory ) : HttpFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azure_http_factory(" + "$" + "{" + "1:request_factory" + "}" + ", " + "$" + "{" + "2:stream_factory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_shared_key_authorization_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_shared_key_authorization_factory ( string $account , string $key ) : SharedKeyFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azure_shared_key_authorization_factory(" + "$" + "{" + "1:account" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azure_url_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azure_url_factory ( string $host = 'blob.core.windows.net' ) : AzureURLFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azure_url_factory(" + "$" + "{" + "1:host" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "azurite_url_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ azurite_url_factory ( string $host = 'localhost' , string $port = '10000' , bool $secure = false ) : AzuriteURLFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Azure\\SDK\\DSL\\azurite_url_factory(" + "$" + "{" + "1:host" + "}" + ", " + "$" + "{" + "2:port" + "}" + ", " + "$" + "{" + "3:secure" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "baggage",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ baggage ( array $entries = [] ) : Baggage
+
+
+ Create a Baggage. @param array $entries Initial key-value entries
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\baggage(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "bar_chart",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ bar_chart ( EntryReference $label , References $datasets ) : BarChart
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\bar_chart(" + "$" + "{" + "1:label" + "}" + ", " + "$" + "{" + "2:datasets" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batched_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batched_by ( Extractor $extractor , Reference|string $column , int $min_size = null ) : BatchByExtractor
+
+
+ @param null|int<1, max> $min_size
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\batched_by(" + "$" + "{" + "1:extractor" + "}" + ", " + "$" + "{" + "2:column" + "}" + ", " + "$" + "{" + "3:min_size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batches",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batches ( Extractor $extractor , int $size ) : BatchExtractor
+
+
+ @param int<1, max> $size
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\batches(" + "$" + "{" + "1:extractor" + "}" + ", " + "$" + "{" + "2:size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batching_log_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batching_log_processor ( LogExporter $exporter , int $batchSize = 512 ) : BatchingLogProcessor
+
+
+ Create a BatchingLogProcessor. Collects log records in memory and exports them in batches for efficiency. Logs are exported when batch size is reached, flush() is called, or shutdown(). @param LogExporter $exporter The exporter to send logs to @param int $batchSize Number of logs to collect before exporting (default 512)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\batching_log_processor(" + "$" + "{" + "1:exporter" + "}" + ", " + "$" + "{" + "2:batchSize" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batching_metric_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batching_metric_processor ( MetricExporter $exporter , int $batchSize = 512 ) : BatchingMetricProcessor
+
+
+ Create a BatchingMetricProcessor. Collects metrics in memory and exports them in batches for efficiency. Metrics are exported when batch size is reached, flush() is called, or shutdown(). @param MetricExporter $exporter The exporter to send metrics to @param int $batchSize Number of metrics to collect before exporting (default 512)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\batching_metric_processor(" + "$" + "{" + "1:exporter" + "}" + ", " + "$" + "{" + "2:batchSize" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batching_span_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batching_span_processor ( SpanExporter $exporter , int $batchSize = 512 ) : BatchingSpanProcessor
+
+
+ Create a BatchingSpanProcessor. Collects spans in memory and exports them in batches for efficiency. Spans are exported when batch size is reached, flush() is called, or shutdown(). @param SpanExporter $exporter The exporter to send spans to @param int $batchSize Number of spans to collect before exporting (default 512)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\batching_span_processor(" + "$" + "{" + "1:exporter" + "}" + ", " + "$" + "{" + "2:batchSize" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "batch_size",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ batch_size ( int $size ) : BatchSize
+
+
+ @param int<1, max> $size
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\batch_size(" + "$" + "{" + "1:size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "begin",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ begin ( ) : BeginOptionsStep
+
+
+ Create a BEGIN transaction builder. Example: begin()->isolationLevel(IsolationLevel::SERIALIZABLE)->readOnly() Produces: BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\begin()"),
+ boost: 10
+ }, {
+ label: "between",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ between ( mixed $value , mixed $lower_bound , mixed $upper_bound , ScalarFunction|Boundary $boundary = Flow\\ETL\\Function\\Between\\Boundary::... ) : Between
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\between(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:lower_bound" + "}" + ", " + "$" + "{" + "3:upper_bound" + "}" + ", " + "$" + "{" + "4:boundary" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "between",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ between ( Expression $expr , Expression $low , Expression $high , bool $not = false ) : Between
+
+
+ Create a BETWEEN condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\between(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:low" + "}" + ", " + "$" + "{" + "3:high" + "}" + ", " + "$" + "{" + "4:not" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "binary_expr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ binary_expr ( Expression $left , string $operator , Expression $right ) : BinaryExpression
+
+
+ Create a binary expression (left op right).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\binary_expr(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:operator" + "}" + ", " + "$" + "{" + "3:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "boolean_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ boolean_entry ( string $name , bool $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\boolean_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "bool_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ bool_entry ( string $name , bool $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\bool_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "bool_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ bool_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : BooleanDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\bool_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "bulk_insert",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ bulk_insert ( string $table , array $columns , int $rowCount ) : BulkInsert
+
+
+ Create an optimized bulk INSERT query for high-performance multi-row inserts. Unlike insert() which uses immutable builder patterns (O(n²) for n rows), this function generates SQL directly using string operations (O(n) complexity). @param string $table Table name @param list $columns Column names @param int $rowCount Number of rows to insert
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\bulk_insert(" + "$" + "{" + "1:table" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ", " + "$" + "{" + "3:rowCount" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "caching_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ caching_detector ( ResourceDetector $detector , string $cachePath = null ) : CachingDetector
+
+
+ Create a CachingDetector. Wraps another detector and caches its results to a file. On subsequent calls, returns the cached resource instead of running detection again. @param ResourceDetector $detector The detector to wrap @param null|string $cachePath Cache file path (default: sys_get_temp_dir()/flow_telemetry_resource.cache)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\caching_detector(" + "$" + "{" + "1:detector" + "}" + ", " + "$" + "{" + "2:cachePath" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "call",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ call ( ScalarFunction|callable $callable , array $parameters = [] , Type $return_type = null ) : CallUserFunc
+
+
+ Calls a user-defined function with the given parameters. @param callable|ScalarFunction $callable @param array $parameters @param null|Type $return_type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\call(" + "$" + "{" + "1:callable" + "}" + ", " + "$" + "{" + "2:parameters" + "}" + ", " + "$" + "{" + "3:return_type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "call",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ call ( string $procedure ) : CallFinalStep
+
+
+ Creates a CALL statement builder for invoking a procedure. Example: call(\'update_stats\')->with(123) Produces: CALL update_stats(123) Example: call(\'process_data\')->with(\'test\', 42, true) Produces: CALL process_data(\'test\', 42, true) @param string $procedure The name of the procedure to call @return CallFinalStep Builder for call statement options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\call(" + "$" + "{" + "1:procedure" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "capitalize",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ capitalize ( ScalarFunction|string $value ) : Capitalize
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\capitalize(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "case_when",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ case_when ( array $whenClauses , Expression $elseResult = null , Expression $operand = null ) : CaseExpression
+
+
+ Create a CASE expression. @param non-empty-list $whenClauses WHEN clauses @param null|Expression $elseResult ELSE result (optional) @param null|Expression $operand CASE operand for simple CASE (optional)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\case_when(" + "$" + "{" + "1:whenClauses" + "}" + ", " + "$" + "{" + "2:elseResult" + "}" + ", " + "$" + "{" + "3:operand" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cast",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cast ( mixed $value , Type|string $type ) : Cast
+
+
+ @param \\Flow\\Types\\Type|string $type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\cast(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cast",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cast ( Expression $expr , DataType $dataType ) : TypeCast
+
+
+ Create a type cast expression. @param Expression $expr Expression to cast @param DataType $dataType Target data type (use data_type_* functions)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cast(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:dataType" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "chain_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ chain_detector ( ResourceDetector $detectors ) : ChainDetector
+
+
+ Create a ChainDetector. Combines multiple resource detectors into a chain. Detectors are executed in order and their results are merged. Later detectors take precedence over earlier ones when there are conflicting attribute keys. @param ResourceDetector ...$detectors The detectors to chain
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\chain_detector(" + "$" + "{" + "1:detectors" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "check_constraint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ check_constraint ( string $expression ) : CheckConstraint
+
+
+ Create a CHECK constraint. @param string $expression SQL expression that must evaluate to true
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\check_constraint(" + "$" + "{" + "1:expression" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "chunks_from",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ chunks_from ( Extractor $extractor , int $chunk_size ) : BatchExtractor
+
+
+ @param int<1, max> $chunk_size @deprecated use batches() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\chunks_from(" + "$" + "{" + "1:extractor" + "}" + ", " + "$" + "{" + "2:chunk_size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "close_cursor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ close_cursor ( string $cursorName = null ) : CloseCursorFinalStep
+
+
+ Close a cursor. Example: close_cursor(\'my_cursor\') Produces: CLOSE my_cursor Example: close_cursor() - closes all cursors Produces: CLOSE ALL @param null|string $cursorName Cursor to close, or null to close all
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\close_cursor(" + "$" + "{" + "1:cursorName" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cluster",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cluster ( ) : ClusterFinalStep
+
+
+ Create a CLUSTER builder. Example: cluster()->table(\'users\')->using(\'idx_users_pkey\') Produces: CLUSTER users USING idx_users_pkey
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cluster()"),
+ boost: 10
+ }, {
+ label: "coalesce",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ coalesce ( ScalarFunction $values ) : Coalesce
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\coalesce(" + "$" + "{" + "1:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "coalesce",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ coalesce ( Expression $expressions ) : Coalesce
+
+
+ Create a COALESCE expression. @param Expression ...$expressions Expressions to coalesce
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\coalesce(" + "$" + "{" + "1:expressions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "col",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ col ( string $entry ) : EntryReference
+
+
+ An alias for \`ref\`.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\col(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "col",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ col ( string $column , string $table = null , string $schema = null ) : Column
+
+
+ Create a column reference expression. Can be used in two modes: - Parse mode: col(\'users.id\') or col(\'schema.table.column\') - parses dot-separated string - Explicit mode: col(\'id\', \'users\') or col(\'id\', \'users\', \'schema\') - separate arguments When $table or $schema is provided, $column must be a plain column name (no dots). @param string $column Column name, or dot-separated path like \"table.column\" or \"schema.table.column\" @param null|string $table Table name (optional, triggers explicit mode) @param null|string $schema Schema name (optional, requires $table) @throws InvalidExpressionException when $schema is provided without $table, or when $column contains dots in explicit mode
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\col(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:table" + "}" + ", " + "$" + "{" + "3:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "collect",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ collect ( EntryReference|string $ref ) : Collect
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\collect(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "collect_unique",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ collect_unique ( EntryReference|string $ref ) : CollectUnique
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\collect_unique(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "column",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ column ( string $name , DataType $type ) : ColumnDefinition
+
+
+ Create a column definition for CREATE TABLE. @param string $name Column name @param DataType $type Column data type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\column(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "combine",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ combine ( ScalarFunction|array $keys , ScalarFunction|array $values ) : Combine
+
+
+ @param array
|ScalarFunction $keys @param array|ScalarFunction $values
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\combine(" + "$" + "{" + "1:keys" + "}" + ", " + "$" + "{" + "2:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "comment",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ comment ( CommentTarget $target , string $name ) : CommentFinalStep
+
+
+ Create a COMMENT ON builder. Example: comment(CommentTarget::TABLE, \'users\')->is(\'User accounts table\') Produces: COMMENT ON TABLE users IS \'User accounts table\' @param CommentTarget $target Target type (TABLE, COLUMN, INDEX, etc.) @param string $name Target name (use \'table.column\' for COLUMN targets)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\comment(" + "$" + "{" + "1:target" + "}" + ", " + "$" + "{" + "2:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "commit",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ commit ( ) : CommitOptionsStep
+
+
+ Create a COMMIT transaction builder. Example: commit()->andChain() Produces: COMMIT AND CHAIN
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\commit()"),
+ boost: 10
+ }, {
+ label: "commit_prepared",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ commit_prepared ( string $transactionId ) : PreparedTransactionFinalStep
+
+
+ Create a COMMIT PREPARED builder. Example: commit_prepared(\'my_transaction\') Produces: COMMIT PREPARED \'my_transaction\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\commit_prepared(" + "$" + "{" + "1:transactionId" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dcomparisons",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_all ( Comparison $comparisons ) : All
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_all(" + "$" + "{" + "1:comparisons" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_any",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dcomparisons",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_any ( Comparison $comparisons ) : Any
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_any(" + "$" + "{" + "1:comparisons" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_entries_by_name",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_entries_by_name ( Order $order = Flow\\ETL\\Transformer\\OrderEntries\\Order::... ) : Comparator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_entries_by_name(" + "$" + "{" + "1:order" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_entries_by_name_desc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_entries_by_name_desc ( ) : Comparator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_entries_by_name_desc()"),
+ boost: 10
+ }, {
+ label: "compare_entries_by_type",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_entries_by_type ( array $priorities = [...] , Order $order = Flow\\ETL\\Transformer\\OrderEntries\\Order::... ) : Comparator
+
+
+ @param array>, int> $priorities
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_entries_by_type(" + "$" + "{" + "1:priorities" + "}" + ", " + "$" + "{" + "2:order" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_entries_by_type_and_name",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_entries_by_type_and_name ( array $priorities = [...] , Order $order = Flow\\ETL\\Transformer\\OrderEntries\\Order::... ) : Comparator
+
+
+ @param array>, int> $priorities
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_entries_by_type_and_name(" + "$" + "{" + "1:priorities" + "}" + ", " + "$" + "{" + "2:order" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "compare_entries_by_type_desc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ compare_entries_by_type_desc ( array $priorities = [...] ) : Comparator
+
+
+ @param array>, int> $priorities
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\compare_entries_by_type_desc(" + "$" + "{" + "1:priorities" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "composer_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ composer_detector ( ) : ComposerDetector
+
+
+ Create a ComposerDetector. Detects service.name and service.version from Composer\'s InstalledVersions using the root package information.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\composer_detector()"),
+ boost: 10
+ }, {
+ label: "composite_propagator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ composite_propagator ( Propagator $propagators ) : CompositePropagator
+
+
+ Create a CompositePropagator. Combines multiple propagators into one. On extract, all propagators are invoked and their contexts are merged. On inject, all propagators are invoked. @param Propagator ...$propagators The propagators to combine
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\composite_propagator(" + "$" + "{" + "1:propagators" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "concat",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ concat ( ScalarFunction|string $functions ) : Concat
+
+
+ Concat all values. If you want to concatenate values with separator use concat_ws function.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\concat(" + "$" + "{" + "1:functions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "concat_ws",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ concat_ws ( ScalarFunction|string $separator , ScalarFunction|string $functions ) : ConcatWithSeparator
+
+
+ Concat all values with separator.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\concat_ws(" + "$" + "{" + "1:separator" + "}" + ", " + "$" + "{" + "2:functions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "conditions",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ conditions ( ) : ConditionBuilder
+
+
+ Create a condition builder for fluent condition composition. This builder allows incremental condition building with a fluent API: \`\`\`php $builder = conditions(); if ($hasFilter) { $builder = $builder->and(eq(col(\'status\'), literal(\'active\'))); } if (!$builder->isEmpty()) { $query = select()->from(table(\'users\'))->where($builder); } \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\conditions()"),
+ boost: 10
+ }, {
+ label: "cond_and",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cond_and ( Condition $conditions ) : AndCondition
+
+
+ Combine conditions with AND. @param Condition ...$conditions Conditions to combine
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_and(" + "$" + "{" + "1:conditions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cond_false",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cond_false ( ) : RawCondition
+
+
+ Create a FALSE condition for WHERE clauses. Useful when you need a condition that always evaluates to false, typically for testing or to return an empty result set. Example: select(literal(1))->where(cond_false()) // SELECT 1 WHERE false
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_false()"),
+ boost: 10
+ }, {
+ label: "cond_not",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cond_not ( Condition $condition ) : NotCondition
+
+
+ Negate a condition with NOT.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_not(" + "$" + "{" + "1:condition" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cond_or",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cond_or ( Condition $conditions ) : OrCondition
+
+
+ Combine conditions with OR. @param Condition ...$conditions Conditions to combine
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_or(" + "$" + "{" + "1:conditions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cond_true",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cond_true ( ) : RawCondition
+
+
+ Create a TRUE condition for WHERE clauses. Useful when you need a condition that always evaluates to true. Example: select(literal(1))->where(cond_true()) // SELECT 1 WHERE true
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_true()"),
+ boost: 10
+ }, {
+ label: "config",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ config ( ) : Config
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\config()"),
+ boost: 10
+ }, {
+ label: "config_builder",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ config_builder ( ) : ConfigBuilder
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\config_builder()"),
+ boost: 10
+ }, {
+ label: "conflict_columns",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ conflict_columns ( array $columns ) : ConflictTarget
+
+
+ Create a conflict target for ON CONFLICT (columns). @param list $columns Columns that define uniqueness
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\conflict_columns(" + "$" + "{" + "1:columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "conflict_constraint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ conflict_constraint ( string $name ) : ConflictTarget
+
+
+ Create a conflict target for ON CONFLICT ON CONSTRAINT.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\conflict_constraint(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "console_log_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ console_log_exporter ( bool $colors = true , int $maxBodyLength = 100 ) : ConsoleLogExporter
+
+
+ Create a ConsoleLogExporter. Outputs log records to the console with severity-based coloring. Useful for debugging and development. @param bool $colors Whether to use ANSI colors (default: true) @param null|int $maxBodyLength Maximum length for body+attributes column (null = no limit, default: 100)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\console_log_exporter(" + "$" + "{" + "1:colors" + "}" + ", " + "$" + "{" + "2:maxBodyLength" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "console_metric_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ console_metric_exporter ( bool $colors = true ) : ConsoleMetricExporter
+
+
+ Create a ConsoleMetricExporter. Outputs metrics to the console with ASCII table formatting. Useful for debugging and development. @param bool $colors Whether to use ANSI colors (default: true)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\console_metric_exporter(" + "$" + "{" + "1:colors" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "console_span_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ console_span_exporter ( bool $colors = true ) : ConsoleSpanExporter
+
+
+ Create a ConsoleSpanExporter. Outputs spans to the console with ASCII table formatting. Useful for debugging and development. @param bool $colors Whether to use ANSI colors (default: true)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\console_span_exporter(" + "$" + "{" + "1:colors" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "constraint_sorted_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ constraint_sorted_by ( Reference|string $column , Reference|string $columns ) : SortedByConstraint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\constraint_sorted_by(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "constraint_unique",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ constraint_unique ( string $reference , string $references ) : UniqueConstraint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\constraint_unique(" + "$" + "{" + "1:reference" + "}" + ", " + "$" + "{" + "2:references" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ context ( TraceId $traceId = null , Baggage $baggage = null ) : Context
+
+
+ Create a Context. If no TraceId is provided, generates a new one. If no Baggage is provided, creates an empty one. @param null|TraceId $traceId Optional TraceId to use @param null|Baggage $baggage Optional Baggage to use
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\context(" + "$" + "{" + "1:traceId" + "}" + ", " + "$" + "{" + "2:baggage" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "copy",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ copy ( ) : CopyFactory
+
+
+ Create a new COPY query builder for data import/export. Usage: copy()->from(\'users\')->file(\'/tmp/users.csv\')->format(CopyFormat::CSV) copy()->to(\'users\')->file(\'/tmp/users.csv\')->format(CopyFormat::CSV) copy()->toQuery(select(...))->file(\'/tmp/data.csv\')
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\copy()"),
+ boost: 10
+ }, {
+ label: "count",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ count ( EntryReference $function = null ) : Count
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\count(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "create",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ create ( ) : CreateFactory
+
+
+ Create a factory for building CREATE statements. Provides a unified entry point for all CREATE operations: - create()->table() - CREATE TABLE - create()->tableAs() - CREATE TABLE AS - create()->index() - CREATE INDEX - create()->view() - CREATE VIEW - create()->materializedView() - CREATE MATERIALIZED VIEW - create()->sequence() - CREATE SEQUENCE - create()->schema() - CREATE SCHEMA - create()->role() - CREATE ROLE - create()->function() - CREATE FUNCTION - create()->procedure() - CREATE PROCEDURE - create()->trigger() - CREATE TRIGGER - create()->rule() - CREATE RULE - create()->extension() - CREATE EXTENSION - create()->compositeType() - CREATE TYPE (composite) - create()->enumType() - CREATE TYPE (enum) - create()->rangeType() - CREATE TYPE (range) - create()->domain() - CREATE DOMAIN Example: create()->table(\'users\')->columns(col_def(\'id\', data_type_serial())) Example: create()->index(\'idx_email\')->on(\'users\')->columns(\'email\')
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\create()"),
+ boost: 10
+ }, {
+ label: "csv_detect_separator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ csv_detect_separator ( SourceStream $stream , int $lines = 5 , Option $fallback = Flow\\ETL\\Adapter\\CSV\\Detector\\Option::... , Options $options = null ) : Option
+
+
+ @param SourceStream $stream - valid resource to CSV file @param int<1, max> $lines - number of lines to read from CSV file, default 5, more lines means more accurate detection but slower detection @param null|Option $fallback - fallback option to use when no best option can be detected, default is Option(\',\', \'\"\', \'\\\\\') @param null|Options $options - options to use for detection, default is Options::all()
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\CSV\\csv_detect_separator(" + "$" + "{" + "1:stream" + "}" + ", " + "$" + "{" + "2:lines" + "}" + ", " + "$" + "{" + "3:fallback" + "}" + ", " + "$" + "{" + "4:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "cte",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cte ( string $name , SelectFinalStep $query , array $columnNames = [] , CTEMaterialization $materialization = Flow\\PostgreSql\\QueryBuilder\\Clause\\CTEMaterialization::... , bool $recursive = false ) : CTE
+
+
+ Create a CTE (Common Table Expression). @param string $name CTE name @param SelectFinalStep $query CTE query @param array $columnNames Column aliases (optional) @param CTEMaterialization $materialization Materialization hint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cte(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:columnNames" + "}" + ", " + "$" + "{" + "4:materialization" + "}" + ", " + "$" + "{" + "5:recursive" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "current_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ current_date ( ) : SQLValueFunctionExpression
+
+
+ SQL standard CURRENT_DATE function. Returns the current date (at the start of the transaction). Useful as a column default value or in SELECT queries. Example: column(\'birth_date\', data_type_date())->default(current_date()) Example: select()->select(current_date()->as(\'today\'))
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\current_date()"),
+ boost: 10
+ }, {
+ label: "current_time",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ current_time ( ) : SQLValueFunctionExpression
+
+
+ SQL standard CURRENT_TIME function. Returns the current time (at the start of the transaction). Useful as a column default value or in SELECT queries. Example: column(\'start_time\', data_type_time())->default(current_time()) Example: select()->select(current_time()->as(\'now_time\'))
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\current_time()"),
+ boost: 10
+ }, {
+ label: "current_timestamp",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ current_timestamp ( ) : SQLValueFunctionExpression
+
+
+ SQL standard CURRENT_TIMESTAMP function. Returns the current date and time (at the start of the transaction). Useful as a column default value or in SELECT queries. Example: column(\'created_at\', data_type_timestamp())->default(current_timestamp()) Example: select()->select(current_timestamp()->as(\'now\'))
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\current_timestamp()"),
+ boost: 10
+ }, {
+ label: "data_frame",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_frame ( Config|ConfigBuilder|null $config = null ) : Flow
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\data_frame(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_array ( DataType $elementType ) : DataType
+
+
+ Create an array data type from an element type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_array(" + "$" + "{" + "1:elementType" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_bigint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_bigint ( ) : DataType
+
+
+ Create a bigint data type (PostgreSQL int8).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_bigint()"),
+ boost: 10
+ }, {
+ label: "data_type_bigserial",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_bigserial ( ) : DataType
+
+
+ Create a bigserial data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_bigserial()"),
+ boost: 10
+ }, {
+ label: "data_type_boolean",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_boolean ( ) : DataType
+
+
+ Create a boolean data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_boolean()"),
+ boost: 10
+ }, {
+ label: "data_type_bytea",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_bytea ( ) : DataType
+
+
+ Create a bytea data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_bytea()"),
+ boost: 10
+ }, {
+ label: "data_type_char",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_char ( int $length ) : DataType
+
+
+ Create a char data type with length constraint.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_char(" + "$" + "{" + "1:length" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_cidr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_cidr ( ) : DataType
+
+
+ Create a cidr data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_cidr()"),
+ boost: 10
+ }, {
+ label: "data_type_custom",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_custom ( string $typeName , string $schema = null ) : DataType
+
+
+ Create a custom data type. @param string $typeName Type name @param null|string $schema Optional schema name
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_custom(" + "$" + "{" + "1:typeName" + "}" + ", " + "$" + "{" + "2:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_date ( ) : DataType
+
+
+ Create a date data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_date()"),
+ boost: 10
+ }, {
+ label: "data_type_decimal",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_decimal ( int $precision = null , int $scale = null ) : DataType
+
+
+ Create a decimal data type with optional precision and scale.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_decimal(" + "$" + "{" + "1:precision" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_double_precision",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_double_precision ( ) : DataType
+
+
+ Create a double precision data type (PostgreSQL float8).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_double_precision()"),
+ boost: 10
+ }, {
+ label: "data_type_inet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_inet ( ) : DataType
+
+
+ Create an inet data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_inet()"),
+ boost: 10
+ }, {
+ label: "data_type_integer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_integer ( ) : DataType
+
+
+ Create an integer data type (PostgreSQL int4).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_integer()"),
+ boost: 10
+ }, {
+ label: "data_type_interval",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_interval ( ) : DataType
+
+
+ Create an interval data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_interval()"),
+ boost: 10
+ }, {
+ label: "data_type_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_json ( ) : DataType
+
+
+ Create a JSON data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_json()"),
+ boost: 10
+ }, {
+ label: "data_type_jsonb",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_jsonb ( ) : DataType
+
+
+ Create a JSONB data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_jsonb()"),
+ boost: 10
+ }, {
+ label: "data_type_macaddr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_macaddr ( ) : DataType
+
+
+ Create a macaddr data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_macaddr()"),
+ boost: 10
+ }, {
+ label: "data_type_numeric",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_numeric ( int $precision = null , int $scale = null ) : DataType
+
+
+ Create a numeric data type with optional precision and scale.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_numeric(" + "$" + "{" + "1:precision" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_real",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_real ( ) : DataType
+
+
+ Create a real data type (PostgreSQL float4).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_real()"),
+ boost: 10
+ }, {
+ label: "data_type_serial",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_serial ( ) : DataType
+
+
+ Create a serial data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_serial()"),
+ boost: 10
+ }, {
+ label: "data_type_smallint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_smallint ( ) : DataType
+
+
+ Create a smallint data type (PostgreSQL int2).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_smallint()"),
+ boost: 10
+ }, {
+ label: "data_type_smallserial",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_smallserial ( ) : DataType
+
+
+ Create a smallserial data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_smallserial()"),
+ boost: 10
+ }, {
+ label: "data_type_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_text ( ) : DataType
+
+
+ Create a text data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_text()"),
+ boost: 10
+ }, {
+ label: "data_type_time",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_time ( int $precision = null ) : DataType
+
+
+ Create a time data type with optional precision.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_time(" + "$" + "{" + "1:precision" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_timestamp",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_timestamp ( int $precision = null ) : DataType
+
+
+ Create a timestamp data type with optional precision.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_timestamp(" + "$" + "{" + "1:precision" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_timestamptz",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_timestamptz ( int $precision = null ) : DataType
+
+
+ Create a timestamp with time zone data type with optional precision.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_timestamptz(" + "$" + "{" + "1:precision" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "data_type_uuid",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_uuid ( ) : DataType
+
+
+ Create a UUID data type.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_uuid()"),
+ boost: 10
+ }, {
+ label: "data_type_varchar",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ data_type_varchar ( int $length ) : DataType
+
+
+ Create a varchar data type with length constraint.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\data_type_varchar(" + "$" + "{" + "1:length" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "datetime_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ datetime_entry ( string $name , DateTimeInterface|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\DateTimeInterface>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\datetime_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "datetime_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ datetime_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : DateTimeDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\datetime_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_entry ( string $name , DateTimeInterface|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\DateTimeInterface>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_interval_to_microseconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_interval_to_microseconds ( DateInterval $interval ) : int
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_interval_to_microseconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_interval_to_milliseconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_interval_to_milliseconds ( DateInterval $interval ) : int
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_interval_to_milliseconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_interval_to_seconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_interval_to_seconds ( DateInterval $interval ) : int
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_interval_to_seconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : DateDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "date_time_format",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ date_time_format ( ScalarFunction $ref , string $format ) : DateTimeFormat
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\date_time_format(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:format" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dbal_dataframe_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dbal_dataframe_factory ( Connection|array $connection , string $query , QueryParameter $parameters ) : DbalDataFrameFactory
+
+
+ @param array|Connection $connection @param string $query @param QueryParameter ...$parameters
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\dbal_dataframe_factory(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:parameters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dbal_from_queries",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dbal_from_queries ( Connection $connection , string $query , ParametersSet $parameters_set = null , array $types = [] ) : DbalQueryExtractor
+
+
+ @deprecated use from_dbal_queries() instead @param null|ParametersSet $parameters_set - each one parameters array will be evaluated as new query @param array $types
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\dbal_from_queries(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:parameters_set" + "}" + ", " + "$" + "{" + "4:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dbal_from_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dbal_from_query ( Connection $connection , string $query , array $parameters = [] , array $types = [] ) : DbalQueryExtractor
+
+
+ @deprecated use from_dbal_query() instead @param array|list $parameters - @deprecated use DbalQueryExtractor::withParameters() instead @param array|string, DbalArrayType|DbalParameterType|DbalType|string> $types - @deprecated use DbalQueryExtractor::withTypes() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\dbal_from_query(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:parameters" + "}" + ", " + "$" + "{" + "4:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "declare_cursor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ declare_cursor ( string $cursorName , SelectFinalStep|SqlQuery|string $query ) : DeclareCursorOptionsStep
+
+
+ Declare a server-side cursor for a query. Cursors must be declared within a transaction and provide memory-efficient iteration over large result sets via FETCH commands. Example with query builder: declare_cursor(\'my_cursor\', select(star())->from(table(\'users\')))->noScroll() Produces: DECLARE my_cursor NO SCROLL CURSOR FOR SELECT * FROM users Example with raw SQL: declare_cursor(\'my_cursor\', \'SELECT * FROM users WHERE active = true\')->withHold() Produces: DECLARE my_cursor NO SCROLL CURSOR WITH HOLD FOR SELECT * FROM users WHERE active = true @param string $cursorName Unique cursor name @param SelectFinalStep|SqlQuery|string $query Query to iterate over
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\declare_cursor(" + "$" + "{" + "1:cursorName" + "}" + ", " + "$" + "{" + "2:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "definition_from_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ definition_from_array ( array $definition ) : Definition
+
+
+ Create a Definition from an array representation.
@param array
$definition @return Definition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\definition_from_array(" + "$" + "{" + "1:definition" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "definition_from_type",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ definition_from_type ( Reference|string $ref , Type $type , bool $nullable = false , Metadata $metadata = null ) : Definition
+
+
+ Create a Definition from a Type. @param Type $type @return Definition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\definition_from_type(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "delay_exponential",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ delay_exponential ( Duration $base , int $multiplier = 2 , Duration $max_delay = null ) : Exponential
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\delay_exponential(" + "$" + "{" + "1:base" + "}" + ", " + "$" + "{" + "2:multiplier" + "}" + ", " + "$" + "{" + "3:max_delay" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "delay_fixed",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ delay_fixed ( Duration $delay ) : Fixed
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\delay_fixed(" + "$" + "{" + "1:delay" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "delay_jitter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ delay_jitter ( DelayFactory $delay , float $jitter_factor ) : Jitter
+
+
+ @param float $jitter_factor a value between 0 and 1 representing the maximum percentage of jitter to apply
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\delay_jitter(" + "$" + "{" + "1:delay" + "}" + ", " + "$" + "{" + "2:jitter_factor" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "delay_linear",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ delay_linear ( Duration $delay , Duration $increment ) : Linear
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\delay_linear(" + "$" + "{" + "1:delay" + "}" + ", " + "$" + "{" + "2:increment" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "delete",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ delete ( ) : DeleteFromStep
+
+
+ Create a new DELETE query builder.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\delete()"),
+ boost: 10
+ }, {
+ label: "dense_rank",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dwindow\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dense_rank ( ) : DenseRank
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\dense_rank()"),
+ boost: 10
+ }, {
+ label: "dens_rank",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dwindow\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dens_rank ( ) : DenseRank
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\dens_rank()"),
+ boost: 10
+ }, {
+ label: "derived",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ derived ( SelectFinalStep $query , string $alias ) : DerivedTable
+
+
+ Create a derived table (subquery in FROM clause).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\derived(" + "$" + "{" + "1:query" + "}" + ", " + "$" + "{" + "2:alias" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "desc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ desc ( Expression $expr , NullsPosition $nulls = Flow\\PostgreSql\\QueryBuilder\\Clause\\NullsPosition::... ) : OrderBy
+
+
+ Create an ORDER BY item with DESC direction.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\desc(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:nulls" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "df",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ df ( Config|ConfigBuilder|null $config = null ) : Flow
+
+
+ Alias for data_frame() : Flow.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\df(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "discard",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ discard ( DiscardType $type ) : DiscardFinalStep
+
+
+ Create a DISCARD builder. Example: discard(DiscardType::ALL) Produces: DISCARD ALL @param DiscardType $type Type of resources to discard (ALL, PLANS, SEQUENCES, TEMP)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\discard(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dom_element_to_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dom_element_to_string ( DOMElement $element , bool $format_output = false , bool $preserver_white_space = false ) : string|false
+
+
+ @deprecated Please use \\Flow\\Types\\DSL\\dom_element_to_string() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\dom_element_to_string(" + "$" + "{" + "1:element" + "}" + ", " + "$" + "{" + "2:format_output" + "}" + ", " + "$" + "{" + "3:preserver_white_space" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dom_element_to_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dom_element_to_string ( DOMElement $element , bool $format_output = false , bool $preserver_white_space = false ) : string|false
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\dom_element_to_string(" + "$" + "{" + "1:element" + "}" + ", " + "$" + "{" + "2:format_output" + "}" + ", " + "$" + "{" + "3:preserver_white_space" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "do_block",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ do_block ( string $code ) : DoFinalStep
+
+
+ Creates a DO statement builder for executing an anonymous code block. Example: do_block(\'BEGIN RAISE NOTICE $$Hello World$$; END;\') Produces: DO $$ BEGIN RAISE NOTICE $$Hello World$$; END; $$ LANGUAGE plpgsql Example: do_block(\'SELECT 1\')->language(\'sql\') Produces: DO $$ SELECT 1 $$ LANGUAGE sql @param string $code The anonymous code block to execute @return DoFinalStep Builder for DO statement options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\do_block(" + "$" + "{" + "1:code" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "drop",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ drop ( Reference|string $entries ) : Drop
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\drop(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "drop",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ drop ( ) : DropFactory
+
+
+ Create a factory for building DROP statements. Provides a unified entry point for all DROP operations: - drop()->table() - DROP TABLE - drop()->index() - DROP INDEX - drop()->view() - DROP VIEW - drop()->materializedView() - DROP MATERIALIZED VIEW - drop()->sequence() - DROP SEQUENCE - drop()->schema() - DROP SCHEMA - drop()->role() - DROP ROLE - drop()->function() - DROP FUNCTION - drop()->procedure() - DROP PROCEDURE - drop()->trigger() - DROP TRIGGER - drop()->rule() - DROP RULE - drop()->extension() - DROP EXTENSION - drop()->type() - DROP TYPE - drop()->domain() - DROP DOMAIN - drop()->owned() - DROP OWNED Example: drop()->table(\'users\', \'orders\')->ifExists()->cascade() Example: drop()->index(\'idx_email\')->ifExists()
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\drop()"),
+ boost: 10
+ }, {
+ label: "drop_owned",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ drop_owned ( string $roles ) : DropOwnedFinalStep
+
+
+ Create a DROP OWNED builder. Example: drop_owned(\'role1\') Produces: DROP OWNED BY role1 Example: drop_owned(\'role1\', \'role2\')->cascade() Produces: DROP OWNED BY role1, role2 CASCADE @param string ...$roles The roles whose owned objects should be dropped @return DropOwnedFinalStep Builder for drop owned options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\drop_owned(" + "$" + "{" + "1:roles" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "duration_microseconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ duration_microseconds ( int $microseconds ) : Duration
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\duration_microseconds(" + "$" + "{" + "1:microseconds" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "duration_milliseconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ duration_milliseconds ( int $milliseconds ) : Duration
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\duration_milliseconds(" + "$" + "{" + "1:milliseconds" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "duration_minutes",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ duration_minutes ( int $minutes ) : Duration
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\duration_minutes(" + "$" + "{" + "1:minutes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "duration_seconds",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ duration_seconds ( int $seconds ) : Duration
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\duration_seconds(" + "$" + "{" + "1:seconds" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "empty_generator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ empty_generator ( ) : Generator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\empty_generator()"),
+ boost: 10
+ }, {
+ label: "entries",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ entries ( Entry $entries ) : Entries
+
+
+ @param Entry ...$entries
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\entries(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ entry ( string $entry ) : EntryReference
+
+
+ An alias for \`ref\`.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\entry(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "entry_id_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ entry_id_factory ( string $entry_name ) : IdFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\entry_id_factory(" + "$" + "{" + "1:entry_name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "enum_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ enum_entry ( string $name , UnitEnum $enum , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\UnitEnum>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\enum_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:enum" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "enum_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ enum_schema ( string $name , string $type , bool $nullable = false , Metadata $metadata = null ) : EnumDefinition
+
+
+ @template T of \\UnitEnum @param class-string $type @return EnumDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\enum_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "environment_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ environment_detector ( ) : EnvironmentDetector
+
+
+ Create an EnvironmentDetector. Detects resource attributes from OpenTelemetry standard environment variables: - OTEL_SERVICE_NAME: Sets service.name attribute - OTEL_RESOURCE_ATTRIBUTES: Sets additional attributes in key=value,key2=value2 format
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\environment_detector()"),
+ boost: 10
+ }, {
+ label: "eq",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ eq ( Expression $left , Expression $right ) : Comparison
+
+
+ Create an equality comparison (column = value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\eq(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "equal",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dcomparisons",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ equal ( Reference|string $left , Reference|string $right ) : Equal
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\equal(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "es_hits_to_rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ es_hits_to_rows ( DocumentDataSource $source = Flow\\ETL\\Adapter\\Elasticsearch\\ElasticsearchPHP\\DocumentDataSource::... ) : HitsIntoRowsTransformer
+
+
+ Transforms elasticsearch results into clear Flow Rows using [\'hits\'][\'hits\'][x][\'_source\']. @return HitsIntoRowsTransformer
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\es_hits_to_rows(" + "$" + "{" + "1:source" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "exception_if_exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ exception_if_exists ( ) : SaveMode
+
+
+ Alias for save_mode_exception_if_exists().
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\exception_if_exists()"),
+ boost: 10
+ }, {
+ label: "execution_context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ execution_context ( Config $config = null ) : FlowContext
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\execution_context(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "execution_lenient",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ execution_lenient ( ) : ExecutionMode
+
+
+ In this mode, functions returns nulls instead of throwing exceptions.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\execution_lenient()"),
+ boost: 10
+ }, {
+ label: "execution_strict",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ execution_strict ( ) : ExecutionMode
+
+
+ In this mode, functions throws exceptions if the given entry is not found or passed parameters are invalid.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\execution_strict()"),
+ boost: 10
+ }, {
+ label: "exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ exists ( ScalarFunction $ref ) : Exists
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\exists(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ exists ( SelectFinalStep $subquery ) : Exists
+
+
+ Create an EXISTS condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\exists(" + "$" + "{" + "1:subquery" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "explain",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ explain ( SelectFinalStep|InsertBuilder|UpdateBuilder|DeleteBuilder $query ) : ExplainFinalStep
+
+
+ Create an EXPLAIN builder for a query. Example: explain(select()->from(\'users\')) Produces: EXPLAIN SELECT * FROM users @param DeleteBuilder|InsertBuilder|SelectFinalStep|UpdateBuilder $query Query to explain
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\explain(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "fetch",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ fetch ( string $cursorName ) : FetchCursorBuilder
+
+
+ Fetch rows from a cursor. Example: fetch(\'my_cursor\')->forward(100) Produces: FETCH FORWARD 100 my_cursor Example: fetch(\'my_cursor\')->all() Produces: FETCH ALL my_cursor @param string $cursorName Cursor to fetch from
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\fetch(" + "$" + "{" + "1:cursorName" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "files",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ files ( Path|string $directory ) : FilesExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\files(" + "$" + "{" + "1:directory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filesystem_cache",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filesystem_cache ( Path|string|null $cache_dir = null , Filesystem $filesystem = Flow\\Filesystem\\Local\\NativeLocalFilesystem::... , Serializer $serializer = Flow\\Serializer\\NativePHPSerializer::... ) : FilesystemCache
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\filesystem_cache(" + "$" + "{" + "1:cache_dir" + "}" + ", " + "$" + "{" + "2:filesystem" + "}" + ", " + "$" + "{" + "3:serializer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filesystem_telemetry_config",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filesystem_telemetry_config ( Telemetry $telemetry , ClockInterface $clock , FilesystemTelemetryOptions $options = null ) : FilesystemTelemetryConfig
+
+
+ Create a telemetry configuration for the filesystem.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\filesystem_telemetry_config(" + "$" + "{" + "1:telemetry" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "filesystem_telemetry_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ filesystem_telemetry_options ( bool $traceStreams = true , bool $collectMetrics = true ) : FilesystemTelemetryOptions
+
+
+ Create options for filesystem telemetry. @param bool $traceStreams Create a single span per stream lifecycle (default: ON) @param bool $collectMetrics Collect metrics for bytes/operation counts (default: ON)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\filesystem_telemetry_options(" + "$" + "{" + "1:traceStreams" + "}" + ", " + "$" + "{" + "2:collectMetrics" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "first",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ first ( EntryReference|string $ref ) : First
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\first(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "float_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ float_entry ( string $name , string|int|float|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\float_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "float_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ float_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : FloatDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\float_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "flow_context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ flow_context ( Config $config = null ) : FlowContext
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\flow_context(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "foreign_key",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ foreign_key ( array $columns , string $referenceTable , array $referenceColumns = [] ) : ForeignKeyConstraint
+
+
+ Create a FOREIGN KEY constraint. @param list $columns Local columns @param string $referenceTable Referenced table @param list $referenceColumns Referenced columns (defaults to same as $columns if empty)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\foreign_key(" + "$" + "{" + "1:columns" + "}" + ", " + "$" + "{" + "2:referenceTable" + "}" + ", " + "$" + "{" + "3:referenceColumns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "for_share",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ for_share ( array $tables = [] ) : LockingClause
+
+
+ Create a FOR SHARE locking clause. @param list $tables Tables to lock (empty for all)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\for_share(" + "$" + "{" + "1:tables" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "for_update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ for_update ( array $tables = [] ) : LockingClause
+
+
+ Create a FOR UPDATE locking clause. @param list $tables Tables to lock (empty for all)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\for_update(" + "$" + "{" + "1:tables" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "frame_current_row",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ frame_current_row ( ) : FrameBound
+
+
+ Create a frame bound for CURRENT ROW.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\frame_current_row()"),
+ boost: 10
+ }, {
+ label: "frame_following",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ frame_following ( Expression $offset ) : FrameBound
+
+
+ Create a frame bound for N FOLLOWING.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\frame_following(" + "$" + "{" + "1:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "frame_preceding",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ frame_preceding ( Expression $offset ) : FrameBound
+
+
+ Create a frame bound for N PRECEDING.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\frame_preceding(" + "$" + "{" + "1:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "frame_unbounded_following",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ frame_unbounded_following ( ) : FrameBound
+
+
+ Create a frame bound for UNBOUNDED FOLLOWING.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\frame_unbounded_following()"),
+ boost: 10
+ }, {
+ label: "frame_unbounded_preceding",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ frame_unbounded_preceding ( ) : FrameBound
+
+
+ Create a frame bound for UNBOUNDED PRECEDING.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\frame_unbounded_preceding()"),
+ boost: 10
+ }, {
+ label: "from_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_all ( Extractor $extractors ) : ChainExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_all(" + "$" + "{" + "1:extractors" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_array ( iterable $array , Schema $schema = null ) : ArrayExtractor
+
+
+ @param iterable
> $array @param null|Schema $schema - @deprecated use withSchema() method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_array(" + "$" + "{" + "1:array" + "}" + ", " + "$" + "{" + "2:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_avro",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_avro ( Path|string $path ) : AvroExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\Adapter\\Avro\\from_avro(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_cache",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_cache ( string $id , Extractor $fallback_extractor = null , bool $clear = false ) : CacheExtractor
+
+
+ @param string $id - cache id from which data will be extracted @param null|Extractor $fallback_extractor - extractor that will be used when cache is empty - @deprecated use withFallbackExtractor() method instead @param bool $clear - clear cache after extraction - @deprecated use withClearOnFinish() method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_cache(" + "$" + "{" + "1:id" + "}" + ", " + "$" + "{" + "2:fallback_extractor" + "}" + ", " + "$" + "{" + "3:clear" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_csv",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_csv ( Path|string $path , bool $with_header = true , bool $empty_to_null = true , string $separator = null , string $enclosure = null , string $escape = null , int $characters_read_in_line = 1000 , Schema $schema = null ) : CSVExtractor
+
+
+ @param Path|string $path @param bool $empty_to_null - @deprecated use $loader->withEmptyToNull() instead @param bool $with_header - @deprecated use $loader->withHeader() instead @param null|string $separator - @deprecated use $loader->withSeparator() instead @param null|string $enclosure - @deprecated use $loader->withEnclosure() instead @param null|string $escape - @deprecated use $loader->withEscape() instead @param int<1, max> $characters_read_in_line - @deprecated use $loader->withCharactersReadInLine() instead @param null|Schema $schema - @deprecated use $loader->withSchema() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\CSV\\from_csv(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:with_header" + "}" + ", " + "$" + "{" + "3:empty_to_null" + "}" + ", " + "$" + "{" + "4:separator" + "}" + ", " + "$" + "{" + "5:enclosure" + "}" + ", " + "$" + "{" + "6:escape" + "}" + ", " + "$" + "{" + "7:characters_read_in_line" + "}" + ", " + "$" + "{" + "8:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_data_frame",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_data_frame ( DataFrame $data_frame ) : DataFrameExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_data_frame(" + "$" + "{" + "1:data_frame" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dbal_key_set_qb",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dbal_key_set_qb ( Connection $connection , QueryBuilder $queryBuilder , KeySet $key_set ) : DbalKeySetExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\from_dbal_key_set_qb(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:queryBuilder" + "}" + ", " + "$" + "{" + "3:key_set" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dbal_limit_offset",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dbal_limit_offset ( Connection $connection , Table|string $table , OrderBy|array $order_by , int $page_size = 1000 , int $maximum = null ) : DbalLimitOffsetExtractor
+
+
+ @param Connection $connection @param string|Table $table @param array|OrderBy $order_by @param int $page_size @param null|int $maximum @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\from_dbal_limit_offset(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:table" + "}" + ", " + "$" + "{" + "3:order_by" + "}" + ", " + "$" + "{" + "4:page_size" + "}" + ", " + "$" + "{" + "5:maximum" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dbal_limit_offset_qb",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dbal_limit_offset_qb ( Connection $connection , QueryBuilder $queryBuilder , int $page_size = 1000 , int $maximum = null , int $offset = 0 ) : DbalLimitOffsetExtractor
+
+
+ @param Connection $connection @param int $page_size @param null|int $maximum - maximum can also be taken from a query builder, $maximum however is used regardless of the query builder if it\'s set @param int $offset - offset can also be taken from a query builder, $offset however is used regardless of the query builder if it\'s set to non 0 value
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\from_dbal_limit_offset_qb(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:queryBuilder" + "}" + ", " + "$" + "{" + "3:page_size" + "}" + ", " + "$" + "{" + "4:maximum" + "}" + ", " + "$" + "{" + "5:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dbal_queries",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dbal_queries ( Connection $connection , string $query , ParametersSet $parameters_set = null , array $types = [] ) : DbalQueryExtractor
+
+
+ @param null|ParametersSet $parameters_set - each one parameters array will be evaluated as new query @param array $types
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\from_dbal_queries(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:parameters_set" + "}" + ", " + "$" + "{" + "4:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dbal_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dbal_query ( Connection $connection , string $query , array $parameters = [] , array $types = [] ) : DbalQueryExtractor
+
+
+ @param array|list $parameters - @deprecated use DbalQueryExtractor::withParameters() instead @param array|string, DbalArrayType|DbalParameterType|DbalType|string> $types - @deprecated use DbalQueryExtractor::withTypes() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\from_dbal_query(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:query" + "}" + ", " + "$" + "{" + "3:parameters" + "}" + ", " + "$" + "{" + "4:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_dynamic_http_requests",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_dynamic_http_requests ( ClientInterface $client , NextRequestFactory $requestFactory ) : PsrHttpClientDynamicExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Http\\from_dynamic_http_requests(" + "$" + "{" + "1:client" + "}" + ", " + "$" + "{" + "2:requestFactory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_es",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_es ( array $config , array $parameters , array $pit_params = null ) : ElasticsearchExtractor
+
+
+ Extractor will automatically try to iterate over whole index using one of the two iteration methods:. - from/size - search_after Search after is selected when you provide define sort parameters in query, otherwise it will fallback to from/size. @param array{ hosts?: array, connectionParams?: array, retries?: int, sniffOnStart?: bool, sslCert?: array, sslKey?: array, sslVerification?: bool|string, elasticMetaHeader?: bool, includePortInHostHeader?: bool } $config @param array $parameters - https://www.elastic.co/guide/en/elasticsearch/reference/master/search-search.html @param ?array $pit_params - when used extractor will create point in time to stabilize search results. Point in time is automatically closed when last element is extracted. https://www.elastic.co/guide/en/elasticsearch/reference/master/point-in-time-api.html - @deprecated use withPointInTime method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\from_es(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:parameters" + "}" + ", " + "$" + "{" + "3:pit_params" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_excel",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_excel ( Path|string $path ) : ExcelExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Excel\\DSL\\from_excel(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_google_sheet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_google_sheet ( Sheets|array $auth_config , string $spreadsheet_id , string $sheet_name , bool $with_header = true , int $rows_per_page = 1000 , array $options = [] ) : GoogleSheetExtractor
+
+
+ @param array{type: string, project_id: string, private_key_id: string, private_key: string, client_email: string, client_id: string, auth_uri: string, token_uri: string, auth_provider_x509_cert_url: string, client_x509_cert_url: string}|Sheets $auth_config @param string $spreadsheet_id @param string $sheet_name @param bool $with_header - @deprecated use withHeader method instead @param int $rows_per_page - how many rows per page to fetch from Google Sheets API - @deprecated use withRowsPerPage method instead @param array{dateTimeRenderOption?: string, majorDimension?: string, valueRenderOption?: string} $options - @deprecated use withOptions method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\GoogleSheet\\from_google_sheet(" + "$" + "{" + "1:auth_config" + "}" + ", " + "$" + "{" + "2:spreadsheet_id" + "}" + ", " + "$" + "{" + "3:sheet_name" + "}" + ", " + "$" + "{" + "4:with_header" + "}" + ", " + "$" + "{" + "5:rows_per_page" + "}" + ", " + "$" + "{" + "6:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_google_sheet_columns",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_google_sheet_columns ( Sheets|array $auth_config , string $spreadsheet_id , string $sheet_name , string $start_range_column , string $end_range_column , bool $with_header = true , int $rows_per_page = 1000 , array $options = [] ) : GoogleSheetExtractor
+
+
+ @param array{type: string, project_id: string, private_key_id: string, private_key: string, client_email: string, client_id: string, auth_uri: string, token_uri: string, auth_provider_x509_cert_url: string, client_x509_cert_url: string}|Sheets $auth_config @param string $spreadsheet_id @param string $sheet_name @param string $start_range_column @param string $end_range_column @param bool $with_header - @deprecated use withHeader method instead @param int $rows_per_page - how many rows per page to fetch from Google Sheets API, default 1000 - @deprecated use withRowsPerPage method instead @param array{dateTimeRenderOption?: string, majorDimension?: string, valueRenderOption?: string} $options - @deprecated use withOptions method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\GoogleSheet\\from_google_sheet_columns(" + "$" + "{" + "1:auth_config" + "}" + ", " + "$" + "{" + "2:spreadsheet_id" + "}" + ", " + "$" + "{" + "3:sheet_name" + "}" + ", " + "$" + "{" + "4:start_range_column" + "}" + ", " + "$" + "{" + "5:end_range_column" + "}" + ", " + "$" + "{" + "6:with_header" + "}" + ", " + "$" + "{" + "7:rows_per_page" + "}" + ", " + "$" + "{" + "8:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_json ( Path|string $path , string $pointer = null , Schema $schema = null ) : JsonExtractor
+
+
+ @param Path|string $path - string is internally turned into stream @param ?string $pointer - if you want to iterate only results of a subtree, use a pointer, read more at https://github.com/halaxa/json-machine#parsing-a-subtree - @deprecate use withPointer method instead @param null|Schema $schema - enforce schema on the extracted data - @deprecate use withSchema method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\JSON\\from_json(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:pointer" + "}" + ", " + "$" + "{" + "3:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_json_lines",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_json_lines ( Path|string $path ) : JsonLinesExtractor
+
+
+ Used to read from a JSON lines https://jsonlines.org/ formatted file. @param Path|string $path - string is internally turned into stream
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\JSON\\from_json_lines(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_meilisearch",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_meilisearch ( array $config , array $params , string $index ) : MeilisearchExtractor
+
+
+ @param array{url: string, apiKey: string} $config @param array{q: string, limit?: ?int, offset?: ?int, attributesToRetrieve?: ?array, sort?: ?array} $params
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Meilisearch\\from_meilisearch(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:params" + "}" + ", " + "$" + "{" + "3:index" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_memory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_memory ( Memory $memory ) : MemoryExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_memory(" + "$" + "{" + "1:memory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_parquet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_parquet ( Path|string $path , array $columns = [] , Options $options = Flow\\Parquet\\Options::... , ByteOrder $byte_order = Flow\\Parquet\\ByteOrder::... , int $offset = null ) : ParquetExtractor
+
+
+ @param Path|string $path @param array $columns - list of columns to read from parquet file - @deprecated use \`withColumns\` method instead @param Options $options - @deprecated use \`withOptions\` method instead @param ByteOrder $byte_order - @deprecated use \`withByteOrder\` method instead @param null|int $offset - @deprecated use \`withOffset\` method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\from_parquet(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ", " + "$" + "{" + "3:options" + "}" + ", " + "$" + "{" + "4:byte_order" + "}" + ", " + "$" + "{" + "5:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_path_partitions",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_path_partitions ( Path|string $path ) : PathPartitionsExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_path_partitions(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_pipeline",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_pipeline ( Pipeline $pipeline ) : PipelineExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_pipeline(" + "$" + "{" + "1:pipeline" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_rows ( Rows $rows ) : RowsExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_rows(" + "$" + "{" + "1:rows" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_sequence_date_period",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_sequence_date_period ( string $entry_name , DateTimeInterface $start , DateInterval $interval , DateTimeInterface $end , int $options = 0 ) : SequenceExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_sequence_date_period(" + "$" + "{" + "1:entry_name" + "}" + ", " + "$" + "{" + "2:start" + "}" + ", " + "$" + "{" + "3:interval" + "}" + ", " + "$" + "{" + "4:end" + "}" + ", " + "$" + "{" + "5:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_sequence_date_period_recurrences",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_sequence_date_period_recurrences ( string $entry_name , DateTimeInterface $start , DateInterval $interval , int $recurrences , int $options = 0 ) : SequenceExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_sequence_date_period_recurrences(" + "$" + "{" + "1:entry_name" + "}" + ", " + "$" + "{" + "2:start" + "}" + ", " + "$" + "{" + "3:interval" + "}" + ", " + "$" + "{" + "4:recurrences" + "}" + ", " + "$" + "{" + "5:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_sequence_number",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_sequence_number ( string $entry_name , string|int|float $start , string|int|float $end , int|float $step = 1 ) : SequenceExtractor
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\from_sequence_number(" + "$" + "{" + "1:entry_name" + "}" + ", " + "$" + "{" + "2:start" + "}" + ", " + "$" + "{" + "3:end" + "}" + ", " + "$" + "{" + "4:step" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_static_http_requests",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_static_http_requests ( ClientInterface $client , iterable $requests ) : PsrHttpClientStaticExtractor
+
+
+ @param iterable $requests
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Http\\from_static_http_requests(" + "$" + "{" + "1:client" + "}" + ", " + "$" + "{" + "2:requests" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_text ( Path|string $path ) : TextExtractor
+
+
+ @param Path|string $path
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Text\\from_text(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from_xml",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dextractors",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from_xml ( Path|string $path , string $xml_node_path = '' ) : XMLParserExtractor
+
+
+ In order to iterate only over nodes use \`from_xml($file)->withXMLNodePath(\'root/elements/element\')\`. XML Node Path does not support attributes and it\'s not xpath, it is just a sequence of node names separated with slash. @param Path|string $path @param string $xml_node_path - @deprecated use \`from_xml($file)->withXMLNodePath($xmlNodePath)\` method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\XML\\from_xml(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:xml_node_path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "fstab",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ fstab ( Filesystem $filesystems ) : FilesystemTable
+
+
+ Create a new filesystem table with given filesystems. Filesystems can be also mounted later. If no filesystems are provided, local filesystem is mounted.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\fstab(" + "$" + "{" + "1:filesystems" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "func",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ func ( string $name , array $args = [] ) : FunctionCall
+
+
+ Create a function call expression. @param string $name Function name (can include schema like \"pg_catalog.now\") @param list $args Function arguments
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\func(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:args" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "func_arg",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ func_arg ( DataType $type ) : FunctionArgument
+
+
+ Creates a new function argument for use in function/procedure definitions. Example: func_arg(data_type_integer()) Example: func_arg(data_type_text())->named(\'username\') Example: func_arg(data_type_integer())->named(\'count\')->default(\'0\') Example: func_arg(data_type_text())->out() @param DataType $type The PostgreSQL data type for the argument @return FunctionArgument Builder for function argument options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\func_arg(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "generate_random_int",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ generate_random_int ( int $start = -9223372036854775808 , int $end = 9223372036854775807 , NativePHPRandomValueGenerator $generator = Flow\\ETL\\NativePHPRandomValueGenerator::... ) : int
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\generate_random_int(" + "$" + "{" + "1:start" + "}" + ", " + "$" + "{" + "2:end" + "}" + ", " + "$" + "{" + "3:generator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "generate_random_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ generate_random_string ( int $length = 32 , NativePHPRandomValueGenerator $generator = Flow\\ETL\\NativePHPRandomValueGenerator::... ) : string
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\generate_random_string(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:generator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "get_type",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ get_type ( mixed $value ) : Type
+
+
+ @return Type @deprecated Please use \\Flow\\Types\\DSL\\get_type($value) instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\get_type(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "get_type",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ get_type ( mixed $value ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\get_type(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "grant",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ grant ( TablePrivilege|string $privileges ) : GrantOnStep
+
+
+ Create a GRANT privileges builder. Example: grant(TablePrivilege::SELECT)->onTable(\'users\')->to(\'app_user\') Produces: GRANT SELECT ON users TO app_user Example: grant(TablePrivilege::ALL)->onAllTablesInSchema(\'public\')->to(\'admin\') Produces: GRANT ALL ON ALL TABLES IN SCHEMA public TO admin @param string|TablePrivilege ...$privileges The privileges to grant @return GrantOnStep Builder for grant options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\grant(" + "$" + "{" + "1:privileges" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "grant_role",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ grant_role ( string $roles ) : GrantRoleToStep
+
+
+ Create a GRANT role builder. Example: grant_role(\'admin\')->to(\'user1\') Produces: GRANT admin TO user1 Example: grant_role(\'admin\', \'developer\')->to(\'user1\')->withAdminOption() Produces: GRANT admin, developer TO user1 WITH ADMIN OPTION @param string ...$roles The roles to grant @return GrantRoleToStep Builder for grant role options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\grant_role(" + "$" + "{" + "1:roles" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "greatest",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ greatest ( mixed $values ) : Greatest
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\greatest(" + "$" + "{" + "1:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "greatest",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ greatest ( Expression $expressions ) : Greatest
+
+
+ Create a GREATEST expression. @param Expression ...$expressions Expressions to compare
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\greatest(" + "$" + "{" + "1:expressions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "gt",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ gt ( Expression $left , Expression $right ) : Comparison
+
+
+ Create a greater-than comparison (column > value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\gt(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "gte",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ gte ( Expression $left , Expression $right ) : Comparison
+
+
+ Create a greater-than-or-equal comparison (column >= value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\gte(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "hash",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ hash ( mixed $value , Algorithm $algorithm = Flow\\ETL\\Hash\\NativePHPHash::... ) : Hash
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\hash(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:algorithm" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "hash_id_factory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ hash_id_factory ( string $entry_names ) : IdFactory
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\hash_id_factory(" + "$" + "{" + "1:entry_names" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "host_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ host_detector ( ) : HostDetector
+
+
+ Create a HostDetector. Detects host information including host.name, host.arch, and host.id (from /etc/machine-id on Linux or IOPlatformUUID on macOS).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\host_detector()"),
+ boost: 10
+ }, {
+ label: "html_element_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ html_element_entry ( string $name , Dom\\HTMLElement|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\html_element_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "html_element_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ html_element_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : HTMLElementDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\html_element_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "html_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ html_entry ( string $name , Dom\\HTMLDocument|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\html_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "html_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ html_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : HTMLDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\html_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "identical",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dcomparisons",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ identical ( Reference|string $left , Reference|string $right ) : Identical
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\identical(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "ignore",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ignore ( ) : SaveMode
+
+
+ Alias for save_mode_ignore().
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\ignore()"),
+ boost: 10
+ }, {
+ label: "ignore_error_handler",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ignore_error_handler ( ) : IgnoreError
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\ignore_error_handler()"),
+ boost: 10
+ }, {
+ label: "index_col",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_col ( string $name ) : IndexColumn
+
+
+ Create an index column specification. Use chainable methods: ->asc(), ->desc(), ->nullsFirst(), ->nullsLast(), ->opclass(), ->collate() Example: index_col(\'email\')->desc()->nullsLast() @param string $name The column name
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_col(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "index_expr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_expr ( Expression $expression ) : IndexColumn
+
+
+ Create an index column specification from an expression. Use chainable methods: ->asc(), ->desc(), ->nullsFirst(), ->nullsLast(), ->opclass(), ->collate() Example: index_expr(fn_call(\'lower\', col(\'email\')))->desc() @param Expression $expression The expression to index
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_expr(" + "$" + "{" + "1:expression" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "index_method_brin",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_brin ( ) : IndexMethod
+
+
+ Get the BRIN index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_brin()"),
+ boost: 10
+ }, {
+ label: "index_method_btree",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_btree ( ) : IndexMethod
+
+
+ Get the BTREE index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_btree()"),
+ boost: 10
+ }, {
+ label: "index_method_gin",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_gin ( ) : IndexMethod
+
+
+ Get the GIN index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_gin()"),
+ boost: 10
+ }, {
+ label: "index_method_gist",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_gist ( ) : IndexMethod
+
+
+ Get the GIST index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_gist()"),
+ boost: 10
+ }, {
+ label: "index_method_hash",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_hash ( ) : IndexMethod
+
+
+ Get the HASH index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_hash()"),
+ boost: 10
+ }, {
+ label: "index_method_spgist",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ index_method_spgist ( ) : IndexMethod
+
+
+ Get the SPGIST index method.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_spgist()"),
+ boost: 10
+ }, {
+ label: "insert",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ insert ( ) : InsertIntoStep
+
+
+ Create a new INSERT query builder.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\insert()"),
+ boost: 10
+ }, {
+ label: "instrumentation_scope",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ instrumentation_scope ( string $name , string $version = 'unknown' , string $schemaUrl = null , Attributes $attributes = Flow\\Telemetry\\Attributes::... ) : InstrumentationScope
+
+
+ Create an InstrumentationScope. @param string $name The instrumentation scope name @param string $version The instrumentation scope version @param null|string $schemaUrl Optional schema URL
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\instrumentation_scope(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:version" + "}" + ", " + "$" + "{" + "3:schemaUrl" + "}" + ", " + "$" + "{" + "4:attributes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "integer_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ integer_entry ( string $name , int $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\integer_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "integer_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ integer_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : IntegerDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\integer_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "int_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ int_entry ( string $name , int $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\int_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "int_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ int_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : IntegerDefinition
+
+
+ Alias for \`integer_schema\`.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\int_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "is_distinct_from",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ is_distinct_from ( Expression $left , Expression $right , bool $not = false ) : IsDistinctFrom
+
+
+ Create an IS DISTINCT FROM condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_distinct_from(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ", " + "$" + "{" + "3:not" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "is_in",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ is_in ( Expression $expr , array $values ) : In
+
+
+ Create an IN condition. @param Expression $expr Expression to check @param list $values List of values
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_in(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "is_null",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ is_null ( Expression $expr , bool $not = false ) : IsNull
+
+
+ Create an IS NULL condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_null(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:not" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "is_type",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ is_type ( Type|array $type , mixed $value ) : bool
+
+
+ @param array>|Type $type @param mixed $value
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\is_type(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "is_valid_excel_sheet_name",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ is_valid_excel_sheet_name ( ScalarFunction|string $sheet_name ) : IsValidExcelSheetName
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Excel\\DSL\\is_valid_excel_sheet_name(" + "$" + "{" + "1:sheet_name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "join_on",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ join_on ( Comparison|array $comparisons , string $join_prefix = '' ) : Expression
+
+
+ @param array<\\Flow\\ETL\\Join\\Comparison|string>|Comparison $comparisons
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\join_on(" + "$" + "{" + "1:comparisons" + "}" + ", " + "$" + "{" + "2:join_prefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_contained_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_contained_by ( Expression $left , Expression $right ) : OperatorCondition
+
+
+ Create a JSONB is contained by condition (<@). Example: json_contained_by(col(\'metadata\'), literal_json(\'{\"category\": \"electronics\", \"price\": 100}\')) Produces: metadata <@ \'{\"category\": \"electronics\", \"price\": 100}\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_contained_by(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_contains",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_contains ( Expression $left , Expression $right ) : OperatorCondition
+
+
+ Create a JSONB contains condition (@>). Example: json_contains(col(\'metadata\'), literal_json(\'{\"category\": \"electronics\"}\')) Produces: metadata @> \'{\"category\": \"electronics\"}\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_contains(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_entry ( string $name , Json|array|string|null $data , Metadata $metadata = null ) : Entry
+
+
+ @param null|array
|Json|string $data @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\json_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_exists ( Expression $expr , Expression $key ) : OperatorCondition
+
+
+ Create a JSONB key exists condition (?). Example: json_exists(col(\'metadata\'), literal_string(\'category\')) Produces: metadata ? \'category\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_exists_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_exists_all ( Expression $expr , Expression $keys ) : OperatorCondition
+
+
+ Create a JSONB all keys exist condition (?&). Example: json_exists_all(col(\'metadata\'), raw_expr(\"array[\'category\', \'name\']\")) Produces: metadata ?& array[\'category\', \'name\']
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists_all(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_exists_any",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_exists_any ( Expression $expr , Expression $keys ) : OperatorCondition
+
+
+ Create a JSONB any key exists condition (?|). Example: json_exists_any(col(\'metadata\'), raw_expr(\"array[\'category\', \'name\']\")) Produces: metadata ?| array[\'category\', \'name\']
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists_any(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_get",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_get ( Expression $expr , Expression $key ) : BinaryExpression
+
+
+ Create a JSON field access expression (->). Returns JSON. Example: json_get(col(\'metadata\'), literal_string(\'category\')) Produces: metadata -> \'category\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_get(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_get_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_get_text ( Expression $expr , Expression $key ) : BinaryExpression
+
+
+ Create a JSON field access expression (->>). Returns text. Example: json_get_text(col(\'metadata\'), literal_string(\'name\')) Produces: metadata ->> \'name\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_get_text(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_object_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_object_entry ( string $name , Json|array|string|null $data , Metadata $metadata = null ) : Entry
+
+
+ @param null|array
|Json|string $data @throws InvalidArgumentException @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\json_object_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_path",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_path ( Expression $expr , Expression $path ) : BinaryExpression
+
+
+ Create a JSON path access expression (#>). Returns JSON. Example: json_path(col(\'metadata\'), literal_string(\'{category,name}\')) Produces: metadata #> \'{category,name}\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_path(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_path_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_path_text ( Expression $expr , Expression $path ) : BinaryExpression
+
+
+ Create a JSON path access expression (#>>). Returns text. Example: json_path_text(col(\'metadata\'), literal_string(\'{category,name}\')) Produces: metadata #>> \'{category,name}\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_path_text(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "json_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : JsonDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\json_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "last",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ last ( EntryReference|string $ref ) : Last
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\last(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lateral",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lateral ( TableReference $reference ) : Lateral
+
+
+ Create a LATERAL subquery. @param TableReference $reference The subquery or table function reference
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\lateral(" + "$" + "{" + "1:reference" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "least",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ least ( mixed $values ) : Least
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\least(" + "$" + "{" + "1:values" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "least",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ least ( Expression $expressions ) : Least
+
+
+ Create a LEAST expression. @param Expression ...$expressions Expressions to compare
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\least(" + "$" + "{" + "1:expressions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "like",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ like ( Expression $expr , Expression $pattern , bool $caseInsensitive = false ) : Like
+
+
+ Create a LIKE condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\like(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ", " + "$" + "{" + "3:caseInsensitive" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "limit",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ limit ( int $limit ) : Limit
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\limit(" + "$" + "{" + "1:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "line_chart",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ line_chart ( EntryReference $label , References $datasets ) : LineChart
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\line_chart(" + "$" + "{" + "1:label" + "}" + ", " + "$" + "{" + "2:datasets" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "list_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ list_entry ( string $name , array $value , ListType $type , Metadata $metadata = null ) : Entry
+
+
+ @template T @param null|list $value @param ListType $type @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\list_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:type" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "list_ref",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ list_ref ( string $entry ) : ListFunctions
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\list_ref(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "list_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ list_schema ( string $name , ListType|Type $type , bool $nullable = false , Metadata $metadata = null ) : ListDefinition
+
+
+ @template T @param ListType|Type> $type @return ListDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\list_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lit",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lit ( mixed $value ) : Literal
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\lit(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "literal",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ literal ( string|int|float|bool|null $value ) : Literal
+
+
+ Create a literal value for use in queries. Automatically detects the type and creates the appropriate literal: - literal(\'hello\') creates a string literal - literal(42) creates an integer literal - literal(3.14) creates a float literal - literal(true) creates a boolean literal - literal(null) creates a NULL literal
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\literal(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lock_for",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lock_for ( LockStrength $strength , array $tables = [] , LockWaitPolicy $waitPolicy = Flow\\PostgreSql\\QueryBuilder\\Clause\\LockWaitPolicy::... ) : LockingClause
+
+
+ Create a locking clause (FOR UPDATE, FOR SHARE, etc.). @param LockStrength $strength Lock strength @param list $tables Tables to lock (empty for all) @param LockWaitPolicy $waitPolicy Wait policy
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\lock_for(" + "$" + "{" + "1:strength" + "}" + ", " + "$" + "{" + "2:tables" + "}" + ", " + "$" + "{" + "3:waitPolicy" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lock_table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lock_table ( string $tables ) : LockFinalStep
+
+
+ Create a LOCK TABLE builder. Example: lock_table(\'users\', \'orders\')->accessExclusive() Produces: LOCK TABLE users, orders IN ACCESS EXCLUSIVE MODE
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\lock_table(" + "$" + "{" + "1:tables" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "logger_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ logger_provider ( LogProcessor $processor , ClockInterface $clock , ContextStorage $contextStorage , LogRecordLimits $limits = Flow\\Telemetry\\Logger\\LogRecordLimits::... ) : LoggerProvider
+
+
+ Create a LoggerProvider. Creates a provider that uses a LogProcessor for processing logs. For void/disabled logging, pass void_processor(). For memory-based testing, pass memory_processor() with exporters. @param LogProcessor $processor The processor for logs @param ClockInterface $clock The clock for timestamps @param ContextStorage $contextStorage Storage for span correlation @param LogRecordLimits $limits Limits for log record attributes
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\logger_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:contextStorage" + "}" + ", " + "$" + "{" + "4:limits" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "log_record_converter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ log_record_converter ( SeverityMapper $severityMapper = null , ValueNormalizer $valueNormalizer = null ) : LogRecordConverter
+
+
+ Create a LogRecordConverter for converting Monolog LogRecord to Telemetry LogRecord. The converter handles: - Severity mapping from Monolog Level to Telemetry Severity - Message body conversion - Channel and level name as monolog.* attributes - Context values as context.* attributes (Throwables use setException()) - Extra values as extra.* attributes @param null|SeverityMapper $severityMapper Custom severity mapper (defaults to standard mapping) @param null|ValueNormalizer $valueNormalizer Custom value normalizer (defaults to standard normalizer) Example usage: \`\`\`php $converter = log_record_converter(); $telemetryRecord = $converter->convert($monologRecord); \`\`\` Example with custom mapper: \`\`\`php $converter = log_record_converter( severityMapper: severity_mapper([ Level::Debug->value => Severity::TRACE, ]) ); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Monolog\\Telemetry\\DSL\\log_record_converter(" + "$" + "{" + "1:severityMapper" + "}" + ", " + "$" + "{" + "2:valueNormalizer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "log_record_limits",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ log_record_limits ( int $attributeCountLimit = 128 , int $attributeValueLengthLimit = null ) : LogRecordLimits
+
+
+ Create LogRecordLimits configuration. LogRecordLimits controls the maximum amount of data a log record can collect, preventing unbounded memory growth and ensuring reasonable log record sizes. @param int $attributeCountLimit Maximum number of attributes per log record @param null|int $attributeValueLengthLimit Maximum length for string attribute values (null = unlimited)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\log_record_limits(" + "$" + "{" + "1:attributeCountLimit" + "}" + ", " + "$" + "{" + "2:attributeValueLengthLimit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lower",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lower ( ScalarFunction|string $value ) : ToLower
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\lower(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lt",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lt ( Expression $left , Expression $right ) : Comparison
+
+
+ Create a less-than comparison (column < value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\lt(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lte",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lte ( Expression $left , Expression $right ) : Comparison
+
+
+ Create a less-than-or-equal comparison (column <= value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\lte(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "manual_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ manual_detector ( array $attributes ) : ManualDetector
+
+
+ Create a ManualDetector. Returns manually specified resource attributes. Use this when you need to set attributes explicitly rather than detecting them automatically. @param array|bool|float|int|string> $attributes Resource attributes
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\manual_detector(" + "$" + "{" + "1:attributes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "map_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ map_entry ( string $name , array $value , MapType $mapType , Metadata $metadata = null ) : Entry
+
+
+ @template TKey of array-key
@template TValue
@param ?array
$value @param MapType $mapType @return Entry>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\map_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:mapType" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "map_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ map_schema ( string $name , MapType|Type $type , bool $nullable = false , Metadata $metadata = null ) : MapDefinition
+
+
+ @template TKey of array-key
@template TValue
@param MapType
|Type> $type @return MapDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\map_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "mask_columns",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ mask_columns ( array $columns = [] , string $mask = '******' ) : MaskColumns
+
+
+ @param array $columns
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\mask_columns(" + "$" + "{" + "1:columns" + "}" + ", " + "$" + "{" + "2:mask" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "match_cases",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ match_cases ( array $cases , mixed $default = null ) : MatchCases
+
+
+ @param array $cases
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\match_cases(" + "$" + "{" + "1:cases" + "}" + ", " + "$" + "{" + "2:default" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "match_condition",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ match_condition ( mixed $condition , mixed $then ) : MatchCondition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\match_condition(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:then" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "max",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ max ( EntryReference|string $ref ) : Max
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\max(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "meilisearch_hits_to_rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ meilisearch_hits_to_rows ( ) : HitsIntoRowsTransformer
+
+
+ Transforms Meilisearch results into clear Flow Rows.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Meilisearch\\meilisearch_hits_to_rows()"),
+ boost: 10
+ }, {
+ label: "memory_context_storage",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_context_storage ( Context $context = null ) : MemoryContextStorage
+
+
+ Create a MemoryContextStorage. In-memory context storage for storing and retrieving the current context. A single instance should be shared across all providers within a request lifecycle. @param null|Context $context Optional initial context
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_context_storage(" + "$" + "{" + "1:context" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "memory_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_filesystem ( ) : MemoryFilesystem
+
+
+ Create a new memory filesystem and writes data to it in memory.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\memory_filesystem()"),
+ boost: 10
+ }, {
+ label: "memory_log_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_log_exporter ( ) : MemoryLogExporter
+
+
+ Create a MemoryLogExporter. Log exporter that stores data in memory. Provides direct getter access to exported log entries. Useful for testing and inspection without serialization.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_log_exporter()"),
+ boost: 10
+ }, {
+ label: "memory_log_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_log_processor ( LogExporter $exporter ) : MemoryLogProcessor
+
+
+ Create a MemoryLogProcessor. Log processor that stores log records in memory and exports via configured exporter. Useful for testing. @param LogExporter $exporter The exporter to send logs to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_log_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "memory_metric_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_metric_exporter ( ) : MemoryMetricExporter
+
+
+ Create a MemoryMetricExporter. Metric exporter that stores data in memory. Provides direct getter access to exported metrics. Useful for testing and inspection without serialization.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_metric_exporter()"),
+ boost: 10
+ }, {
+ label: "memory_metric_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_metric_processor ( MetricExporter $exporter ) : MemoryMetricProcessor
+
+
+ Create a MemoryMetricProcessor. Metric processor that stores metrics in memory and exports via configured exporter. Useful for testing. @param MetricExporter $exporter The exporter to send metrics to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_metric_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "memory_span_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_span_exporter ( ) : MemorySpanExporter
+
+
+ Create a MemorySpanExporter. Span exporter that stores data in memory. Provides direct getter access to exported spans. Useful for testing and inspection without serialization.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_span_exporter()"),
+ boost: 10
+ }, {
+ label: "memory_span_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ memory_span_processor ( SpanExporter $exporter ) : MemorySpanProcessor
+
+
+ Create a MemorySpanProcessor. Span processor that stores spans in memory and exports via configured exporter. Useful for testing. @param SpanExporter $exporter The exporter to send spans to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\memory_span_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "merge",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ merge ( string $table , string $alias = null ) : MergeUsingStep
+
+
+ Create a new MERGE query builder. @param string $table Target table name @param null|string $alias Optional table alias
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\merge(" + "$" + "{" + "1:table" + "}" + ", " + "$" + "{" + "2:alias" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "meter_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ meter_provider ( MetricProcessor $processor , ClockInterface $clock , AggregationTemporality $temporality = Flow\\Telemetry\\Meter\\AggregationTemporality::... , ExemplarFilter $exemplarFilter = Flow\\Telemetry\\Meter\\Exemplar\\TraceBasedExemplarFilter::... , MetricLimits $limits = Flow\\Telemetry\\Meter\\MetricLimits::... ) : MeterProvider
+
+
+ Create a MeterProvider. Creates a provider that uses a MetricProcessor for processing metrics. For void/disabled metrics, pass void_processor(). For memory-based testing, pass memory_processor() with exporters. @param MetricProcessor $processor The processor for metrics @param ClockInterface $clock The clock for timestamps @param AggregationTemporality $temporality Aggregation temporality for metrics @param ExemplarFilter $exemplarFilter Filter for exemplar sampling (default: TraceBasedExemplarFilter) @param MetricLimits $limits Cardinality limits for metric instruments
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\meter_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:temporality" + "}" + ", " + "$" + "{" + "4:exemplarFilter" + "}" + ", " + "$" + "{" + "5:limits" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "metric_limits",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ metric_limits ( int $cardinalityLimit = 2000 ) : MetricLimits
+
+
+ Create MetricLimits configuration. MetricLimits controls the maximum cardinality (unique attribute combinations) per metric instrument, preventing memory exhaustion from high-cardinality attributes. When the cardinality limit is exceeded, new attribute combinations are aggregated into an overflow data point with \`otel.metric.overflow: true\` attribute. Note: Unlike spans and logs, metrics are EXEMPT from attribute count and value length limits per the OpenTelemetry specification. Only cardinality is limited. @param int $cardinalityLimit Maximum number of unique attribute combinations per instrument
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\metric_limits(" + "$" + "{" + "1:cardinalityLimit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "min",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ min ( EntryReference|string $ref ) : Min
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\min(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "mysql_insert_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ mysql_insert_options ( bool $skip_conflicts = null , bool $upsert = null , array $update_columns = [] ) : MySQLInsertOptions
+
+
+ @param array $update_columns
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\mysql_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:upsert" + "}" + ", " + "$" + "{" + "3:update_columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "native_local_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ native_local_filesystem ( ) : NativeLocalFilesystem
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\native_local_filesystem()"),
+ boost: 10
+ }, {
+ label: "neq",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ neq ( Expression $left , Expression $right ) : Comparison
+
+
+ Create a not-equal comparison (column != value).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\neq(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "not",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ not ( ScalarFunction $value ) : Not
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\not(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "not_regex_imatch",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ not_regex_imatch ( Expression $expr , Expression $pattern ) : OperatorCondition
+
+
+ Create a POSIX regex not match condition (!~*). Case-insensitive. Example: not_regex_imatch(col(\'email\'), literal_string(\'.*@spam\\\\.com\')) Produces: email !~* \'.*@spam\\.com\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\not_regex_imatch(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "not_regex_match",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ not_regex_match ( Expression $expr , Expression $pattern ) : OperatorCondition
+
+
+ Create a POSIX regex not match condition (!~). Case-sensitive. Example: not_regex_match(col(\'email\'), literal_string(\'.*@spam\\\\.com\')) Produces: email !~ \'.*@spam\\.com\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\not_regex_match(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "now",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ now ( DateTimeZone|ScalarFunction $time_zone = DateTimeZone::... ) : Now
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\now(" + "$" + "{" + "1:time_zone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "nullif",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ nullif ( Expression $expr1 , Expression $expr2 ) : NullIf
+
+
+ Create a NULLIF expression.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\nullif(" + "$" + "{" + "1:expr1" + "}" + ", " + "$" + "{" + "2:expr2" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "null_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ null_entry ( string $name , Metadata $metadata = null ) : Entry
+
+
+ This functions is an alias for creating string entry from null. The main difference between using this function an simply str_entry with second argument null is that this function will also keep a note in the metadata that type might not be final. For example when we need to guess column type from rows because schema was not provided, and given column in the first row is null, it might still change once we get to the second row. That metadata is used to determine if string_entry was created from null or not. By design flow assumes when guessing column type that null would be a string (the most flexible type). @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\null_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "null_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ null_schema ( string $name , Metadata $metadata = null ) : StringDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\null_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "number_format",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ number_format ( ScalarFunction|int|float $value , ScalarFunction|int $decimals = 2 , ScalarFunction|string $decimal_separator = '.' , ScalarFunction|string $thousands_separator = ',' ) : NumberFormat
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\number_format(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:decimals" + "}" + ", " + "$" + "{" + "3:decimal_separator" + "}" + ", " + "$" + "{" + "4:thousands_separator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "on_conflict_nothing",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ on_conflict_nothing ( ConflictTarget $target = null ) : OnConflictClause
+
+
+ Create an ON CONFLICT DO NOTHING clause.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\on_conflict_nothing(" + "$" + "{" + "1:target" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "on_conflict_update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ on_conflict_update ( ConflictTarget $target , array $updates ) : OnConflictClause
+
+
+ Create an ON CONFLICT DO UPDATE clause. @param ConflictTarget $target Conflict target (columns or constraint) @param array $updates Column updates
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\on_conflict_update(" + "$" + "{" + "1:target" + "}" + ", " + "$" + "{" + "2:updates" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "optional",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ optional ( ScalarFunction $function ) : Optional
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\optional(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "order_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ order_by ( Expression $expr , SortDirection $direction = Flow\\PostgreSql\\QueryBuilder\\Clause\\SortDirection::... , NullsPosition $nulls = Flow\\PostgreSql\\QueryBuilder\\Clause\\NullsPosition::... ) : OrderBy
+
+
+ Create an ORDER BY item.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\order_by(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:direction" + "}" + ", " + "$" + "{" + "3:nulls" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "os_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ os_detector ( ) : OsDetector
+
+
+ Create an OsDetector. Detects operating system information including os.type, os.name, os.version, and os.description using PHP\'s php_uname() function.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\os_detector()"),
+ boost: 10
+ }, {
+ label: "otlp_curl_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_curl_options ( ) : CurlTransportOptions
+
+
+ Create curl transport options for OTLP. Returns a CurlTransportOptions builder for configuring curl transport settings using a fluent interface. Example usage: \`\`\`php $options = otlp_curl_options() ->withTimeout(60) ->withConnectTimeout(15) ->withHeader(\'Authorization\', \'Bearer token\') ->withCompression() ->withSslVerification(verifyPeer: true); $transport = otlp_curl_transport($endpoint, $serializer, $options); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_curl_options()"),
+ boost: 10
+ }, {
+ label: "otlp_curl_transport",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_curl_transport ( string $endpoint , Serializer $serializer , CurlTransportOptions $options = Flow\\Bridge\\Telemetry\\OTLP\\Transport\\CurlTransportOptions::... ) : CurlTransport
+
+
+ Create an async curl transport for OTLP endpoints. Creates a CurlTransport that uses curl_multi for non-blocking I/O. Unlike HttpTransport (PSR-18), this transport queues requests and executes them asynchronously. Completed requests are processed on subsequent send() calls or on shutdown(). Requires: ext-curl PHP extension Example usage: \`\`\`php // JSON over HTTP (async) with default options $transport = otlp_curl_transport( endpoint: \'http://localhost:4318\', serializer: otlp_json_serializer(), ); // Protobuf over HTTP (async) with custom options $transport = otlp_curl_transport( endpoint: \'http://localhost:4318\', serializer: otlp_protobuf_serializer(), options: otlp_curl_options() ->withTimeout(60) ->withHeader(\'Authorization\', \'Bearer token\') ->withCompression(), ); \`\`\` @param string $endpoint OTLP endpoint URL (e.g., \'http://localhost:4318\') @param Serializer $serializer Serializer for encoding telemetry data (JSON or Protobuf) @param CurlTransportOptions $options Transport configuration options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_curl_transport(" + "$" + "{" + "1:endpoint" + "}" + ", " + "$" + "{" + "2:serializer" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_grpc_transport",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_grpc_transport ( string $endpoint , ProtobufSerializer $serializer , array $headers = [] , bool $insecure = true ) : GrpcTransport
+
+
+ Create a gRPC transport for OTLP endpoints. Creates a GrpcTransport configured to send telemetry data to an OTLP-compatible endpoint using gRPC protocol with Protobuf serialization. Requires: - ext-grpc PHP extension - google/protobuf package - open-telemetry/gen-otlp-protobuf package Example usage: \`\`\`php $transport = otlp_grpc_transport( endpoint: \'localhost:4317\', serializer: otlp_protobuf_serializer(), ); \`\`\` @param string $endpoint gRPC endpoint (e.g., \'localhost:4317\') @param ProtobufSerializer $serializer Protobuf serializer for encoding telemetry data @param array $headers Additional headers (metadata) to include in requests @param bool $insecure Whether to use insecure channel credentials (default true for local dev)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_grpc_transport(" + "$" + "{" + "1:endpoint" + "}" + ", " + "$" + "{" + "2:serializer" + "}" + ", " + "$" + "{" + "3:headers" + "}" + ", " + "$" + "{" + "4:insecure" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_http_transport",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_http_transport ( ClientInterface $client , RequestFactoryInterface $requestFactory , StreamFactoryInterface $streamFactory , string $endpoint , Serializer $serializer , array $headers = [] ) : HttpTransport
+
+
+ Create an HTTP transport for OTLP endpoints. Creates an HttpTransport configured to send telemetry data to an OTLP-compatible endpoint using PSR-18 HTTP client. Supports both JSON and Protobuf formats. Example usage: \`\`\`php // JSON over HTTP $transport = otlp_http_transport( client: $client, requestFactory: $psr17Factory, streamFactory: $psr17Factory, endpoint: \'http://localhost:4318\', serializer: otlp_json_serializer(), ); // Protobuf over HTTP $transport = otlp_http_transport( client: $client, requestFactory: $psr17Factory, streamFactory: $psr17Factory, endpoint: \'http://localhost:4318\', serializer: otlp_protobuf_serializer(), ); \`\`\` @param ClientInterface $client PSR-18 HTTP client @param RequestFactoryInterface $requestFactory PSR-17 request factory @param StreamFactoryInterface $streamFactory PSR-17 stream factory @param string $endpoint OTLP endpoint URL (e.g., \'http://localhost:4318\') @param Serializer $serializer Serializer for encoding telemetry data (JSON or Protobuf) @param array $headers Additional headers to include in requests
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_http_transport(" + "$" + "{" + "1:client" + "}" + ", " + "$" + "{" + "2:requestFactory" + "}" + ", " + "$" + "{" + "3:streamFactory" + "}" + ", " + "$" + "{" + "4:endpoint" + "}" + ", " + "$" + "{" + "5:serializer" + "}" + ", " + "$" + "{" + "6:headers" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_json_serializer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_json_serializer ( ) : JsonSerializer
+
+
+ Create a JSON serializer for OTLP. Returns a JsonSerializer that converts telemetry data to OTLP JSON wire format. Use this with HttpTransport for JSON over HTTP. Example usage: \`\`\`php $serializer = otlp_json_serializer(); $transport = otlp_http_transport($client, $reqFactory, $streamFactory, $endpoint, $serializer); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_json_serializer()"),
+ boost: 10
+ }, {
+ label: "otlp_logger_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_logger_provider ( LogProcessor $processor , ClockInterface $clock , ContextStorage $contextStorage = Flow\\Telemetry\\Context\\MemoryContextStorage::... ) : LoggerProvider
+
+
+ Create a logger provider configured for OTLP export. Example usage: \`\`\`php $processor = batching_log_processor(otlp_log_exporter($transport)); $provider = otlp_logger_provider($processor, $clock); $logger = $provider->logger($resource, \'my-service\', \'1.0.0\'); \`\`\` @param LogProcessor $processor The processor for handling log records @param ClockInterface $clock The clock for timestamps @param ContextStorage $contextStorage The context storage for propagating context
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_logger_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:contextStorage" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_log_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_log_exporter ( Transport $transport ) : OTLPLogExporter
+
+
+ Create an OTLP log exporter. Example usage: \`\`\`php $exporter = otlp_log_exporter($transport); $processor = batching_log_processor($exporter); \`\`\` @param Transport $transport The transport for sending log data
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_log_exporter(" + "$" + "{" + "1:transport" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_meter_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_meter_provider ( MetricProcessor $processor , ClockInterface $clock , AggregationTemporality $temporality = Flow\\Telemetry\\Meter\\AggregationTemporality::... ) : MeterProvider
+
+
+ Create a meter provider configured for OTLP export. Example usage: \`\`\`php $processor = batching_metric_processor(otlp_metric_exporter($transport)); $provider = otlp_meter_provider($processor, $clock); $meter = $provider->meter($resource, \'my-service\', \'1.0.0\'); \`\`\` @param MetricProcessor $processor The processor for handling metrics @param ClockInterface $clock The clock for timestamps @param AggregationTemporality $temporality The aggregation temporality for metrics
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_meter_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:temporality" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_metric_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_metric_exporter ( Transport $transport ) : OTLPMetricExporter
+
+
+ Create an OTLP metric exporter. Example usage: \`\`\`php $exporter = otlp_metric_exporter($transport); $processor = batching_metric_processor($exporter); \`\`\` @param Transport $transport The transport for sending metric data
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_metric_exporter(" + "$" + "{" + "1:transport" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_protobuf_serializer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_protobuf_serializer ( ) : ProtobufSerializer
+
+
+ Create a Protobuf serializer for OTLP. Returns a ProtobufSerializer that converts telemetry data to OTLP Protobuf binary format. Use this with HttpTransport for Protobuf over HTTP, or with GrpcTransport. Requires: - google/protobuf package - open-telemetry/gen-otlp-protobuf package Example usage: \`\`\`php $serializer = otlp_protobuf_serializer(); $transport = otlp_http_transport($client, $reqFactory, $streamFactory, $endpoint, $serializer); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_protobuf_serializer()"),
+ boost: 10
+ }, {
+ label: "otlp_span_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_span_exporter ( Transport $transport ) : OTLPSpanExporter
+
+
+ Create an OTLP span exporter. Example usage: \`\`\`php $exporter = otlp_span_exporter($transport); $processor = batching_span_processor($exporter); \`\`\` @param Transport $transport The transport for sending span data
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_span_exporter(" + "$" + "{" + "1:transport" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "otlp_tracer_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ otlp_tracer_provider ( SpanProcessor $processor , ClockInterface $clock , Sampler $sampler = Flow\\Telemetry\\Tracer\\Sampler\\AlwaysOnSampler::... , ContextStorage $contextStorage = Flow\\Telemetry\\Context\\MemoryContextStorage::... ) : TracerProvider
+
+
+ Create a tracer provider configured for OTLP export. Example usage: \`\`\`php $processor = batching_span_processor(otlp_span_exporter($transport)); $provider = otlp_tracer_provider($processor, $clock); $tracer = $provider->tracer($resource, \'my-service\', \'1.0.0\'); \`\`\` @param SpanProcessor $processor The processor for handling spans @param ClockInterface $clock The clock for timestamps @param Sampler $sampler The sampler for deciding whether to record spans @param ContextStorage $contextStorage The context storage for propagating trace context
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Telemetry\\OTLP\\DSL\\otlp_tracer_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:sampler" + "}" + ", " + "$" + "{" + "4:contextStorage" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "overwrite",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ overwrite ( ) : SaveMode
+
+
+ Alias for save_mode_overwrite().
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\overwrite()"),
+ boost: 10
+ }, {
+ label: "pagination_key_asc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pagination_key_asc ( string $column , ParameterType|Type|string|int $type = Doctrine\\DBAL\\ParameterType::... ) : Key
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\pagination_key_asc(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pagination_key_desc",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pagination_key_desc ( string $column , ParameterType|Type|string|int $type = Doctrine\\DBAL\\ParameterType::... ) : Key
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\pagination_key_desc(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pagination_key_set",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pagination_key_set ( Key $keys ) : KeySet
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\pagination_key_set(" + "$" + "{" + "1:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "param",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ param ( int $position ) : Parameter
+
+
+ Create a positional parameter ($1, $2, etc.).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\param(" + "$" + "{" + "1:position" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "partition",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ partition ( string $name , string $value ) : Partition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\partition(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "partitions",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ partitions ( Partition $partition ) : Partitions
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\partitions(" + "$" + "{" + "1:partition" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pass_through_log_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pass_through_log_processor ( LogExporter $exporter ) : PassThroughLogProcessor
+
+
+ Create a PassThroughLogProcessor. Exports each log record immediately when processed. Useful for debugging where immediate visibility is more important than performance. @param LogExporter $exporter The exporter to send logs to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\pass_through_log_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pass_through_metric_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pass_through_metric_processor ( MetricExporter $exporter ) : PassThroughMetricProcessor
+
+
+ Create a PassThroughMetricProcessor. Exports each metric immediately when processed. Useful for debugging where immediate visibility is more important than performance. @param MetricExporter $exporter The exporter to send metrics to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\pass_through_metric_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pass_through_span_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pass_through_span_processor ( SpanExporter $exporter ) : PassThroughSpanProcessor
+
+
+ Create a PassThroughSpanProcessor. Exports each span immediately when it ends. Useful for debugging where immediate visibility is more important than performance. @param SpanExporter $exporter The exporter to send spans to
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\pass_through_span_processor(" + "$" + "{" + "1:exporter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "path",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ path ( string $path , Options|array $options = [] ) : Path
+
+
+ Path supports glob patterns. Examples: - path(\'*.csv\') - any csv file in current directory - path(\'/** / *.csv\') - any csv file in any subdirectory (remove empty spaces) - path(\'/dir/partition=* /*.parquet\') - any parquet file in given partition directory. Glob pattern is also supported by remote filesystems like Azure - path(\'azure-blob://directory/*.csv\') - any csv file in given directory @param array|Path\\Options $options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\path(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "path_memory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ path_memory ( string $path = '' , array $options = null ) : Path
+
+
+ Create a path to php memory stream. @param string $path - default = \'\' - path is used as an identifier in memory filesystem, so we can write multiple files to memory at once, each path is a new handle @param null|array{\'stream\': \'memory\'|\'temp\'} $options - when nothing is provided, \'temp\' stream is used by default @return Path
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\path_memory(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "path_real",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ path_real ( string $path , array $options = [] ) : Path
+
+
+ Resolve real path from given path. @param array $options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\path_real(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "path_stdout",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ path_stdout ( array $options = null ) : Path
+
+
+ Create a path to php stdout stream. @param null|array{\'stream\': \'output\'|\'stderr\'|\'stdout\'} $options @return Path
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\path_stdout(" + "$" + "{" + "1:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pgsql_client",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_client ( ConnectionParameters $params , ValueConverters $valueConverters = null , RowMapper $mapper = null ) : Client
+
+
+ Create a PostgreSQL client using ext-pgsql. The client connects immediately and is ready to execute queries. For object mapping, provide a RowMapper (use pgsql_mapper() for the default). @param Client\\ConnectionParameters $params Connection parameters @param null|ValueConverters $valueConverters Custom type converters (optional) @param null|Client\\RowMapper $mapper Row mapper for object hydration (optional) @throws ConnectionException If connection fails @example // Basic client $client = pgsql_client(pgsql_connection(\'host=localhost dbname=mydb\')); // With object mapping $client = pgsql_client( pgsql_connection(\'host=localhost dbname=mydb\'), mapper: pgsql_mapper(), );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_client(" + "$" + "{" + "1:params" + "}" + ", " + "$" + "{" + "2:valueConverters" + "}" + ", " + "$" + "{" + "3:mapper" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pgsql_connection",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_connection ( string $connectionString ) : ConnectionParameters
+
+
+ Create connection parameters from a connection string. Accepts libpq-style connection strings: - Key-value format: \"host=localhost port=5432 dbname=mydb user=myuser password=secret\" - URI format: \"postgresql://user:password@localhost:5432/dbname\" @example $params = pgsql_connection(\'host=localhost dbname=mydb\'); $params = pgsql_connection(\'postgresql://user:pass@localhost/mydb\');
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_connection(" + "$" + "{" + "1:connectionString" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pgsql_connection_dsn",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_connection_dsn ( string $dsn ) : ConnectionParameters
+
+
+ Create connection parameters from a DSN string. Parses standard PostgreSQL DSN format commonly used in environment variables (e.g., DATABASE_URL). Supports postgres://, postgresql://, and pgsql:// schemes. @param string $dsn DSN string in format: postgres://user:password@host:port/database?options @throws Client\\DsnParserException If the DSN cannot be parsed @example $params = pgsql_connection_dsn(\'postgres://myuser:secret@localhost:5432/mydb\'); $params = pgsql_connection_dsn(\'postgresql://user:pass@db.example.com/app?sslmode=require\'); $params = pgsql_connection_dsn(\'pgsql://user:pass@localhost/mydb\'); // Symfony/Doctrine format $params = pgsql_connection_dsn(getenv(\'DATABASE_URL\'));
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_connection_dsn(" + "$" + "{" + "1:dsn" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pgsql_connection_params",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_connection_params ( string $database , string $host = 'localhost' , int $port = 5432 , string $user = null , string $password = null , array $options = [] ) : ConnectionParameters
+
+
+ Create connection parameters from individual values. Allows specifying connection parameters individually for better type safety and IDE support. @param string $database Database name (required) @param string $host Hostname (default: localhost) @param int $port Port number (default: 5432) @param null|string $user Username (optional) @param null|string $password Password (optional) @param array $options Additional libpq options @example $params = pgsql_connection_params( database: \'mydb\', host: \'localhost\', user: \'myuser\', password: \'secret\', );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_connection_params(" + "$" + "{" + "1:database" + "}" + ", " + "$" + "{" + "2:host" + "}" + ", " + "$" + "{" + "3:port" + "}" + ", " + "$" + "{" + "4:user" + "}" + ", " + "$" + "{" + "5:password" + "}" + ", " + "$" + "{" + "6:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "pgsql_mapper",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_mapper ( ) : ConstructorMapper
+
+
+ Create a default constructor-based row mapper. Maps database rows directly to constructor parameters. Column names must match parameter names exactly (1:1). Use SQL aliases if column names differ from parameter names. @example // DTO where column names match parameter names readonly class User { public function __construct( public int $id, public string $name, public string $email, ) {} } // Usage $client = pgsql_client(pgsql_connection(\'...\'), mapper: pgsql_mapper()); // For snake_case columns, use SQL aliases $user = $client->fetchInto( User::class, \'SELECT id, user_name AS name, user_email AS email FROM users WHERE id = $1\', [1] );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_mapper()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bigint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bigint ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bigint()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bit",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bit ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bit()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bool",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bool ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bool()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_boolean",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_boolean ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_boolean()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bool_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bool_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bool_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bpchar",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bpchar ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bpchar()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_bytea",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_bytea ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_bytea()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_char",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_char ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_char()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_cidr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_cidr ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_cidr()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_date ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_date()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_double",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_double ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_double()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_float4",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_float4 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_float4()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_float4_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_float4_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_float4_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_float8",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_float8 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_float8()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_float8_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_float8_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_float8_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_inet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_inet ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_inet()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int2",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int2 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int2()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int2_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int2_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int2_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int4",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int4 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int4()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int4_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int4_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int4_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int8",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int8 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int8()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_int8_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_int8_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_int8_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_integer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_integer ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_integer()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_interval",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_interval ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_interval()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_json ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_json()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_jsonb",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_jsonb ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_jsonb()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_jsonb_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_jsonb_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_jsonb_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_json_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_json_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_json_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_macaddr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_macaddr ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_macaddr()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_macaddr8",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_macaddr8 ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_macaddr8()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_money",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_money ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_money()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_numeric",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_numeric ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_numeric()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_oid",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_oid ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_oid()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_real",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_real ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_real()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_smallint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_smallint ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_smallint()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_text ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_text()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_text_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_text_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_text_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_time",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_time ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_time()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_timestamp",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_timestamp ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_timestamp()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_timestamptz",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_timestamptz ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_timestamptz()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_timetz",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_timetz ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_timetz()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_uuid",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_uuid ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_uuid()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_uuid_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_uuid_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_uuid_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_varbit",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_varbit ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_varbit()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_varchar",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_varchar ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_varchar()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_varchar_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_varchar_array ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_varchar_array()"),
+ boost: 10
+ }, {
+ label: "pgsql_type_xml",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pgsql_type_xml ( ) : PostgreSqlType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\pgsql_type_xml()"),
+ boost: 10
+ }, {
+ label: "pie_chart",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ pie_chart ( EntryReference $label , References $datasets ) : PieChart
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\pie_chart(" + "$" + "{" + "1:label" + "}" + ", " + "$" + "{" + "2:datasets" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "postgresql_insert_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ postgresql_insert_options ( bool $skip_conflicts = null , string $constraint = null , array $conflict_columns = [] , array $update_columns = [] ) : PostgreSQLInsertOptions
+
+
+ @param array $conflict_columns @param array $update_columns
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\postgresql_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:constraint" + "}" + ", " + "$" + "{" + "3:conflict_columns" + "}" + ", " + "$" + "{" + "4:update_columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "postgresql_telemetry_config",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ postgresql_telemetry_config ( Telemetry $telemetry , ClockInterface $clock , PostgreSqlTelemetryOptions $options = null ) : PostgreSqlTelemetryConfig
+
+
+ Create telemetry configuration for PostgreSQL client. Bundles telemetry instance, clock, and options needed to instrument a PostgreSQL client. @param Telemetry $telemetry The telemetry instance @param ClockInterface $clock Clock for timestamps @param null|PostgreSqlTelemetryOptions $options Telemetry options (default: all enabled) @example $config = postgresql_telemetry_config( telemetry(resource([\'service.name\' => \'my-app\'])), new SystemClock(), );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\postgresql_telemetry_config(" + "$" + "{" + "1:telemetry" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "postgresql_telemetry_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ postgresql_telemetry_options ( bool $traceQueries = true , bool $traceTransactions = true , bool $collectMetrics = true , bool $logQueries = false , int $maxQueryLength = 1000 , bool $includeParameters = false , int $maxParameters = 10 , int $maxParameterLength = 100 ) : PostgreSqlTelemetryOptions
+
+
+ Create telemetry options for PostgreSQL client instrumentation. Controls which telemetry signals (traces, metrics, logs) are enabled and how query information is captured. @param bool $traceQueries Create spans for query execution (default: true) @param bool $traceTransactions Create spans for transactions (default: true) @param bool $collectMetrics Collect duration and row count metrics (default: true) @param bool $logQueries Log executed queries (default: false) @param null|int $maxQueryLength Maximum query text length in telemetry (default: 1000, null = unlimited) @param bool $includeParameters Include query parameters in telemetry (default: false, security consideration) @example // Default options (traces and metrics enabled) $options = postgresql_telemetry_options(); // Enable query logging $options = postgresql_telemetry_options(logQueries: true); // Disable all but metrics $options = postgresql_telemetry_options( traceQueries: false, traceTransactions: false, collectMetrics: true, );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\postgresql_telemetry_options(" + "$" + "{" + "1:traceQueries" + "}" + ", " + "$" + "{" + "2:traceTransactions" + "}" + ", " + "$" + "{" + "3:collectMetrics" + "}" + ", " + "$" + "{" + "4:logQueries" + "}" + ", " + "$" + "{" + "5:maxQueryLength" + "}" + ", " + "$" + "{" + "6:includeParameters" + "}" + ", " + "$" + "{" + "7:maxParameters" + "}" + ", " + "$" + "{" + "8:maxParameterLength" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "postgresql_update_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ postgresql_update_options ( array $primary_key_columns = [] , array $update_columns = [] ) : PostgreSQLUpdateOptions
+
+
+ @param array $primary_key_columns @param array $update_columns
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\postgresql_update_options(" + "$" + "{" + "1:primary_key_columns" + "}" + ", " + "$" + "{" + "2:update_columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "prepare_transaction",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ prepare_transaction ( string $transactionId ) : PreparedTransactionFinalStep
+
+
+ Create a PREPARE TRANSACTION builder. Example: prepare_transaction(\'my_transaction\') Produces: PREPARE TRANSACTION \'my_transaction\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\prepare_transaction(" + "$" + "{" + "1:transactionId" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "primary_key",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ primary_key ( string $columns ) : PrimaryKeyConstraint
+
+
+ Create a PRIMARY KEY constraint. @param string ...$columns Columns that form the primary key
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\primary_key(" + "$" + "{" + "1:columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "print_rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ print_rows ( Rows $rows , int|bool $truncate = false , Formatter $formatter = null ) : string
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\print_rows(" + "$" + "{" + "1:rows" + "}" + ", " + "$" + "{" + "2:truncate" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "print_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ print_schema ( Schema $schema , SchemaFormatter $formatter = null ) : string
+
+
+ @param Schema $schema @deprecated Please use schema_to_ascii($schema) instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\print_schema(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "process_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ process_detector ( ) : ProcessDetector
+
+
+ Create a ProcessDetector. Detects process information including process.pid, process.executable.path, process.runtime.name (PHP), process.runtime.version, process.command, and process.owner (on POSIX systems).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\process_detector()"),
+ boost: 10
+ }, {
+ label: "propagation_context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ propagation_context ( SpanContext $spanContext = null , Baggage $baggage = null ) : PropagationContext
+
+
+ Create a PropagationContext. Value object containing both trace context (SpanContext) and application data (Baggage) that can be propagated across process boundaries. @param null|SpanContext $spanContext Optional span context @param null|Baggage $baggage Optional baggage
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\propagation_context(" + "$" + "{" + "1:spanContext" + "}" + ", " + "$" + "{" + "2:baggage" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "protocol",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ protocol ( string $protocol ) : Protocol
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\protocol(" + "$" + "{" + "1:protocol" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "psr7_request_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ psr7_request_carrier ( ServerRequestInterface $request ) : RequestCarrier
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Psr7\\Telemetry\\DSL\\psr7_request_carrier(" + "$" + "{" + "1:request" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "psr7_response_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ psr7_response_carrier ( ResponseInterface $response ) : ResponseCarrier
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Psr7\\Telemetry\\DSL\\psr7_response_carrier(" + "$" + "{" + "1:response" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "psr18_traceable_client",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ psr18_traceable_client ( ClientInterface $client , Telemetry $telemetry ) : PSR18TraceableClient
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Psr18\\Telemetry\\DSL\\psr18_traceable_client(" + "$" + "{" + "1:client" + "}" + ", " + "$" + "{" + "2:telemetry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "random_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ random_string ( ScalarFunction|int $length , RandomValueGenerator $generator = Flow\\ETL\\NativePHPRandomValueGenerator::... ) : RandomString
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\random_string(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:generator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rank",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dwindow\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rank ( ) : Rank
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\rank()"),
+ boost: 10
+ }, {
+ label: "raw_cond",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ raw_cond ( string $sql ) : RawCondition
+
+
+ Create a raw SQL condition (use with caution). SECURITY WARNING: This function accepts raw SQL without parameterization. SQL injection is possible if used with untrusted user input. Only use with trusted, validated input. For user-provided values, use standard condition functions with param(): \`\`\`php // UNSAFE - SQL injection possible: raw_cond(\"status = \'\" . $userInput . \"\'\") // SAFE - use typed conditions: eq(col(\'status\'), param(1)) \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\raw_cond(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "raw_expr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ raw_expr ( string $sql ) : RawExpression
+
+
+ Create a raw SQL expression (use with caution). SECURITY WARNING: This function accepts raw SQL without parameterization. SQL injection is possible if used with untrusted user input. Only use with trusted, validated input. For user-provided values, use param() instead: \`\`\`php // UNSAFE - SQL injection possible: raw_expr(\"custom_func(\'\" . $userInput . \"\')\") // SAFE - use parameters: func(\'custom_func\', param(1)) \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\raw_expr(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reassign_owned",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reassign_owned ( string $roles ) : ReassignOwnedToStep
+
+
+ Create a REASSIGN OWNED builder. Example: reassign_owned(\'old_role\')->to(\'new_role\') Produces: REASSIGN OWNED BY old_role TO new_role @param string ...$roles The roles whose owned objects should be reassigned @return ReassignOwnedToStep Builder for reassign owned options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reassign_owned(" + "$" + "{" + "1:roles" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "ref",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref ( string $entry ) : EntryReference
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\ref(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "refresh_materialized_view",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ refresh_materialized_view ( string $name , string $schema = null ) : RefreshMatViewOptionsStep
+
+
+ Create a REFRESH MATERIALIZED VIEW builder. Example: refresh_materialized_view(\'user_stats\') Produces: REFRESH MATERIALIZED VIEW user_stats Example: refresh_materialized_view(\'user_stats\')->concurrently()->withData() Produces: REFRESH MATERIALIZED VIEW CONCURRENTLY user_stats WITH DATA @param string $name View name (may include schema as \"schema.view\") @param null|string $schema Schema name (optional, overrides parsed schema)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\refresh_materialized_view(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "refs",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ refs ( Reference|string $entries ) : References
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\refs(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "ref_action_cascade",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref_action_cascade ( ) : ReferentialAction
+
+
+ Get a CASCADE referential action.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\ref_action_cascade()"),
+ boost: 10
+ }, {
+ label: "ref_action_no_action",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref_action_no_action ( ) : ReferentialAction
+
+
+ Get a NO ACTION referential action.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\ref_action_no_action()"),
+ boost: 10
+ }, {
+ label: "ref_action_restrict",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref_action_restrict ( ) : ReferentialAction
+
+
+ Get a RESTRICT referential action.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\ref_action_restrict()"),
+ boost: 10
+ }, {
+ label: "ref_action_set_default",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref_action_set_default ( ) : ReferentialAction
+
+
+ Get a SET DEFAULT referential action.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\ref_action_set_default()"),
+ boost: 10
+ }, {
+ label: "ref_action_set_null",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ref_action_set_null ( ) : ReferentialAction
+
+
+ Get a SET NULL referential action.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\ref_action_set_null()"),
+ boost: 10
+ }, {
+ label: "regex",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex ( ScalarFunction|string $pattern , ScalarFunction|string $subject , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : Regex
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\regex(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_all ( ScalarFunction|string $pattern , ScalarFunction|string $subject , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexAll
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\regex_all(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_imatch",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_imatch ( Expression $expr , Expression $pattern ) : OperatorCondition
+
+
+ Create a POSIX regex match condition (~*). Case-insensitive. Example: regex_imatch(col(\'email\'), literal_string(\'.*@gmail\\\\.com\')) Produces: email ~* \'.*@gmail\\.com\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\regex_imatch(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_match",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_match ( ScalarFunction|string $pattern , ScalarFunction|string $subject , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexMatch
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\regex_match(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_match",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_match ( Expression $expr , Expression $pattern ) : OperatorCondition
+
+
+ Create a POSIX regex match condition (~). Case-sensitive. Example: regex_match(col(\'email\'), literal_string(\'.*@gmail\\\\.com\')) Produces: email ~ \'.*@gmail\\.com\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\regex_match(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_match_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_match_all ( ScalarFunction|string $pattern , ScalarFunction|string $subject , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexMatchAll
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\regex_match_all(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex_replace",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex_replace ( ScalarFunction|string $pattern , ScalarFunction|string $replacement , ScalarFunction|string $subject , ScalarFunction|int|null $limit = null ) : RegexReplace
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\regex_replace(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:replacement" + "}" + ", " + "$" + "{" + "3:subject" + "}" + ", " + "$" + "{" + "4:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reindex_database",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reindex_database ( string $name ) : ReindexFinalStep
+
+
+ Start building a REINDEX DATABASE statement. Use chainable methods: ->concurrently(), ->verbose(), ->tablespace() Example: reindex_database(\'mydb\')->concurrently() @param string $name The database name
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reindex_database(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reindex_index",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reindex_index ( string $name ) : ReindexFinalStep
+
+
+ Start building a REINDEX INDEX statement. Use chainable methods: ->concurrently(), ->verbose(), ->tablespace() Example: reindex_index(\'idx_users_email\')->concurrently() @param string $name The index name (may include schema: schema.index)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reindex_index(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reindex_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reindex_schema ( string $name ) : ReindexFinalStep
+
+
+ Start building a REINDEX SCHEMA statement. Use chainable methods: ->concurrently(), ->verbose(), ->tablespace() Example: reindex_schema(\'public\')->concurrently() @param string $name The schema name
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reindex_schema(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reindex_table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reindex_table ( string $name ) : ReindexFinalStep
+
+
+ Start building a REINDEX TABLE statement. Use chainable methods: ->concurrently(), ->verbose(), ->tablespace() Example: reindex_table(\'users\')->concurrently() @param string $name The table name (may include schema: schema.table)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reindex_table(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "release_savepoint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ release_savepoint ( string $name ) : SavepointFinalStep
+
+
+ Release a SAVEPOINT. Example: release_savepoint(\'my_savepoint\') Produces: RELEASE my_savepoint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\release_savepoint(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rename_replace",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rename_replace ( array|string $search , array|string $replace ) : RenameReplaceEntryStrategy
+
+
+ @param array|string $search @param array|string $replace
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\rename_replace(" + "$" + "{" + "1:search" + "}" + ", " + "$" + "{" + "2:replace" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rename_style",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rename_style ( StringStyles|StringStyles $style ) : RenameCaseEntryStrategy
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\rename_style(" + "$" + "{" + "1:style" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reset_role",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reset_role ( ) : ResetRoleFinalStep
+
+
+ Create a RESET ROLE builder. Example: reset_role() Produces: RESET ROLE @return ResetRoleFinalStep Builder for reset role
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\reset_role()"),
+ boost: 10
+ }, {
+ label: "resource",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ resource ( Attributes|array $attributes = [] ) : Resource
+
+
+ Create a Resource. @param array|bool|float|int|string>|Attributes $attributes Resource attributes
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\resource(" + "$" + "{" + "1:attributes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "resource_detector",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ resource_detector ( array $detectors = [] ) : ChainDetector
+
+
+ Create a resource detector chain. When no detectors are provided, uses the default detector chain: 1. OsDetector - Operating system information 2. HostDetector - Host information 3. ProcessDetector - Process information 4. ComposerDetector - Service information from Composer 5. EnvironmentDetector - Environment variable overrides (highest precedence) When detectors are provided, uses only those detectors. @param array $detectors Optional custom detectors (empty = use defaults)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\resource_detector(" + "$" + "{" + "1:detectors" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "retry_any_throwable",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ retry_any_throwable ( int $limit ) : AnyThrowable
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\retry_any_throwable(" + "$" + "{" + "1:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "retry_on_exception_types",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ retry_on_exception_types ( array $exception_types , int $limit ) : OnExceptionTypes
+
+
+ @param array> $exception_types
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\retry_on_exception_types(" + "$" + "{" + "1:exception_types" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "returning",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ returning ( Expression $expressions ) : ReturningClause
+
+
+ Create a RETURNING clause. @param Expression ...$expressions Expressions to return
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\returning(" + "$" + "{" + "1:expressions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "returning_all",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ returning_all ( ) : ReturningClause
+
+
+ Create a RETURNING * clause.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\returning_all()"),
+ boost: 10
+ }, {
+ label: "revoke",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ revoke ( TablePrivilege|string $privileges ) : RevokeOnStep
+
+
+ Create a REVOKE privileges builder. Example: revoke(TablePrivilege::SELECT)->onTable(\'users\')->from(\'app_user\') Produces: REVOKE SELECT ON users FROM app_user Example: revoke(TablePrivilege::ALL)->onTable(\'users\')->from(\'app_user\')->cascade() Produces: REVOKE ALL ON users FROM app_user CASCADE @param string|TablePrivilege ...$privileges The privileges to revoke @return RevokeOnStep Builder for revoke options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\revoke(" + "$" + "{" + "1:privileges" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "revoke_role",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ revoke_role ( string $roles ) : RevokeRoleFromStep
+
+
+ Create a REVOKE role builder. Example: revoke_role(\'admin\')->from(\'user1\') Produces: REVOKE admin FROM user1 Example: revoke_role(\'admin\')->from(\'user1\')->cascade() Produces: REVOKE admin FROM user1 CASCADE @param string ...$roles The roles to revoke @return RevokeRoleFromStep Builder for revoke role options
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\revoke_role(" + "$" + "{" + "1:roles" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rollback",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rollback ( ) : RollbackOptionsStep
+
+
+ Create a ROLLBACK transaction builder. Example: rollback()->toSavepoint(\'my_savepoint\') Produces: ROLLBACK TO SAVEPOINT my_savepoint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\rollback()"),
+ boost: 10
+ }, {
+ label: "rollback_prepared",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rollback_prepared ( string $transactionId ) : PreparedTransactionFinalStep
+
+
+ Create a ROLLBACK PREPARED builder. Example: rollback_prepared(\'my_transaction\') Produces: ROLLBACK PREPARED \'my_transaction\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\rollback_prepared(" + "$" + "{" + "1:transactionId" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "round",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ round ( ScalarFunction|int|float $value , ScalarFunction|int $precision = 2 , ScalarFunction|int $mode = 1 ) : Round
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\round(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:precision" + "}" + ", " + "$" + "{" + "3:mode" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "row",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ row ( Entry $entry ) : Row
+
+
+ @param Entry ...$entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\row(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rows",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rows ( Row $row ) : Rows
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\rows(" + "$" + "{" + "1:row" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "rows_partitioned",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ rows_partitioned ( array $rows , Partitions|array $partitions ) : Rows
+
+
+ @param array $rows @param array<\\Flow\\Filesystem\\Partition|string>|Partitions $partitions
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\rows_partitioned(" + "$" + "{" + "1:rows" + "}" + ", " + "$" + "{" + "2:partitions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "row_expr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ row_expr ( array $elements ) : RowExpression
+
+
+ Create a row expression. @param list $elements Row elements
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\row_expr(" + "$" + "{" + "1:elements" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "row_number",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ row_number ( ) : RowNumber
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\row_number()"),
+ boost: 10
+ }, {
+ label: "sanitize",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sanitize ( ScalarFunction|string $value , ScalarFunction|string $placeholder = '*' , ScalarFunction|int|null $skipCharacters = null ) : Sanitize
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\sanitize(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:placeholder" + "}" + ", " + "$" + "{" + "3:skipCharacters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "savepoint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ savepoint ( string $name ) : SavepointFinalStep
+
+
+ Create a SAVEPOINT. Example: savepoint(\'my_savepoint\') Produces: SAVEPOINT my_savepoint
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\savepoint(" + "$" + "{" + "1:name" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "save_mode_append",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ save_mode_append ( ) : SaveMode
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_append()"),
+ boost: 10
+ }, {
+ label: "save_mode_exception_if_exists",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ save_mode_exception_if_exists ( ) : SaveMode
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_exception_if_exists()"),
+ boost: 10
+ }, {
+ label: "save_mode_ignore",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ save_mode_ignore ( ) : SaveMode
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_ignore()"),
+ boost: 10
+ }, {
+ label: "save_mode_overwrite",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ save_mode_overwrite ( ) : SaveMode
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_overwrite()"),
+ boost: 10
+ }, {
+ label: "schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema ( Definition $definitions ) : Schema
+
+
+ @param Definition ...$definitions @return Schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema(" + "$" + "{" + "1:definitions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_evolving_validator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_evolving_validator ( ) : EvolvingValidator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_evolving_validator()"),
+ boost: 10
+ }, {
+ label: "schema_from_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_from_json ( string $schema ) : Schema
+
+
+ @return Schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_from_json(" + "$" + "{" + "1:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_from_parquet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_from_parquet ( Schema $schema ) : Schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_from_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_metadata",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_metadata ( array $metadata = [] ) : Metadata
+
+
+ @param array|bool|float|int|string> $metadata
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_metadata(" + "$" + "{" + "1:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_selective_validator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_selective_validator ( ) : SelectiveValidator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_selective_validator()"),
+ boost: 10
+ }, {
+ label: "schema_strict_validator",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_strict_validator ( ) : StrictValidator
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_strict_validator()"),
+ boost: 10
+ }, {
+ label: "schema_to_ascii",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_to_ascii ( Schema $schema , SchemaFormatter $formatter = null ) : string
+
+
+ @param Schema $schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_ascii(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_to_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_to_json ( Schema $schema , bool $pretty = false ) : string
+
+
+ @param Schema $schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_json(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:pretty" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_to_parquet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_to_parquet ( Schema $schema ) : Schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_to_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_to_php",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_to_php ( Schema $schema , ValueFormatter $valueFormatter = Flow\\ETL\\Schema\\Formatter\\PHPFormatter\\ValueFormatter::... , TypeFormatter $typeFormatter = Flow\\ETL\\Schema\\Formatter\\PHPFormatter\\TypeFormatter::... ) : string
+
+
+ @param Schema $schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_php(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:valueFormatter" + "}" + ", " + "$" + "{" + "3:typeFormatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "schema_validate",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ schema_validate ( Schema $expected , Schema $given , SchemaValidator $validator = Flow\\ETL\\Schema\\Validator\\StrictValidator::... ) : bool
+
+
+ @param Schema $expected @param Schema $given
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_validate(" + "$" + "{" + "1:expected" + "}" + ", " + "$" + "{" + "2:given" + "}" + ", " + "$" + "{" + "3:validator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "select",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtransformers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ select ( Reference|string $entries ) : Select
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\select(" + "$" + "{" + "1:entries" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "select",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ select ( Expression $expressions ) : SelectBuilder
+
+
+ Create a new SELECT query builder. @param Expression ...$expressions Columns to select. If empty, returns SelectSelectStep.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\select(" + "$" + "{" + "1:expressions" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "set_role",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ set_role ( string $role ) : SetRoleFinalStep
+
+
+ Create a SET ROLE builder. Example: set_role(\'admin\') Produces: SET ROLE admin @param string $role The role to set @return SetRoleFinalStep Builder for set role
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_role(" + "$" + "{" + "1:role" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "set_session_transaction",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ set_session_transaction ( ) : SetTransactionOptionsStep
+
+
+ Create a SET SESSION CHARACTERISTICS AS TRANSACTION builder. Example: set_session_transaction()->isolationLevel(IsolationLevel::SERIALIZABLE) Produces: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_session_transaction()"),
+ boost: 10
+ }, {
+ label: "set_transaction",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ set_transaction ( ) : SetTransactionOptionsStep
+
+
+ Create a SET TRANSACTION builder. Example: set_transaction()->isolationLevel(IsolationLevel::SERIALIZABLE)->readOnly() Produces: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_transaction()"),
+ boost: 10
+ }, {
+ label: "severity_filtering_log_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ severity_filtering_log_processor ( LogProcessor $processor , Severity $minimumSeverity = Flow\\Telemetry\\Logger\\Severity::... ) : SeverityFilteringLogProcessor
+
+
+ Create a SeverityFilteringLogProcessor. Filters log entries based on minimum severity level. Only entries at or above the configured threshold are passed to the wrapped processor. @param LogProcessor $processor The processor to wrap @param Severity $minimumSeverity Minimum severity level (default: INFO)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\severity_filtering_log_processor(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:minimumSeverity" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "severity_mapper",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ severity_mapper ( array $customMapping = null ) : SeverityMapper
+
+
+ Create a SeverityMapper for mapping Monolog levels to Telemetry severities. @param null|array $customMapping Optional custom mapping (Monolog Level value => Telemetry Severity) Example with default mapping: \`\`\`php $mapper = severity_mapper(); \`\`\` Example with custom mapping: \`\`\`php use Monolog\\Level; use Flow\\Telemetry\\Logger\\Severity; $mapper = severity_mapper([ Level::Debug->value => Severity::DEBUG, Level::Info->value => Severity::INFO, Level::Notice->value => Severity::WARN, // Custom: NOTICE → WARN instead of INFO Level::Warning->value => Severity::WARN, Level::Error->value => Severity::ERROR, Level::Critical->value => Severity::FATAL, Level::Alert->value => Severity::FATAL, Level::Emergency->value => Severity::FATAL, ]); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Monolog\\Telemetry\\DSL\\severity_mapper(" + "$" + "{" + "1:customMapping" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "similar_to",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ similar_to ( Expression $expr , Expression $pattern ) : SimilarTo
+
+
+ Create a SIMILAR TO condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\similar_to(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "size",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ size ( mixed $value ) : Size
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\size(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "skip_rows_handler",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ skip_rows_handler ( ) : SkipRows
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\skip_rows_handler()"),
+ boost: 10
+ }, {
+ label: "span_context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ span_context ( TraceId $traceId , SpanId $spanId , SpanId $parentSpanId = null ) : SpanContext
+
+
+ Create a SpanContext. @param TraceId $traceId The trace ID @param SpanId $spanId The span ID @param null|SpanId $parentSpanId Optional parent span ID
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\span_context(" + "$" + "{" + "1:traceId" + "}" + ", " + "$" + "{" + "2:spanId" + "}" + ", " + "$" + "{" + "3:parentSpanId" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "span_event",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ span_event ( string $name , DateTimeImmutable $timestamp , Attributes|array $attributes = [] ) : GenericEvent
+
+
+ Create a SpanEvent (GenericEvent) with an explicit timestamp. @param string $name Event name @param \\DateTimeImmutable $timestamp Event timestamp @param array|bool|float|int|string>|Attributes $attributes Event attributes
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\span_event(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:timestamp" + "}" + ", " + "$" + "{" + "3:attributes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "span_id",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ span_id ( string $hex = null ) : SpanId
+
+
+ Create a SpanId. If a hex string is provided, creates a SpanId from it. Otherwise, generates a new random SpanId. @param null|string $hex Optional 16-character hexadecimal string @throws \\InvalidArgumentException if the hex string is invalid
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\span_id(" + "$" + "{" + "1:hex" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "span_limits",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ span_limits ( int $attributeCountLimit = 128 , int $eventCountLimit = 128 , int $linkCountLimit = 128 , int $attributePerEventCountLimit = 128 , int $attributePerLinkCountLimit = 128 , int $attributeValueLengthLimit = null ) : SpanLimits
+
+
+ Create SpanLimits configuration. SpanLimits controls the maximum amount of data a span can collect, preventing unbounded memory growth and ensuring reasonable span sizes. @param int $attributeCountLimit Maximum number of attributes per span @param int $eventCountLimit Maximum number of events per span @param int $linkCountLimit Maximum number of links per span @param int $attributePerEventCountLimit Maximum number of attributes per event @param int $attributePerLinkCountLimit Maximum number of attributes per link @param null|int $attributeValueLengthLimit Maximum length for string attribute values (null = unlimited)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\span_limits(" + "$" + "{" + "1:attributeCountLimit" + "}" + ", " + "$" + "{" + "2:eventCountLimit" + "}" + ", " + "$" + "{" + "3:linkCountLimit" + "}" + ", " + "$" + "{" + "4:attributePerEventCountLimit" + "}" + ", " + "$" + "{" + "5:attributePerLinkCountLimit" + "}" + ", " + "$" + "{" + "6:attributeValueLengthLimit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "span_link",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ span_link ( SpanContext $context , Attributes|array $attributes = [] ) : SpanLink
+
+
+ Create a SpanLink. @param SpanContext $context The linked span context @param array|bool|float|int|string>|Attributes $attributes Link attributes
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\span_link(" + "$" + "{" + "1:context" + "}" + ", " + "$" + "{" + "2:attributes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "split",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ split ( ScalarFunction|string $value , ScalarFunction|string $separator , ScalarFunction|int $limit = 9223372036854775807 ) : Split
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\split(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:separator" + "}" + ", " + "$" + "{" + "3:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sprintf",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sprintf ( ScalarFunction|string $format , ScalarFunction|string|int|float|null $args ) : Sprintf
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\sprintf(" + "$" + "{" + "1:format" + "}" + ", " + "$" + "{" + "2:args" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sqlite_insert_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sqlite_insert_options ( bool $skip_conflicts = null , array $conflict_columns = [] , array $update_columns = [] ) : SqliteInsertOptions
+
+
+ @param array $conflict_columns @param array $update_columns
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\sqlite_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:conflict_columns" + "}" + ", " + "$" + "{" + "3:update_columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_analyze",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_analyze ( Plan $plan ) : PlanAnalyzer
+
+
+ Create a plan analyzer for analyzing EXPLAIN plans. @param Plan $plan The execution plan to analyze @return PlanAnalyzer The analyzer for extracting insights
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_analyze(" + "$" + "{" + "1:plan" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_deparse",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_deparse ( ParsedQuery $query , DeparseOptions $options = null ) : string
+
+
+ Convert a ParsedQuery AST back to SQL string. When called without options, returns the SQL as a simple string. When called with DeparseOptions, applies formatting (pretty-printing, indentation, etc.). @throws \\RuntimeException if deparsing fails
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_deparse(" + "$" + "{" + "1:query" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_deparse_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_deparse_options ( ) : DeparseOptions
+
+
+ Create DeparseOptions for configuring SQL formatting.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_deparse_options()"),
+ boost: 10
+ }, {
+ label: "sql_explain_config",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_explain_config ( bool $analyze = true , bool $verbose = false , bool $costs = true , bool $buffers = true , bool $timing = true , ExplainFormat $format = Flow\\PostgreSql\\QueryBuilder\\Utility\\ExplainFormat::... ) : ExplainConfig
+
+
+ Create an ExplainConfig for customizing EXPLAIN options. @param bool $analyze Whether to actually execute the query (ANALYZE) @param bool $verbose Include verbose output @param bool $costs Include cost estimates (default true) @param bool $buffers Include buffer usage statistics (requires analyze) @param bool $timing Include timing information (requires analyze) @param ExplainFormat $format Output format (JSON recommended for parsing)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_explain_config(" + "$" + "{" + "1:analyze" + "}" + ", " + "$" + "{" + "2:verbose" + "}" + ", " + "$" + "{" + "3:costs" + "}" + ", " + "$" + "{" + "4:buffers" + "}" + ", " + "$" + "{" + "5:timing" + "}" + ", " + "$" + "{" + "6:format" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_explain_modifier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_explain_modifier ( ExplainConfig $config ) : ExplainModifier
+
+
+ Create an ExplainModifier for transforming queries into EXPLAIN queries.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_explain_modifier(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_explain_parse",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_explain_parse ( string $jsonOutput ) : Plan
+
+
+ Parse EXPLAIN JSON output into a Plan object. @param string $jsonOutput The JSON output from EXPLAIN (FORMAT JSON) @return Plan The parsed execution plan
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_explain_parse(" + "$" + "{" + "1:jsonOutput" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_fingerprint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_fingerprint ( string $sql ) : string
+
+
+ Returns a fingerprint of the given SQL query. Literal values are normalized so they won\'t affect the fingerprint.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_fingerprint(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_format",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_format ( string $sql , DeparseOptions $options = null ) : string
+
+
+ Parse and format SQL query with pretty printing. This is a convenience function that parses SQL and returns it formatted. @param string $sql The SQL query to format @param null|DeparseOptions $options Formatting options (defaults to pretty-print enabled) @throws \\RuntimeException if parsing or deparsing fails
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_format(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_keyset_column",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_keyset_column ( string $column , SortOrder $order = Flow\\PostgreSql\\AST\\Transformers\\SortOrder::... ) : KeysetColumn
+
+
+ Create a KeysetColumn for keyset pagination. @param string $column Column name (can include table alias like \"u.id\") @param SortOrder $order Sort order (ASC or DESC)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_keyset_column(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:order" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_normalize",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_normalize ( string $sql ) : string
+
+
+ Normalize SQL query by replacing literal values and named parameters with positional parameters. WHERE id = :id will be changed into WHERE id = $1 WHERE id = 1 will be changed into WHERE id = $1.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_normalize(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_normalize_utility",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_normalize_utility ( string $sql ) : string
+
+
+ Normalize utility SQL statements (DDL like CREATE, ALTER, DROP). This handles DDL statements differently from pg_normalize() which is optimized for DML.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_normalize_utility(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_parse",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_parse ( string $sql ) : ParsedQuery
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_parse(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_parser",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_parser ( ) : Parser
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_parser()"),
+ boost: 10
+ }, {
+ label: "sql_query_columns",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_query_columns ( ParsedQuery $query ) : Columns
+
+
+ Extract columns from a parsed SQL query.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_columns(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_query_depth",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_query_depth ( string $sql ) : int
+
+
+ Get the maximum nesting depth of a SQL query. Example: - \"SELECT * FROM t\" => 1 - \"SELECT * FROM (SELECT * FROM t)\" => 2 - \"SELECT * FROM (SELECT * FROM (SELECT * FROM t))\" => 3
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_depth(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_query_functions",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_query_functions ( ParsedQuery $query ) : Functions
+
+
+ Extract functions from a parsed SQL query.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_functions(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_query_order_by",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_query_order_by ( ParsedQuery $query ) : OrderBy
+
+
+ Extract ORDER BY clauses from a parsed SQL query.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_order_by(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_query_tables",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_query_tables ( ParsedQuery $query ) : Tables
+
+
+ Extract tables from a parsed SQL query.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_tables(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_split",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_split ( string $sql ) : array
+
+
+ Split string with multiple SQL statements into array of individual statements. @return array
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_split(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_summary",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_summary ( string $sql , int $options = 0 , int $truncateLimit = 0 ) : string
+
+
+ Generate a summary of parsed queries in protobuf format. Useful for query monitoring and logging without full AST overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_summary(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ", " + "$" + "{" + "3:truncateLimit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_to_count_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_to_count_query ( string $sql ) : string
+
+
+ Transform a SQL query into a COUNT query for pagination. Wraps the query in: SELECT COUNT(*) FROM (...) AS _count_subq Removes ORDER BY and LIMIT/OFFSET from the inner query. @param string $sql The SQL query to transform @return string The COUNT query
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_count_query(" + "$" + "{" + "1:sql" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_to_explain",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_to_explain ( string $sql , ExplainConfig $config = null ) : string
+
+
+ Transform a SQL query into an EXPLAIN query. Returns the modified SQL with EXPLAIN wrapped around it. Defaults to EXPLAIN ANALYZE with JSON format for easy parsing. @param string $sql The SQL query to explain @param null|ExplainConfig $config EXPLAIN configuration (defaults to forAnalysis()) @return string The EXPLAIN query
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_explain(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_to_keyset_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_to_keyset_query ( string $sql , int $limit , array $columns , array $cursor = null ) : string
+
+
+ Transform a SQL query into a keyset (cursor-based) paginated query. More efficient than OFFSET for large datasets - uses indexed WHERE conditions. Automatically detects existing query parameters and appends keyset placeholders at the end. @param string $sql The SQL query to paginate (must have ORDER BY) @param int $limit Maximum number of rows to return @param list $columns Columns for keyset pagination (must match ORDER BY) @param null|list $cursor Values from last row of previous page (null for first page) @return string The paginated SQL query
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_keyset_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:columns" + "}" + ", " + "$" + "{" + "4:cursor" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_to_limited_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_to_limited_query ( string $sql , int $limit ) : string
+
+
+ Transform a SQL query to limit results to a specific number of rows. @param string $sql The SQL query to limit @param int $limit Maximum number of rows to return @return string The limited SQL query
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_limited_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sql_to_paginated_query",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sql_to_paginated_query ( string $sql , int $limit , int $offset = 0 ) : string
+
+
+ Transform a SQL query into a paginated query with LIMIT and OFFSET. @param string $sql The SQL query to paginate @param int $limit Maximum number of rows to return @param int $offset Number of rows to skip (requires ORDER BY in query) @return string The paginated SQL query
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_paginated_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "star",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ star ( string $table = null ) : Star
+
+
+ Create a SELECT * expression.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\star(" + "$" + "{" + "1:table" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stdout_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stdout_filesystem ( ) : StdOutFilesystem
+
+
+ Write-only filesystem useful when we just want to write the output to stdout. The main use case is for streaming datasets over http.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\stdout_filesystem()"),
+ boost: 10
+ }, {
+ label: "string_agg",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ string_agg ( EntryReference|string $ref , string $separator = ', ' , SortOrder $sort = null ) : StringAggregate
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\string_agg(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:separator" + "}" + ", " + "$" + "{" + "3:sort" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "string_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ string_entry ( string $name , string $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\string_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "string_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ string_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : StringDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\string_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "structure_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ structure_entry ( string $name , array $value , StructureType $type , Metadata $metadata = null ) : Entry
+
+
+ @template T @param ?array $value @param StructureType $type @return Entry>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\structure_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:type" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "structure_ref",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ structure_ref ( string $entry ) : StructureFunctions
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\structure_ref(" + "$" + "{" + "1:entry" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "structure_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ structure_schema ( string $name , StructureType|Type $type , bool $nullable = false , Metadata $metadata = null ) : StructureDefinition
+
+
+ @template T
@param StructureType
|Type> $type @return StructureDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\structure_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "struct_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ struct_entry ( string $name , array $value , StructureType $type , Metadata $metadata = null ) : Entry
+
+
+ @template T @param ?array $value @param StructureType $type @return Entry>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\struct_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:type" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "struct_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ struct_schema ( string $name , StructureType|Type $type , bool $nullable = false , Metadata $metadata = null ) : StructureDefinition
+
+
+ @template T
@param StructureType
|Type> $type @return StructureDefinition @deprecated Use \`structure_schema()\` instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\struct_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "str_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ str_entry ( string $name , string $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\str_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "str_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ str_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : StringDefinition
+
+
+ Alias for \`string_schema\`.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\str_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sub_select",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sub_select ( SelectFinalStep $query ) : Subquery
+
+
+ Create a subquery expression.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sub_select(" + "$" + "{" + "1:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sum",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sum ( EntryReference|string $ref ) : Sum
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\sum(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "superglobal_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ superglobal_carrier ( ) : SuperglobalCarrier
+
+
+ Create a SuperglobalCarrier. Read-only carrier that extracts context from PHP superglobals ($_SERVER, $_GET, $_POST, $_COOKIE).
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\superglobal_carrier()"),
+ boost: 10
+ }, {
+ label: "symfony_request_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ symfony_request_carrier ( Request $request ) : RequestCarrier
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Symfony\\HttpFoundationTelemetry\\DSL\\symfony_request_carrier(" + "$" + "{" + "1:request" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "symfony_response_carrier",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ symfony_response_carrier ( Response $response ) : ResponseCarrier
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Symfony\\HttpFoundationTelemetry\\DSL\\symfony_response_carrier(" + "$" + "{" + "1:response" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ table ( string $name , string $schema = null ) : Table
+
+
+ Create a table reference. Supports dot notation for schema-qualified names: \"public.users\" or explicit schema parameter. Double-quoted identifiers preserve dots: \'\"my.table\"\' creates a single identifier. @param string $name Table name (may include schema as \"schema.table\") @param null|string $schema Schema name (optional, overrides parsed schema)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\table(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "table_func",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ table_func ( FunctionCall $function , bool $withOrdinality = false ) : TableFunction
+
+
+ Create a table function reference. @param FunctionCall $function The table-valued function @param bool $withOrdinality Whether to add WITH ORDINALITY
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\table_func(" + "$" + "{" + "1:function" + "}" + ", " + "$" + "{" + "2:withOrdinality" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "table_schema_to_flow_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ table_schema_to_flow_schema ( Table $table , array $types_map = [] ) : Schema
+
+
+ Converts a Doctrine\\DBAL\\Schema\\Table to a Flow\\ETL\\Schema. @param array>, class-string<\\Doctrine\\DBAL\\Types\\Type>> $types_map @return Schema
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\table_schema_to_flow_schema(" + "$" + "{" + "1:table" + "}" + ", " + "$" + "{" + "2:types_map" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "telemetry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ telemetry ( Resource $resource , TracerProvider $tracerProvider = null , MeterProvider $meterProvider = null , LoggerProvider $loggerProvider = null ) : Telemetry
+
+
+ Create a new Telemetry instance with the given providers. If providers are not specified, void providers (no-op) are used. @param resource $resource The resource describing the entity producing telemetry @param null|TracerProvider $tracerProvider The tracer provider (null for void/disabled) @param null|MeterProvider $meterProvider The meter provider (null for void/disabled) @param null|LoggerProvider $loggerProvider The logger provider (null for void/disabled)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\telemetry(" + "$" + "{" + "1:resource" + "}" + ", " + "$" + "{" + "2:tracerProvider" + "}" + ", " + "$" + "{" + "3:meterProvider" + "}" + ", " + "$" + "{" + "4:loggerProvider" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "telemetry_handler",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ telemetry_handler ( Logger $logger , LogRecordConverter $converter = Flow\\Bridge\\Monolog\\Telemetry\\LogRecordConverter::... , Level $level = Monolog\\Level::... , bool $bubble = true ) : TelemetryHandler
+
+
+ Create a TelemetryHandler for forwarding Monolog logs to Flow Telemetry. @param Logger $logger The Flow Telemetry logger to forward logs to @param LogRecordConverter $converter Converter to transform Monolog LogRecord to Telemetry LogRecord @param Level $level The minimum logging level at which this handler will be triggered @param bool $bubble Whether messages handled by this handler should bubble up to other handlers Example usage: \`\`\`php use Monolog\\Logger as MonologLogger; use function Flow\\Bridge\\Monolog\\Telemetry\\DSL\\telemetry_handler; use function Flow\\Telemetry\\DSL\\telemetry; $telemetry = telemetry(); $logger = $telemetry->logger(\'my-app\'); $monolog = new MonologLogger(\'channel\'); $monolog->pushHandler(telemetry_handler($logger)); $monolog->info(\'User logged in\', [\'user_id\' => 123]); // → Forwarded to Flow Telemetry with INFO severity \`\`\` Example with custom converter: \`\`\`php $converter = log_record_converter( severityMapper: severity_mapper([ Level::Debug->value => Severity::TRACE, ]) ); $monolog->pushHandler(telemetry_handler($logger, $converter)); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Monolog\\Telemetry\\DSL\\telemetry_handler(" + "$" + "{" + "1:logger" + "}" + ", " + "$" + "{" + "2:converter" + "}" + ", " + "$" + "{" + "3:level" + "}" + ", " + "$" + "{" + "4:bubble" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "telemetry_options",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ telemetry_options ( bool $trace_loading = false , bool $trace_transformations = false , bool $trace_cache = false , bool $collect_metrics = false , FilesystemTelemetryOptions $filesystem = null ) : TelemetryOptions
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\telemetry_options(" + "$" + "{" + "1:trace_loading" + "}" + ", " + "$" + "{" + "2:trace_transformations" + "}" + ", " + "$" + "{" + "3:trace_cache" + "}" + ", " + "$" + "{" + "4:collect_metrics" + "}" + ", " + "$" + "{" + "5:filesystem" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "text_search_match",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ text_search_match ( Expression $document , Expression $query ) : OperatorCondition
+
+
+ Create a full-text search match condition (@@). Example: text_search_match(col(\'document\'), raw_expr(\"to_tsquery(\'english\', \'hello & world\')\")) Produces: document @@ to_tsquery(\'english\', \'hello & world\')
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\text_search_match(" + "$" + "{" + "1:document" + "}" + ", " + "$" + "{" + "2:query" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "throw_error_handler",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ throw_error_handler ( ) : ThrowError
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\throw_error_handler()"),
+ boost: 10
+ }, {
+ label: "time_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ time_entry ( string $name , DateInterval|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\DateInterval>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\time_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "time_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ time_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : TimeDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\time_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_array ( array $array ) : ArrayLoader
+
+
+ Convert rows to an array and store them in passed array variable.
@param array
$array @param-out array> $array
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_array(" + "$" + "{" + "1:array" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_avro",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_avro ( Path|string $path , Schema $schema = null ) : AvroLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\Adapter\\Avro\\to_avro(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_branch",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_branch ( ScalarFunction $condition , Loader $loader ) : BranchingLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_branch(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:loader" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_callable",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_callable ( callable $callable ) : CallbackLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_callable(" + "$" + "{" + "1:callable" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_chartjs",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_chartjs ( Chart $type ) : ChartJSLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\to_chartjs(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_chartjs_file",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_chartjs_file ( Chart $type , Path|string|null $output = null , Path|string|null $template = null ) : ChartJSLoader
+
+
+ @param Chart $type @param null|Path|string $output - @deprecated use $loader->withOutputPath() instead @param null|Path|string $template - @deprecated use $loader->withTemplate() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\to_chartjs_file(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:output" + "}" + ", " + "$" + "{" + "3:template" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_chartjs_var",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_chartjs_var ( Chart $type , array $output ) : ChartJSLoader
+
+
+ @param Chart $type
@param array
$output - @deprecated use $loader->withOutputVar() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\ChartJS\\to_chartjs_var(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:output" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_csv",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_csv ( Path|string $uri , bool $with_header = true , string $separator = ',' , string $enclosure = '\\"' , string $escape = '\\\\' , string $new_line_separator = '\\n' , string $datetime_format = 'Y-m-d\\\\TH:i:sP' ) : CSVLoader
+
+
+ @param Path|string $uri @param bool $with_header - @deprecated use $loader->withHeader() instead @param string $separator - @deprecated use $loader->withSeparator() instead @param string $enclosure - @deprecated use $loader->withEnclosure() instead @param string $escape - @deprecated use $loader->withEscape() instead @param string $new_line_separator - @deprecated use $loader->withNewLineSeparator() instead @param string $datetime_format - @deprecated use $loader->withDateTimeFormat() instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\CSV\\to_csv(" + "$" + "{" + "1:uri" + "}" + ", " + "$" + "{" + "2:with_header" + "}" + ", " + "$" + "{" + "3:separator" + "}" + ", " + "$" + "{" + "4:enclosure" + "}" + ", " + "$" + "{" + "5:escape" + "}" + ", " + "$" + "{" + "6:new_line_separator" + "}" + ", " + "$" + "{" + "7:datetime_format" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_date ( mixed $ref , ScalarFunction|string $format = 'Y-m-d' , ScalarFunction|DateTimeZone $timeZone = DateTimeZone::... ) : ToDate
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_date(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:format" + "}" + ", " + "$" + "{" + "3:timeZone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_date_time",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_date_time ( mixed $ref , ScalarFunction|string $format = 'Y-m-d H:i:s' , ScalarFunction|DateTimeZone $timeZone = DateTimeZone::... ) : ToDateTime
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_date_time(" + "$" + "{" + "1:ref" + "}" + ", " + "$" + "{" + "2:format" + "}" + ", " + "$" + "{" + "3:timeZone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_dbal_schema_table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_dbal_schema_table ( Schema $schema , string $table_name , array $table_options = [] , array $types_map = [] ) : Table
+
+
+ Converts a Flow\\ETL\\Schema to a Doctrine\\DBAL\\Schema\\Table.
@param Schema $schema
@param array
$table_options @param array>, class-string<\\Doctrine\\DBAL\\Types\\Type>> $types_map
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\to_dbal_schema_table(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:table_name" + "}" + ", " + "$" + "{" + "3:table_options" + "}" + ", " + "$" + "{" + "4:types_map" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_dbal_table_delete",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_dbal_table_delete ( Connection|array $connection , string $table ) : DbalLoader
+
+
+ Delete rows from database table based on the provided data. In order to control the size of the single request, use DataFrame::chunkSize() method just before calling DataFrame::load(). @param array|Connection $connection @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\to_dbal_table_delete(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:table" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_dbal_table_insert",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_dbal_table_insert ( Connection|array $connection , string $table , InsertOptions $options = null ) : DbalLoader
+
+
+ Insert new rows into a database table. Insert can also be used as an upsert with the help of InsertOptions. InsertOptions are platform specific, so please choose the right one for your database. - MySQLInsertOptions - PostgreSQLInsertOptions - SqliteInsertOptions In order to control the size of the single insert, use DataFrame::chunkSize() method just before calling DataFrame::load(). @param array|Connection $connection @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\to_dbal_table_insert(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:table" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_dbal_table_update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_dbal_table_update ( Connection|array $connection , string $table , UpdateOptions $options = null ) : DbalLoader
+
+
+ Update existing rows in database. In order to control the size of the single request, use DataFrame::chunkSize() method just before calling DataFrame::load(). @param array|Connection $connection @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\to_dbal_table_update(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:table" + "}" + ", " + "$" + "{" + "3:options" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_dbal_transaction",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_dbal_transaction ( Connection|array $connection , Loader $loaders ) : TransactionalDbalLoader
+
+
+ Execute multiple loaders within a database transaction. Each batch of rows will be processed in its own transaction. If any loader fails, the entire batch will be rolled back. @param array|Connection $connection @param Loader ...$loaders - Loaders to execute within the transaction @throws InvalidArgumentException
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\to_dbal_transaction(" + "$" + "{" + "1:connection" + "}" + ", " + "$" + "{" + "2:loaders" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_entry ( string $name , mixed $data , EntryFactory $entryFactory ) : Entry
+
+
+ @param array $data @return Entry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:entryFactory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_es_bulk_index",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_es_bulk_index ( array $config , string $index , IdFactory $id_factory , array $parameters = [] ) : ElasticsearchLoader
+
+
+ https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-bulk.html. In order to control the size of the single request, use DataFrame::chunkSize() method just before calling DataFrame::load(). @param array{ hosts?: array, connectionParams?: array, retries?: int, sniffOnStart?: bool, sslCert?: array, sslKey?: array, sslVerification?: bool|string, elasticMetaHeader?: bool, includePortInHostHeader?: bool } $config @param string $index @param IdFactory $id_factory @param array $parameters - https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-bulk.html - @deprecated use withParameters method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\to_es_bulk_index(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:index" + "}" + ", " + "$" + "{" + "3:id_factory" + "}" + ", " + "$" + "{" + "4:parameters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_es_bulk_update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_es_bulk_update ( array $config , string $index , IdFactory $id_factory , array $parameters = [] ) : ElasticsearchLoader
+
+
+ https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-bulk.html. In order to control the size of the single request, use DataFrame::chunkSize() method just before calling DataFrame::load(). @param array{ hosts?: array, connectionParams?: array, retries?: int, sniffOnStart?: bool, sslCert?: array, sslKey?: array, sslVerification?: bool|string, elasticMetaHeader?: bool, includePortInHostHeader?: bool } $config @param string $index @param IdFactory $id_factory @param array $parameters - https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-bulk.html - @deprecated use withParameters method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Elasticsearch\\to_es_bulk_update(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:index" + "}" + ", " + "$" + "{" + "3:id_factory" + "}" + ", " + "$" + "{" + "4:parameters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_excel",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_excel ( Path|string $path ) : ExcelLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Excel\\DSL\\to_excel(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_json ( Path|string $path , int $flags = 4194304 , string $date_time_format = 'Y-m-d\\\\TH:i:sP' , bool $put_rows_in_new_lines = false ) : JsonLoader
+
+
+ @param Path|string $path @param int $flags - PHP JSON Flags - @deprecate use withFlags method instead @param string $date_time_format - format for DateTimeInterface::format() - @deprecate use withDateTimeFormat method instead @param bool $put_rows_in_new_lines - if you want to put each row in a new line - @deprecate use withRowsInNewLines method instead @return JsonLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\JSON\\to_json(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:date_time_format" + "}" + ", " + "$" + "{" + "4:put_rows_in_new_lines" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_json_lines",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_json_lines ( Path|string $path ) : JsonLinesLoader
+
+
+ Used to write to a JSON lines https://jsonlines.org/ formatted file. @param Path|string $path @return JsonLinesLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\JSON\\to_json_lines(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_meilisearch_bulk_index",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_meilisearch_bulk_index ( array $config , string $index ) : Loader
+
+
+ @param array{url: string, apiKey: string, httpClient: ?ClientInterface} $config
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Meilisearch\\to_meilisearch_bulk_index(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:index" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_meilisearch_bulk_update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_meilisearch_bulk_update ( array $config , string $index ) : Loader
+
+
+ @param array{url: string, apiKey: string, httpClient: ?ClientInterface} $config
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Meilisearch\\to_meilisearch_bulk_update(" + "$" + "{" + "1:config" + "}" + ", " + "$" + "{" + "2:index" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_memory",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_memory ( Memory $memory ) : MemoryLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_memory(" + "$" + "{" + "1:memory" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_output",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_output ( int|bool $truncate = 20 , Output $output = Flow\\ETL\\Loader\\StreamLoader\\Output::... , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... , SchemaFormatter $schemaFormatter = Flow\\ETL\\Row\\Formatter\\ASCIISchemaFormatter::... ) : StreamLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_output(" + "$" + "{" + "1:truncate" + "}" + ", " + "$" + "{" + "2:output" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ", " + "$" + "{" + "4:schemaFormatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_parquet",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_parquet ( Path|string $path , Options $options = null , Compressions $compressions = Flow\\Parquet\\ParquetFile\\Compressions::... , Schema $schema = null ) : ParquetLoader
+
+
+ @param Path|string $path @param null|Options $options - @deprecated use \`withOptions\` method instead @param Compressions $compressions - @deprecated use \`withCompressions\` method instead @param null|Schema $schema - @deprecated use \`withSchema\` method instead
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\to_parquet(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ", " + "$" + "{" + "3:compressions" + "}" + ", " + "$" + "{" + "4:schema" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_stderr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_stderr ( int|bool $truncate = 20 , Output $output = Flow\\ETL\\Loader\\StreamLoader\\Output::... , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... , SchemaFormatter $schemaFormatter = Flow\\ETL\\Row\\Formatter\\ASCIISchemaFormatter::... ) : StreamLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_stderr(" + "$" + "{" + "1:truncate" + "}" + ", " + "$" + "{" + "2:output" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ", " + "$" + "{" + "4:schemaFormatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_stdout",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_stdout ( int|bool $truncate = 20 , Output $output = Flow\\ETL\\Loader\\StreamLoader\\Output::... , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... , SchemaFormatter $schemaFormatter = Flow\\ETL\\Row\\Formatter\\ASCIISchemaFormatter::... ) : StreamLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_stdout(" + "$" + "{" + "1:truncate" + "}" + ", " + "$" + "{" + "2:output" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ", " + "$" + "{" + "4:schemaFormatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_stream",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_stream ( string $uri , int|bool $truncate = 20 , Output $output = Flow\\ETL\\Loader\\StreamLoader\\Output::... , string $mode = 'w' , Formatter $formatter = Flow\\ETL\\Formatter\\AsciiTableFormatter::... , SchemaFormatter $schemaFormatter = Flow\\ETL\\Row\\Formatter\\ASCIISchemaFormatter::... ) : StreamLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_stream(" + "$" + "{" + "1:uri" + "}" + ", " + "$" + "{" + "2:truncate" + "}" + ", " + "$" + "{" + "3:output" + "}" + ", " + "$" + "{" + "4:mode" + "}" + ", " + "$" + "{" + "5:formatter" + "}" + ", " + "$" + "{" + "6:schemaFormatter" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_text",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_text ( Path|string $path , string $new_line_separator = '\\n' ) : Loader
+
+
+ @param Path|string $path @param string $new_line_separator - default PHP_EOL - @deprecated use withNewLineSeparator method instead @return Loader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\Text\\to_text(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:new_line_separator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_timezone",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_timezone ( ScalarFunction|DateTimeInterface $value , ScalarFunction|DateTimeZone|string $timeZone ) : ToTimeZone
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_timezone(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:timeZone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_transformation",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_transformation ( Transformer|Transformation $transformer , Loader $loader ) : TransformerLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\to_transformation(" + "$" + "{" + "1:transformer" + "}" + ", " + "$" + "{" + "2:loader" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "to_xml",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ to_xml ( Path|string $path , string $root_element_name = 'rows' , string $row_element_name = 'row' , string $attribute_prefix = '_' , string $date_time_format = 'Y-m-d\\\\TH:i:s.uP' , XMLWriter $xml_writer = Flow\\ETL\\Adapter\\XML\\XMLWriter\\DOMDocumentWriter::... ) : XMLLoader
+
+
+ @param Path|string $path @param string $root_element_name - @deprecated use \`withRootElementName()\` method instead @param string $row_element_name - @deprecated use \`withRowElementName()\` method instead @param string $attribute_prefix - @deprecated use \`withAttributePrefix()\` method instead @param string $date_time_format - @deprecated use \`withDateTimeFormat()\` method instead @param XMLWriter $xml_writer
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\Adapter\\XML\\to_xml(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:root_element_name" + "}" + ", " + "$" + "{" + "3:row_element_name" + "}" + ", " + "$" + "{" + "4:attribute_prefix" + "}" + ", " + "$" + "{" + "5:date_time_format" + "}" + ", " + "$" + "{" + "6:xml_writer" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "traceable_filesystem",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ traceable_filesystem ( Filesystem $filesystem , FilesystemTelemetryConfig $telemetryConfig ) : TraceableFilesystem
+
+
+ Wrap a filesystem with telemetry tracing support. All filesystem and stream operations will be traced according to the configuration.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Filesystem\\DSL\\traceable_filesystem(" + "$" + "{" + "1:filesystem" + "}" + ", " + "$" + "{" + "2:telemetryConfig" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "traceable_postgresql_client",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ traceable_postgresql_client ( Client $client , PostgreSqlTelemetryConfig $telemetryConfig ) : TraceableClient
+
+
+ Wrap a PostgreSQL client with telemetry instrumentation. Returns a decorator that adds spans, metrics, and logs to all query and transaction operations following OpenTelemetry conventions. @param Client\\Client $client The PostgreSQL client to instrument @param PostgreSqlTelemetryConfig $telemetryConfig Telemetry configuration @example $client = pgsql_client(pgsql_connection(\'host=localhost dbname=mydb\')); $traceableClient = traceable_postgresql_client( $client, postgresql_telemetry_config( telemetry(resource([\'service.name\' => \'my-app\'])), new SystemClock(), postgresql_telemetry_options( traceQueries: true, traceTransactions: true, collectMetrics: true, logQueries: true, maxQueryLength: 500, ), ), ); // All operations now traced $traceableClient->transaction(function (Client $client) { $user = $client->fetchOne(\'SELECT * FROM users WHERE id = $1\', [123]); $client->execute(\'UPDATE users SET last_login = NOW() WHERE id = $1\', [123]); });
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\traceable_postgresql_client(" + "$" + "{" + "1:client" + "}" + ", " + "$" + "{" + "2:telemetryConfig" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "tracer_provider",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ tracer_provider ( SpanProcessor $processor , ClockInterface $clock , ContextStorage $contextStorage , Sampler $sampler = Flow\\Telemetry\\Tracer\\Sampler\\AlwaysOnSampler::... , SpanLimits $limits = Flow\\Telemetry\\Tracer\\SpanLimits::... ) : TracerProvider
+
+
+ Create a TracerProvider. Creates a provider that uses a SpanProcessor for processing spans. For void/disabled tracing, pass void_processor(). For memory-based testing, pass memory_processor() with exporters. @param SpanProcessor $processor The processor for spans @param ClockInterface $clock The clock for timestamps @param ContextStorage $contextStorage Storage for context propagation @param Sampler $sampler Sampling strategy for spans @param SpanLimits $limits Limits for span attributes, events, and links
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\tracer_provider(" + "$" + "{" + "1:processor" + "}" + ", " + "$" + "{" + "2:clock" + "}" + ", " + "$" + "{" + "3:contextStorage" + "}" + ", " + "$" + "{" + "4:sampler" + "}" + ", " + "$" + "{" + "5:limits" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "trace_based_exemplar_filter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ trace_based_exemplar_filter ( ) : TraceBasedExemplarFilter
+
+
+ Create a TraceBasedExemplarFilter. Records exemplars only when the span is sampled (has SAMPLED trace flag). This is the default filter, balancing exemplar collection with performance.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\trace_based_exemplar_filter()"),
+ boost: 10
+ }, {
+ label: "trace_id",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ trace_id ( string $hex = null ) : TraceId
+
+
+ Create a TraceId. If a hex string is provided, creates a TraceId from it. Otherwise, generates a new random TraceId. @param null|string $hex Optional 32-character hexadecimal string @throws \\InvalidArgumentException if the hex string is invalid
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\trace_id(" + "$" + "{" + "1:hex" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "transaction_snapshot",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ transaction_snapshot ( string $snapshotId ) : SetTransactionFinalStep
+
+
+ Create a SET TRANSACTION SNAPSHOT builder. Example: transaction_snapshot(\'00000003-0000001A-1\') Produces: SET TRANSACTION SNAPSHOT \'00000003-0000001A-1\'
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\transaction_snapshot(" + "$" + "{" + "1:snapshotId" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "truncate_table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ truncate_table ( string $tables ) : TruncateFinalStep
+
+
+ Create a TRUNCATE TABLE builder. @param string ...$tables Table names to truncate
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\truncate_table(" + "$" + "{" + "1:tables" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "typed",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ typed ( mixed $value , PostgreSqlType $targetType ) : TypedValue
+
+
+ Wrap a value with explicit PostgreSQL type information for parameter binding. Use when auto-detection isn\'t sufficient or when you need to specify the exact PostgreSQL type (since one PHP type can map to multiple PostgreSQL types): - int could be INT2, INT4, or INT8 - string could be TEXT, VARCHAR, or CHAR - array must always use typed() since auto-detection cannot determine element type - DateTimeInterface could be TIMESTAMP or TIMESTAMPTZ - Json could be JSON or JSONB @param mixed $value The value to bind @param PostgreSqlType $targetType The PostgreSQL type to convert the value to @example $client->fetch( \'SELECT * FROM users WHERE id = $1 AND tags = $2\', [ typed(\'550e8400-e29b-41d4-a716-446655440000\', PostgreSqlType::UUID), typed([\'tag1\', \'tag2\'], PostgreSqlType::TEXT_ARRAY), ] );
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\typed(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:targetType" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "types",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ types ( Type $types ) : Types
+
+
+ @template T @param Type ...$types @return Types
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\types(" + "$" + "{" + "1:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_array ( ) : Type
+
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_array()"),
+ boost: 10
+ }, {
+ label: "type_attr",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_attr ( string $name , DataType $type ) : TypeAttribute
+
+
+ Creates a type attribute for composite types. Example: type_attr(\'name\', data_type_text()) Produces: name text Example: type_attr(\'description\', data_type_text())->collate(\'en_US\') Produces: description text COLLATE \"en_US\" @param string $name The attribute name @param DataType $type The attribute type @return TypeAttribute Type attribute value object
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\type_attr(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_boolean",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_boolean ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_boolean()"),
+ boost: 10
+ }, {
+ label: "type_callable",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_callable ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_callable()"),
+ boost: 10
+ }, {
+ label: "type_class_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_class_string ( string $class = null ) : Type
+
+
+ @template T of object @param null|class-string $class @return ($class is null ? Type : Type>)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_class_string(" + "$" + "{" + "1:class" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_date ( ) : Type
+
+
+ @deprecated please use \\Flow\\Types\\DSL\\type_date() : DateType @return Type<\\DateTimeInterface>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\type_date()"),
+ boost: 10
+ }, {
+ label: "type_date",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_date ( ) : Type
+
+
+ @return Type<\\DateTimeInterface>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_date()"),
+ boost: 10
+ }, {
+ label: "type_datetime",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_datetime ( ) : Type
+
+
+ @return Type<\\DateTimeInterface>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_datetime()"),
+ boost: 10
+ }, {
+ label: "type_enum",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_enum ( string $class ) : Type
+
+
+ @template T of UnitEnum @param class-string $class @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_enum(" + "$" + "{" + "1:class" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_equals",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_equals ( Type $left , Type $right ) : bool
+
+
+ @param Type $left @param Type $right
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_equals(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_float",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_float ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_float()"),
+ boost: 10
+ }, {
+ label: "type_from_array",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_from_array ( array $data ) : Type
+
+
+ @param array $data @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_from_array(" + "$" + "{" + "1:data" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_html",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_html ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_html()"),
+ boost: 10
+ }, {
+ label: "type_html_element",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_html_element ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_html_element()"),
+ boost: 10
+ }, {
+ label: "type_instance_of",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_instance_of ( string $class ) : Type
+
+
+ @template T of object @param class-string $class @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_instance_of(" + "$" + "{" + "1:class" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_int",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_int ( ) : Type
+
+
+ @deprecated please use \\Flow\\Types\\DSL\\type_integer() : IntegerType @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\type_int()"),
+ boost: 10
+ }, {
+ label: "type_integer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_integer ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_integer()"),
+ boost: 10
+ }, {
+ label: "type_intersection",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_intersection ( Type $first , Type $second , Type $types ) : Type
+
+
+ @template T @param Type $first @param Type $second @param Type ...$types @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_intersection(" + "$" + "{" + "1:first" + "}" + ", " + "$" + "{" + "2:second" + "}" + ", " + "$" + "{" + "3:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_is",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_is ( Type $type , string $typeClass ) : bool
+
+
+ @template T @param Type $type @param class-string> $typeClass
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_is(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:typeClass" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_is_any",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_is_any ( Type $type , string $typeClass , string $typeClasses ) : bool
+
+
+ @template T @param Type $type @param class-string> $typeClass @param class-string> ...$typeClasses
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_is_any(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:typeClass" + "}" + ", " + "$" + "{" + "3:typeClasses" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_is_nullable",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_is_nullable ( Type $type ) : bool
+
+
+ @template T @param Type $type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_is_nullable(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_json",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_json ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_json()"),
+ boost: 10
+ }, {
+ label: "type_list",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_list ( Type $element ) : ListType
+
+
+ @template T @param Type $element @return ListType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_list(" + "$" + "{" + "1:element" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_literal",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_literal ( string|int|float|bool $value ) : LiteralType
+
+
+ @template T of bool|float|int|string @param T $value @return LiteralType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_literal(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_map",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_map ( Type $key_type , Type $value_type ) : MapType
+
+
+ @template TKey of array-key @template TValue @param Type $key_type @param Type $value_type @return MapType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_map(" + "$" + "{" + "1:key_type" + "}" + ", " + "$" + "{" + "2:value_type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_mixed",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_mixed ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_mixed()"),
+ boost: 10
+ }, {
+ label: "type_non_empty_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_non_empty_string ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_non_empty_string()"),
+ boost: 10
+ }, {
+ label: "type_null",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_null ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_null()"),
+ boost: 10
+ }, {
+ label: "type_numeric_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_numeric_string ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_numeric_string()"),
+ boost: 10
+ }, {
+ label: "type_object",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_object ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_object()"),
+ boost: 10
+ }, {
+ label: "type_optional",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_optional ( Type $type ) : Type
+
+
+ @template T @param Type $type @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_optional(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_positive_integer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_positive_integer ( ) : Type
+
+
+ @return Type>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_positive_integer()"),
+ boost: 10
+ }, {
+ label: "type_resource",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_resource ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_resource()"),
+ boost: 10
+ }, {
+ label: "type_scalar",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_scalar ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_scalar()"),
+ boost: 10
+ }, {
+ label: "type_string",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_string ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_string()"),
+ boost: 10
+ }, {
+ label: "type_structure",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_structure ( array $elements = [] , array $optional_elements = [] , bool $allow_extra = false ) : StructureType
+
+
+ @template T @param array> $elements @param array> $optional_elements @return StructureType
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_structure(" + "$" + "{" + "1:elements" + "}" + ", " + "$" + "{" + "2:optional_elements" + "}" + ", " + "$" + "{" + "3:allow_extra" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_time",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_time ( ) : Type
+
+
+ @return Type<\\DateInterval>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_time()"),
+ boost: 10
+ }, {
+ label: "type_time_zone",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_time_zone ( ) : Type
+
+
+ @return Type<\\DateTimeZone>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_time_zone()"),
+ boost: 10
+ }, {
+ label: "type_union",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_union ( Type $first , Type $second , Type $types ) : Type
+
+
+ @template T @template T @template T @param Type $first @param Type $second @param Type ...$types @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_union(" + "$" + "{" + "1:first" + "}" + ", " + "$" + "{" + "2:second" + "}" + ", " + "$" + "{" + "3:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "type_uuid",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_uuid ( ) : Type
+
+
+ @return Type
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_uuid()"),
+ boost: 10
+ }, {
+ label: "type_xml",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_xml ( ) : Type
+
+
+ @return Type<\\DOMDocument>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_xml()"),
+ boost: 10
+ }, {
+ label: "type_xml_element",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dtype",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ type_xml_element ( ) : Type
+
+
+ @return Type<\\DOMElement>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Types\\DSL\\type_xml_element()"),
+ boost: 10
+ }, {
+ label: "ulid",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ulid ( ScalarFunction|string|null $value = null ) : Ulid
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\ulid(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "unique_constraint",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ unique_constraint ( string $columns ) : UniqueConstraint
+
+
+ Create a UNIQUE constraint. @param string ...$columns Columns that must be unique together
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\unique_constraint(" + "$" + "{" + "1:columns" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "update",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ update ( ) : UpdateTableStep
+
+
+ Create a new UPDATE query builder.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\update()"),
+ boost: 10
+ }, {
+ label: "upper",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ upper ( ScalarFunction|string $value ) : ToUpper
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\upper(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "uuid_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ uuid_entry ( string $name , Uuid|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\Flow\\Types\\Value\\Uuid>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\uuid_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "uuid_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ uuid_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : UuidDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\uuid_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "uuid_v4",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ uuid_v4 ( ) : Uuid
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\uuid_v4()"),
+ boost: 10
+ }, {
+ label: "uuid_v7",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ uuid_v7 ( ScalarFunction|DateTimeInterface|null $value = null ) : Uuid
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\uuid_v7(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "vacuum",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ vacuum ( ) : VacuumFinalStep
+
+
+ Create a VACUUM builder. Example: vacuum()->table(\'users\') Produces: VACUUM users
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\vacuum()"),
+ boost: 10
+ }, {
+ label: "values_table",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ values_table ( RowExpression $rows ) : ValuesTable
+
+
+ Create a VALUES clause as a table reference. Usage: select()->from( values_table( row_expr([literal(1), literal(\'Alice\')]), row_expr([literal(2), literal(\'Bob\')]) )->as(\'t\', [\'id\', \'name\']) ) Generates: SELECT * FROM (VALUES (1, \'Alice\'), (2, \'Bob\')) AS t(id, name)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\values_table(" + "$" + "{" + "1:rows" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "value_normalizer",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ value_normalizer ( ) : ValueNormalizer
+
+
+ Create a ValueNormalizer for converting arbitrary PHP values to Telemetry attribute types. The normalizer handles: - null → \'null\' string - scalars (string, int, float, bool) → unchanged - DateTimeInterface → unchanged - Throwable → unchanged - arrays → recursively normalized - objects with __toString() → string cast - objects without __toString() → class name - other types → get_debug_type() result Example usage: \`\`\`php $normalizer = value_normalizer(); $normalized = $normalizer->normalize($value); \`\`\`
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Bridge\\Monolog\\Telemetry\\DSL\\value_normalizer()"),
+ boost: 10
+ }, {
+ label: "void_log_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_log_exporter ( ) : VoidLogExporter
+
+
+ Create a VoidLogExporter. No-op log exporter that discards all data. Use this when telemetry export is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_log_exporter()"),
+ boost: 10
+ }, {
+ label: "void_log_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_log_processor ( ) : VoidLogProcessor
+
+
+ Create a VoidLogProcessor. No-op log processor that discards all data. Use this when logging is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_log_processor()"),
+ boost: 10
+ }, {
+ label: "void_metric_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_metric_exporter ( ) : VoidMetricExporter
+
+
+ Create a VoidMetricExporter. No-op metric exporter that discards all data. Use this when telemetry export is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_metric_exporter()"),
+ boost: 10
+ }, {
+ label: "void_metric_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_metric_processor ( ) : VoidMetricProcessor
+
+
+ Create a VoidMetricProcessor. No-op metric processor that discards all data. Use this when metrics collection is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_metric_processor()"),
+ boost: 10
+ }, {
+ label: "void_span_exporter",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_span_exporter ( ) : VoidSpanExporter
+
+
+ Create a VoidSpanExporter. No-op span exporter that discards all data. Use this when telemetry export is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_span_exporter()"),
+ boost: 10
+ }, {
+ label: "void_span_processor",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ void_span_processor ( ) : VoidSpanProcessor
+
+
+ Create a VoidSpanProcessor. No-op span processor that discards all data. Use this when tracing is disabled to minimize overhead.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\void_span_processor()"),
+ boost: 10
+ }, {
+ label: "w3c_baggage",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ w3c_baggage ( ) : W3CBaggage
+
+
+ Create a W3CBaggage propagator. Implements W3C Baggage specification for propagating application-specific key-value pairs using the baggage header.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\w3c_baggage()"),
+ boost: 10
+ }, {
+ label: "w3c_trace_context",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ w3c_trace_context ( ) : W3CTraceContext
+
+
+ Create a W3CTraceContext propagator. Implements W3C Trace Context specification for propagating trace context using traceparent and tracestate headers.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\Telemetry\\DSL\\w3c_trace_context()"),
+ boost: 10
+ }, {
+ label: "when",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ when ( mixed $condition , mixed $then , mixed $else = null ) : When
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\when(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:then" + "}" + ", " + "$" + "{" + "3:else" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "when",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ when ( Expression $condition , Expression $result ) : WhenClause
+
+
+ Create a WHEN clause for CASE expression.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\when(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:result" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "window",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ window ( ) : Window
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\window()"),
+ boost: 10
+ }, {
+ label: "window_def",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ window_def ( string $name , array $partitionBy = [] , array $orderBy = [] , WindowFrame $frame = null ) : WindowDefinition
+
+
+ Create a window definition for WINDOW clause. @param string $name Window name @param list $partitionBy PARTITION BY expressions @param list $orderBy ORDER BY items @param null|WindowFrame $frame Window frame specification
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\window_def(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:partitionBy" + "}" + ", " + "$" + "{" + "3:orderBy" + "}" + ", " + "$" + "{" + "4:frame" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "window_frame",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ window_frame ( FrameMode $mode , FrameBound $start , FrameBound $end = null , FrameExclusion $exclusion = Flow\\PostgreSql\\QueryBuilder\\Clause\\FrameExclusion::... ) : WindowFrame
+
+
+ Create a window frame specification.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\window_frame(" + "$" + "{" + "1:mode" + "}" + ", " + "$" + "{" + "2:start" + "}" + ", " + "$" + "{" + "3:end" + "}" + ", " + "$" + "{" + "4:exclusion" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "window_func",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ window_func ( string $name , array $args = [] , array $partitionBy = [] , array $orderBy = [] ) : WindowFunction
+
+
+ Create a window function. @param string $name Function name @param list $args Function arguments @param list $partitionBy PARTITION BY expressions @param list $orderBy ORDER BY items
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\window_func(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:args" + "}" + ", " + "$" + "{" + "3:partitionBy" + "}" + ", " + "$" + "{" + "4:orderBy" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "with",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ with ( CTE $ctes ) : WithBuilder
+
+
+ Create a WITH clause builder for CTEs. Example: with(cte(\'users\', $subquery))->select(star())->from(table(\'users\')) Example: with(cte(\'a\', $q1), cte(\'b\', $q2))->recursive()->select(...)->from(table(\'a\'))
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\with(" + "$" + "{" + "1:ctes" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "with_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ with_entry ( string $name , ScalarFunction $function ) : WithEntry
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\with_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "write_with_retries",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dloaders",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ write_with_retries ( Loader $loader , RetryStrategy $retry_strategy = Flow\\ETL\\Retry\\RetryStrategy\\AnyThrowable::... , DelayFactory $delay_factory = Flow\\ETL\\Retry\\DelayFactory\\Fixed\\FixedMilliseconds::... , Sleep $sleep = Flow\\ETL\\Time\\SystemSleep::... ) : RetryLoader
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\write_with_retries(" + "$" + "{" + "1:loader" + "}" + ", " + "$" + "{" + "2:retry_strategy" + "}" + ", " + "$" + "{" + "3:delay_factory" + "}" + ", " + "$" + "{" + "4:sleep" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "xml_element_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ xml_element_entry ( string $name , DOMElement|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\DOMElement>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\xml_element_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "xml_element_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ xml_element_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : XMLElementDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\xml_element_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "xml_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ xml_entry ( string $name , DOMDocument|string|null $value , Metadata $metadata = null ) : Entry
+
+
+ @return Entry\\DOMDocument>
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\xml_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "xml_schema",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dschema",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ xml_schema ( string $name , bool $nullable = false , Metadata $metadata = null ) : XMLDefinition
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\ETL\\DSL\\xml_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ boost: 10
+ } ]
+
+/**
+ * DSL function completion source for CodeMirror
+ * @param {CompletionContext} context
+ * @returns {CompletionResult|null}
+ */
+export function dslCompletions(context) {
+ // Get text before cursor to check context
+ const maxLookback = 100
+ const docText = context.state.doc.toString()
+ const startPos = Math.max(0, context.pos - maxLookback)
+ const textBefore = docText.slice(startPos, context.pos)
+
+ // Don't show DSL functions after -> (method chaining context)
+ // DSL functions are standalone, not methods
+ if (new RegExp('->\\w*$').test(textBefore)) {
+ return null
+ }
+
+ // Match word being typed
+ const word = context.matchBefore(/\w+/)
+
+ // If no word and not explicit, don't show completions
+ if (!word && !context.explicit) {
+ return null
+ }
+
+ // Filter functions based on what's being typed
+ const prefix = word ? word.text.toLowerCase() : ''
+ const options = dslFunctions.filter(func =>
+ !prefix || func.label.toLowerCase().startsWith(prefix)
+ )
+
+ return {
+ from: word ? word.from : context.pos,
+ options: options,
+ validFor: new RegExp('^\\w*$') // Reuse while typing word characters
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/flow.js b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/flow.js
new file mode 100644
index 0000000000..1c8793bb3b
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/flow.js
@@ -0,0 +1,188 @@
+/**
+ * CodeMirror Completer for Flow PHP Flow Methods
+ *
+ * Flow methods: 5
+ * Flow-returning functions: 2
+ *
+ * This completer triggers after Flow-returning functions: df()->, data_frame()->
+ */
+
+import { CompletionContext, snippet } from "@codemirror/autocomplete"
+
+// Map of Flow-returning functions from dsl.json (df, data_frame)
+const flowFunctions = [
+ "df", "data_frame"]
+
+// Flow methods
+const flowMethods = [
+ {
+ label: "setUp",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Flow",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ setUp ( ConfigBuilder|Config $config ) : self
+
+ `
+ return div
+ },
+ apply: snippet("setUp(" + "$" + "{" + "1:config" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "extract",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Flow",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ extract ( Extractor $extractor ) : DataFrame
+
+ `
+ return div
+ },
+ apply: snippet("extract(" + "$" + "{" + "1:extractor" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "from",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Flow",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ from ( Extractor $extractor ) : DataFrame
+
+ `
+ return div
+ },
+ apply: snippet("from(" + "$" + "{" + "1:extractor" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "process",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Flow",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ process ( Rows $rows ) : DataFrame
+
+ `
+ return div
+ },
+ apply: snippet("process(" + "$" + "{" + "1:rows" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "read",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Flow",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ read ( Extractor $extractor ) : DataFrame
+
+
+ Alias for Flow::extract function.
+
+ `
+ return div
+ },
+ apply: snippet("read(" + "$" + "{" + "1:extractor" + "}" + ")"),
+ boost: 10
+ } ]
+
+/**
+ * Flow method completion source for CodeMirror
+ * @param {CompletionContext} context
+ * @returns {CompletionResult|null}
+ */
+export function flowCompletions(context) {
+ // Get text before cursor (potentially across multiple lines)
+ // Look back up to 2000 characters to find the pattern
+ const maxLookback = 2000
+ const docText = context.state.doc.toString()
+ const startPos = Math.max(0, context.pos - maxLookback)
+ const textBefore = docText.slice(startPos, context.pos)
+
+ // Check if we're directly after -> (method chaining context)
+ if (!new RegExp('->\\w*$').test(textBefore)) {
+ return null
+ }
+
+ // Check if we're after a Flow-returning function: df( or data_frame(
+ // Find all matching functions and check if any are at top level with ->
+ const flowFuncPattern = new RegExp('\\b(' + flowFunctions.join('|') + ')\\s*\\(', 'g')
+ let matches = []
+ let match
+
+ while ((match = flowFuncPattern.exec(textBefore)) !== null) {
+ matches.push({ name: match[1], index: match.index, endOfName: match.index + match[0].length })
+ }
+
+ // Walk backwards from cursor tracking parenthesis depth
+ let depth = 0
+ let i = textBefore.length - 1
+
+ // Skip back past the -> and any word being typed
+ while (i >= 0 && /[\w>-]/.test(textBefore[i])) {
+ i--
+ }
+
+ // Now count parentheses going backwards
+ while (i >= 0) {
+ if (textBefore[i] === ')') depth++
+ else if (textBefore[i] === '(') {
+ depth--
+ // If we're back to depth 0, check if this ( belongs to a Flow function
+ if (depth === 0) {
+ // Look backwards to find the function name
+ let funcEnd = i
+ while (funcEnd > 0 && /\s/.test(textBefore[funcEnd - 1])) {
+ funcEnd--
+ }
+ let funcStart = funcEnd
+ while (funcStart > 0 && /\w/.test(textBefore[funcStart - 1])) {
+ funcStart--
+ }
+ const funcName = textBefore.slice(funcStart, funcEnd)
+
+ // Check if this is a Flow-returning function
+ if (flowFunctions.includes(funcName)) {
+ // This is it! We're directly after this function call
+ return continueWithCompletions()
+ }
+ // If not, we're inside some other call
+ return null
+ }
+ }
+ i--
+ }
+
+ return null
+
+ function continueWithCompletions() {
+ // Match word being typed (method name after ->)
+ const word = context.matchBefore(/\w*/)
+
+ // If no word and not explicit, don't show completions
+ if (!word && !context.explicit) {
+ return null
+ }
+
+ // Filter methods based on what's being typed
+ const prefix = word ? word.text.toLowerCase() : ''
+ const options = flowMethods.filter(method =>
+ !prefix || method.label.toLowerCase().startsWith(prefix)
+ )
+
+ return {
+ from: word ? word.from : context.pos,
+ options: options,
+ validFor: new RegExp('^\\w*$') // Reuse while typing word characters
+ }
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/scalarfunctionchain.js b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/scalarfunctionchain.js
new file mode 100644
index 0000000000..11e3e46b35
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Fixtures/Completers/scalarfunctionchain.js
@@ -0,0 +1,2065 @@
+/**
+ * CodeMirror Completer for Flow PHP ScalarFunctionChain Methods
+ *
+ * ScalarFunctionChain methods: 124
+ * ScalarFunctionChain-returning functions: 53
+ *
+ * This completer triggers after ScalarFunctionChain-returning DSL functions
+ */
+
+import { CompletionContext, snippet } from "@codemirror/autocomplete"
+
+// DSL functions that return ScalarFunctionChain (have scalar_function_chain: true)
+const scalarFunctionChainFunctions = [
+ "col", "entry", "ref", "optional", "lit", "exists", "when", "array_get", "array_get_collection", "array_get_collection_first", "array_exists", "array_merge", "array_merge_collection", "array_key_rename", "array_keys_style_convert", "array_sort", "array_reverse", "now", "between", "to_date_time", "to_date", "date_time_format", "split", "combine", "concat", "concat_ws", "hash", "cast", "coalesce", "call", "array_unpack", "array_expand", "size", "uuid_v4", "uuid_v7", "ulid", "lower", "capitalize", "upper", "not", "to_timezone", "regex_replace", "regex_match_all", "regex_match", "regex", "regex_all", "sprintf", "sanitize", "round", "number_format", "greatest", "least", "match_cases"]
+
+// ScalarFunctionChain methods
+const scalarFunctionChainMethods = [
+ {
+ label: "and",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ and ( ScalarFunction $function ) : All
+
+ `
+ return div
+ },
+ apply: snippet("and(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "andNot",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ andNot ( ScalarFunction $function ) : All
+
+ `
+ return div
+ },
+ apply: snippet("andNot(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "append",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ append ( ScalarFunction|string $suffix ) : Append
+
+ `
+ return div
+ },
+ apply: snippet("append(" + "$" + "{" + "1:suffix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayFilter",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayFilter ( mixed $value ) : ArrayFilter
+
+
+ Filters an array by removing all elements that matches passed value. Applicable to all data structures that can be converted to an array: - json - list - map - structure.
+
+ `
+ return div
+ },
+ apply: snippet("arrayFilter(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayGet",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayGet ( ScalarFunction|string $path ) : ArrayGet
+
+ `
+ return div
+ },
+ apply: snippet("arrayGet(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayGetCollection",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayGetCollection ( ScalarFunction|array $keys ) : ArrayGetCollection
+
+
+ `
+ return div
+ },
+ apply: snippet("arrayGetCollection(" + "$" + "{" + "1:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayGetCollectionFirst",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayGetCollectionFirst ( string $keys ) : ArrayGetCollection
+
+ `
+ return div
+ },
+ apply: snippet("arrayGetCollectionFirst(" + "$" + "{" + "1:keys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayKeep",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayKeep ( mixed $value ) : ArrayKeep
+
+
+ Filters an array by keeping only elements that matches passed value. Applicable to all data structures that can be converted to an array: - json - list - map - structure.
+
+ `
+ return div
+ },
+ apply: snippet("arrayKeep(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayKeys",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayKeys ( ) : ArrayKeys
+
+
+ Returns all keys from an array, ignoring the values. Applicable to all data structures that can be converted to an array: - json - list - map - structure.
+
+ `
+ return div
+ },
+ apply: snippet("arrayKeys()"),
+ boost: 10
+ }, {
+ label: "arrayMerge",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayMerge ( ScalarFunction|array $ref ) : ArrayMerge
+
+
+ `
+ return div
+ },
+ apply: snippet("arrayMerge(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayMergeCollection",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayMergeCollection ( ) : ArrayMergeCollection
+
+ `
+ return div
+ },
+ apply: snippet("arrayMergeCollection()"),
+ boost: 10
+ }, {
+ label: "arrayPathExists",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayPathExists ( ScalarFunction|string $path ) : ArrayPathExists
+
+ `
+ return div
+ },
+ apply: snippet("arrayPathExists(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayReverse",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayReverse ( ScalarFunction|bool $preserveKeys = false ) : ArrayReverse
+
+ `
+ return div
+ },
+ apply: snippet("arrayReverse(" + "$" + "{" + "1:preserveKeys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arraySort",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arraySort ( ScalarFunction|Sort|null $sortFunction = null , ScalarFunction|int|null $flags = null , ScalarFunction|bool $recursive = true ) : ArraySort
+
+ `
+ return div
+ },
+ apply: snippet("arraySort(" + "$" + "{" + "1:sortFunction" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:recursive" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "arrayValues",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ arrayValues ( ) : ArrayValues
+
+
+ Returns all values from an array, ignoring the keys. Applicable to all data structures that can be converted to an array: - json - list - map - structure.
+
+ `
+ return div
+ },
+ apply: snippet("arrayValues()"),
+ boost: 10
+ }, {
+ label: "ascii",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ascii ( ) : Ascii
+
+ `
+ return div
+ },
+ apply: snippet("ascii()"),
+ boost: 10
+ }, {
+ label: "between",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ between ( mixed $lowerBoundRef , mixed $upperBoundRef , ScalarFunction|Boundary $boundary = Flow\\ETL\\Function\\Between\\Boundary::... ) : Between
+
+
+ @param mixed|ScalarFunction $lowerBoundRef @param mixed|ScalarFunction $upperBoundRef @param Boundary|ScalarFunction $boundary
+
+ `
+ return div
+ },
+ apply: snippet("between(" + "$" + "{" + "1:lowerBoundRef" + "}" + ", " + "$" + "{" + "2:upperBoundRef" + "}" + ", " + "$" + "{" + "3:boundary" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "binaryLength",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ binaryLength ( ) : BinaryLength
+
+ `
+ return div
+ },
+ apply: snippet("binaryLength()"),
+ boost: 10
+ }, {
+ label: "call",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ call ( ScalarFunction|callable $callable , array $arguments = [] , string|int $refAlias = 0 , Type $returnType = null ) : CallUserFunc
+
+
+ @param array
$arguments @param Type $returnType
+
+ `
+ return div
+ },
+ apply: snippet("call(" + "$" + "{" + "1:callable" + "}" + ", " + "$" + "{" + "2:arguments" + "}" + ", " + "$" + "{" + "3:refAlias" + "}" + ", " + "$" + "{" + "4:returnType" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "capitalize",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ capitalize ( ) : Capitalize
+
+ `
+ return div
+ },
+ apply: snippet("capitalize()"),
+ boost: 10
+ }, {
+ label: "cast",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ cast ( Type|string $type ) : Cast
+
+
+ @param string|Type $type
+
+ `
+ return div
+ },
+ apply: snippet("cast(" + "$" + "{" + "1:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "chunk",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ chunk ( ScalarFunction|int $size ) : Chunk
+
+ `
+ return div
+ },
+ apply: snippet("chunk(" + "$" + "{" + "1:size" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "coalesce",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ coalesce ( ScalarFunction $params ) : Coalesce
+
+ `
+ return div
+ },
+ apply: snippet("coalesce(" + "$" + "{" + "1:params" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "codePointLength",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ codePointLength ( ) : CodePointLength
+
+ `
+ return div
+ },
+ apply: snippet("codePointLength()"),
+ boost: 10
+ }, {
+ label: "collapseWhitespace",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ collapseWhitespace ( ) : CollapseWhitespace
+
+ `
+ return div
+ },
+ apply: snippet("collapseWhitespace()"),
+ boost: 10
+ }, {
+ label: "concat",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ concat ( ScalarFunction|string $params ) : Concat
+
+ `
+ return div
+ },
+ apply: snippet("concat(" + "$" + "{" + "1:params" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "concatWithSeparator",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ concatWithSeparator ( ScalarFunction|string $separator , ScalarFunction|string $params ) : ConcatWithSeparator
+
+ `
+ return div
+ },
+ apply: snippet("concatWithSeparator(" + "$" + "{" + "1:separator" + "}" + ", " + "$" + "{" + "2:params" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "contains",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ contains ( ScalarFunction|string $needle ) : Contains
+
+ `
+ return div
+ },
+ apply: snippet("contains(" + "$" + "{" + "1:needle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dateFormat",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dateFormat ( string $format = 'Y-m-d' ) : DateTimeFormat
+
+ `
+ return div
+ },
+ apply: snippet("dateFormat(" + "$" + "{" + "1:format" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "dateTimeFormat",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ dateTimeFormat ( string $format = 'Y-m-d H:i:s' ) : DateTimeFormat
+
+ `
+ return div
+ },
+ apply: snippet("dateTimeFormat(" + "$" + "{" + "1:format" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "divide",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ divide ( ScalarFunction|string|int|float $value , ScalarFunction|int|null $scale = null , ScalarFunction|Rounding|null $rounding = null ) : Divide
+
+ `
+ return div
+ },
+ apply: snippet("divide(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ", " + "$" + "{" + "3:rounding" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "domElementAttribute",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementAttribute ( ScalarFunction|string $attribute ) : DOMElementAttributeValue
+
+
+ @deprecated Use domElementAttributeValue instead
+
+ `
+ return div
+ },
+ apply: snippet("domElementAttribute(" + "$" + "{" + "1:attribute" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "domElementAttributesCount",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementAttributesCount ( ) : DOMElementAttributesCount
+
+ `
+ return div
+ },
+ apply: snippet("domElementAttributesCount()"),
+ boost: 10
+ }, {
+ label: "domElementAttributeValue",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementAttributeValue ( ScalarFunction|string $attribute ) : DOMElementAttributeValue
+
+ `
+ return div
+ },
+ apply: snippet("domElementAttributeValue(" + "$" + "{" + "1:attribute" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "domElementNextSibling",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementNextSibling ( bool $allowOnlyElement = false ) : DOMElementNextSibling
+
+ `
+ return div
+ },
+ apply: snippet("domElementNextSibling(" + "$" + "{" + "1:allowOnlyElement" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "domElementParent",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementParent ( ) : DOMElementParent
+
+ `
+ return div
+ },
+ apply: snippet("domElementParent()"),
+ boost: 10
+ }, {
+ label: "domElementPreviousSibling",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementPreviousSibling ( bool $allowOnlyElement = false ) : DOMElementPreviousSibling
+
+ `
+ return div
+ },
+ apply: snippet("domElementPreviousSibling(" + "$" + "{" + "1:allowOnlyElement" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "domElementValue",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ domElementValue ( ) : DOMElementValue
+
+ `
+ return div
+ },
+ apply: snippet("domElementValue()"),
+ boost: 10
+ }, {
+ label: "endsWith",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ endsWith ( ScalarFunction|string $needle ) : EndsWith
+
+ `
+ return div
+ },
+ apply: snippet("endsWith(" + "$" + "{" + "1:needle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "ensureEnd",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ensureEnd ( ScalarFunction|string $suffix ) : EnsureEnd
+
+ `
+ return div
+ },
+ apply: snippet("ensureEnd(" + "$" + "{" + "1:suffix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "ensureStart",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ ensureStart ( ScalarFunction|string $prefix ) : EnsureStart
+
+ `
+ return div
+ },
+ apply: snippet("ensureStart(" + "$" + "{" + "1:prefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "equals",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ equals ( mixed $ref ) : Equals
+
+ `
+ return div
+ },
+ apply: snippet("equals(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "exists",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ exists ( ) : Exists
+
+ `
+ return div
+ },
+ apply: snippet("exists()"),
+ boost: 10
+ }, {
+ label: "expand",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ expand ( ArrayExpand $expand = Flow\\ETL\\Function\\ArrayExpand\\ArrayExpand::... ) : ArrayExpand
+
+
+ Expands each value into entry, if there are more than one value, multiple rows will be created. Array keys are ignored, only values are used to create new rows. Before: +--+-------------------+ |id| array| +--+-------------------+ | 1|{\"a\":1,\"b\":2,\"c\":3}| +--+-------------------+ After: +--+--------+ |id|expanded| +--+--------+ | 1| 1| | 1| 2| | 1| 3| +--+--------+
+
+ `
+ return div
+ },
+ apply: snippet("expand(" + "$" + "{" + "1:expand" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "greaterThan",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ greaterThan ( mixed $ref ) : GreaterThan
+
+ `
+ return div
+ },
+ apply: snippet("greaterThan(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "greaterThanEqual",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ greaterThanEqual ( mixed $ref ) : GreaterThanEqual
+
+ `
+ return div
+ },
+ apply: snippet("greaterThanEqual(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "hash",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ hash ( Algorithm $algorithm = Flow\\ETL\\Hash\\NativePHPHash::... ) : Hash
+
+ `
+ return div
+ },
+ apply: snippet("hash(" + "$" + "{" + "1:algorithm" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "htmlQuerySelector",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ htmlQuerySelector ( ScalarFunction|string $path ) : HTMLQuerySelector
+
+ `
+ return div
+ },
+ apply: snippet("htmlQuerySelector(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "htmlQuerySelectorAll",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ htmlQuerySelectorAll ( ScalarFunction|string $path ) : HTMLQuerySelectorAll
+
+ `
+ return div
+ },
+ apply: snippet("htmlQuerySelectorAll(" + "$" + "{" + "1:path" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "indexOf",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ indexOf ( ScalarFunction|string $needle , ScalarFunction|bool $ignoreCase = false , ScalarFunction|int $offset = 0 ) : IndexOf
+
+
+ Returns the index of given $needle in string.
+
+ `
+ return div
+ },
+ apply: snippet("indexOf(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:ignoreCase" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "indexOfLast",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ indexOfLast ( ScalarFunction|string $needle , ScalarFunction|bool $ignoreCase = false , ScalarFunction|int $offset = 0 ) : IndexOfLast
+
+
+ Returns the last index of given $needle in string.
+
+ `
+ return div
+ },
+ apply: snippet("indexOfLast(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:ignoreCase" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "isEmpty",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isEmpty ( ) : IsEmpty
+
+ `
+ return div
+ },
+ apply: snippet("isEmpty()"),
+ boost: 10
+ }, {
+ label: "isEven",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isEven ( ) : Equals
+
+ `
+ return div
+ },
+ apply: snippet("isEven()"),
+ boost: 10
+ }, {
+ label: "isFalse",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isFalse ( ) : Same
+
+ `
+ return div
+ },
+ apply: snippet("isFalse()"),
+ boost: 10
+ }, {
+ label: "isIn",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isIn ( ScalarFunction|array $haystack ) : IsIn
+
+
+ @param array
$haystack
+
+ `
+ return div
+ },
+ apply: snippet("isIn(" + "$" + "{" + "1:haystack" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "isNotNull",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isNotNull ( ) : IsNotNull
+
+ `
+ return div
+ },
+ apply: snippet("isNotNull()"),
+ boost: 10
+ }, {
+ label: "isNotNumeric",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isNotNumeric ( ) : IsNotNumeric
+
+ `
+ return div
+ },
+ apply: snippet("isNotNumeric()"),
+ boost: 10
+ }, {
+ label: "isNull",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isNull ( ) : IsNull
+
+ `
+ return div
+ },
+ apply: snippet("isNull()"),
+ boost: 10
+ }, {
+ label: "isNumeric",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isNumeric ( ) : IsNumeric
+
+ `
+ return div
+ },
+ apply: snippet("isNumeric()"),
+ boost: 10
+ }, {
+ label: "isOdd",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isOdd ( ) : NotEquals
+
+ `
+ return div
+ },
+ apply: snippet("isOdd()"),
+ boost: 10
+ }, {
+ label: "isTrue",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isTrue ( ) : Same
+
+ `
+ return div
+ },
+ apply: snippet("isTrue()"),
+ boost: 10
+ }, {
+ label: "isType",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isType ( Type|string $types ) : IsType
+
+
+ @param string|Type $types
+
+ `
+ return div
+ },
+ apply: snippet("isType(" + "$" + "{" + "1:types" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "isUtf8",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ isUtf8 ( ) : IsUtf8
+
+
+ Check string is utf8 and returns true or false.
+
+ `
+ return div
+ },
+ apply: snippet("isUtf8()"),
+ boost: 10
+ }, {
+ label: "jsonDecode",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ jsonDecode ( ScalarFunction|int $flags = 4194304 ) : JsonDecode
+
+ `
+ return div
+ },
+ apply: snippet("jsonDecode(" + "$" + "{" + "1:flags" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "jsonEncode",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ jsonEncode ( ScalarFunction|int $flags = 4194304 ) : JsonEncode
+
+ `
+ return div
+ },
+ apply: snippet("jsonEncode(" + "$" + "{" + "1:flags" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lessThan",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lessThan ( mixed $ref ) : LessThan
+
+ `
+ return div
+ },
+ apply: snippet("lessThan(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lessThanEqual",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lessThanEqual ( ScalarFunction $ref ) : LessThanEqual
+
+ `
+ return div
+ },
+ apply: snippet("lessThanEqual(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "literal",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ literal ( mixed $value ) : Literal
+
+ `
+ return div
+ },
+ apply: snippet("literal(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "lower",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ lower ( ) : ToLower
+
+ `
+ return div
+ },
+ apply: snippet("lower()"),
+ boost: 10
+ }, {
+ label: "minus",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ minus ( ScalarFunction|int|float $ref ) : Minus
+
+ `
+ return div
+ },
+ apply: snippet("minus(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "mod",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ mod ( ScalarFunction|int $value ) : Mod
+
+ `
+ return div
+ },
+ apply: snippet("mod(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "modifyDateTime",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ modifyDateTime ( ScalarFunction|string $modifier ) : ModifyDateTime
+
+ `
+ return div
+ },
+ apply: snippet("modifyDateTime(" + "$" + "{" + "1:modifier" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "multiply",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ multiply ( ScalarFunction|int|float $value ) : Multiply
+
+ `
+ return div
+ },
+ apply: snippet("multiply(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "notEquals",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ notEquals ( mixed $value ) : NotEquals
+
+ `
+ return div
+ },
+ apply: snippet("notEquals(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "notSame",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ notSame ( mixed $value ) : NotSame
+
+ `
+ return div
+ },
+ apply: snippet("notSame(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "numberFormat",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ numberFormat ( ScalarFunction|int $decimals = 2 , ScalarFunction|string $decimalSeparator = '.' , ScalarFunction|string $thousandsSeparator = ',' ) : NumberFormat
+
+ `
+ return div
+ },
+ apply: snippet("numberFormat(" + "$" + "{" + "1:decimals" + "}" + ", " + "$" + "{" + "2:decimalSeparator" + "}" + ", " + "$" + "{" + "3:thousandsSeparator" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "onEach",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ onEach ( ScalarFunction $function , ScalarFunction|bool $preserveKeys = true ) : OnEach
+
+
+ Execute a scalar function on each element of an array/list/map/structure entry. In order to use this function, you need to provide a reference to the \"element\" that will be used in the function. Example: $df->withEntry(\'array\', ref(\'array\')->onEach(ref(\'element\')->cast(type_string())))
+
+ `
+ return div
+ },
+ apply: snippet("onEach(" + "$" + "{" + "1:function" + "}" + ", " + "$" + "{" + "2:preserveKeys" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "or",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ or ( ScalarFunction $function ) : Any
+
+ `
+ return div
+ },
+ apply: snippet("or(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "orNot",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ orNot ( ScalarFunction $function ) : Any
+
+ `
+ return div
+ },
+ apply: snippet("orNot(" + "$" + "{" + "1:function" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "plus",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ plus ( ScalarFunction|int|float $ref ) : Plus
+
+ `
+ return div
+ },
+ apply: snippet("plus(" + "$" + "{" + "1:ref" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "power",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ power ( ScalarFunction|int $value ) : Power
+
+ `
+ return div
+ },
+ apply: snippet("power(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "prepend",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ prepend ( ScalarFunction|string $prefix ) : Prepend
+
+ `
+ return div
+ },
+ apply: snippet("prepend(" + "$" + "{" + "1:prefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regex",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regex ( ScalarFunction|string $pattern , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : Regex
+
+ `
+ return div
+ },
+ apply: snippet("regex(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regexAll",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regexAll ( ScalarFunction|string $pattern , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexAll
+
+ `
+ return div
+ },
+ apply: snippet("regexAll(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regexMatch",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regexMatch ( ScalarFunction|string $pattern , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexMatch
+
+ `
+ return div
+ },
+ apply: snippet("regexMatch(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regexMatchAll",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regexMatchAll ( ScalarFunction|string $pattern , ScalarFunction|int $flags = 0 , ScalarFunction|int $offset = 0 ) : RegexMatchAll
+
+ `
+ return div
+ },
+ apply: snippet("regexMatchAll(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:flags" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "regexReplace",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ regexReplace ( ScalarFunction|string $pattern , ScalarFunction|string $replacement , ScalarFunction|int|null $limit = null ) : RegexReplace
+
+ `
+ return div
+ },
+ apply: snippet("regexReplace(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:replacement" + "}" + ", " + "$" + "{" + "3:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "repeat",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ repeat ( ScalarFunction|int $times ) : Repeat
+
+ `
+ return div
+ },
+ apply: snippet("repeat(" + "$" + "{" + "1:times" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "reverse",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ reverse ( ) : Reverse
+
+ `
+ return div
+ },
+ apply: snippet("reverse()"),
+ boost: 10
+ }, {
+ label: "round",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ round ( ScalarFunction|int $precision = 2 , ScalarFunction|int $mode = 1 ) : Round
+
+ `
+ return div
+ },
+ apply: snippet("round(" + "$" + "{" + "1:precision" + "}" + ", " + "$" + "{" + "2:mode" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "same",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ same ( mixed $value ) : Same
+
+ `
+ return div
+ },
+ apply: snippet("same(" + "$" + "{" + "1:value" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sanitize",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sanitize ( ScalarFunction|string $placeholder = '*' , ScalarFunction|int|null $skipCharacters = null ) : Sanitize
+
+ `
+ return div
+ },
+ apply: snippet("sanitize(" + "$" + "{" + "1:placeholder" + "}" + ", " + "$" + "{" + "2:skipCharacters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "size",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ size ( ) : Size
+
+ `
+ return div
+ },
+ apply: snippet("size()"),
+ boost: 10
+ }, {
+ label: "slug",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ slug ( ScalarFunction|string $separator = '-' , ScalarFunction|string|null $locale = null , ScalarFunction|array|null $symbolsMap = null ) : Slug
+
+
+ @param null|array
$symbolsMap
+
+ `
+ return div
+ },
+ apply: snippet("slug(" + "$" + "{" + "1:separator" + "}" + ", " + "$" + "{" + "2:locale" + "}" + ", " + "$" + "{" + "3:symbolsMap" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "split",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ split ( ScalarFunction|string $separator , ScalarFunction|int $limit = 9223372036854775807 ) : Split
+
+ `
+ return div
+ },
+ apply: snippet("split(" + "$" + "{" + "1:separator" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "sprintf",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ sprintf ( ScalarFunction|string|int|float|null $params ) : Sprintf
+
+ `
+ return div
+ },
+ apply: snippet("sprintf(" + "$" + "{" + "1:params" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "startsWith",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ startsWith ( ScalarFunction|string $needle ) : StartsWith
+
+ `
+ return div
+ },
+ apply: snippet("startsWith(" + "$" + "{" + "1:needle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringAfter",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringAfter ( ScalarFunction|string $needle , ScalarFunction|bool $includeNeedle = false ) : StringAfter
+
+
+ Returns the contents found after the first occurrence of the given string.
+
+ `
+ return div
+ },
+ apply: snippet("stringAfter(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:includeNeedle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringAfterLast",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringAfterLast ( ScalarFunction|string $needle , ScalarFunction|bool $includeNeedle = false ) : StringAfterLast
+
+
+ Returns the contents found after the last occurrence of the given string.
+
+ `
+ return div
+ },
+ apply: snippet("stringAfterLast(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:includeNeedle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringBefore",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringBefore ( ScalarFunction|string $needle , ScalarFunction|bool $includeNeedle = false ) : StringBefore
+
+
+ Returns the contents found before the first occurrence of the given string.
+
+ `
+ return div
+ },
+ apply: snippet("stringBefore(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:includeNeedle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringBeforeLast",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringBeforeLast ( ScalarFunction|string $needle , ScalarFunction|bool $includeNeedle = false ) : StringBeforeLast
+
+
+ Returns the contents found before the last occurrence of the given string.
+
+ `
+ return div
+ },
+ apply: snippet("stringBeforeLast(" + "$" + "{" + "1:needle" + "}" + ", " + "$" + "{" + "2:includeNeedle" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringContainsAny",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringContainsAny ( ScalarFunction|array $needles ) : StringContainsAny
+
+
+ @param array|ScalarFunction $needles
+
+ `
+ return div
+ },
+ apply: snippet("stringContainsAny(" + "$" + "{" + "1:needles" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringEqualsTo",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringEqualsTo ( ScalarFunction|string $string ) : StringEqualsTo
+
+ `
+ return div
+ },
+ apply: snippet("stringEqualsTo(" + "$" + "{" + "1:string" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringFold",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringFold ( ) : StringFold
+
+
+ Returns a string that you can use in case-insensitive comparisons.
+
+ `
+ return div
+ },
+ apply: snippet("stringFold()"),
+ boost: 10
+ }, {
+ label: "stringMatch",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringMatch ( ScalarFunction|string $pattern ) : StringMatch
+
+ `
+ return div
+ },
+ apply: snippet("stringMatch(" + "$" + "{" + "1:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringMatchAll",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringMatchAll ( ScalarFunction|string $pattern ) : StringMatchAll
+
+ `
+ return div
+ },
+ apply: snippet("stringMatchAll(" + "$" + "{" + "1:pattern" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringNormalize",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringNormalize ( ScalarFunction|int $form = 16 ) : StringNormalize
+
+ `
+ return div
+ },
+ apply: snippet("stringNormalize(" + "$" + "{" + "1:form" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringStyle",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringStyle ( ScalarFunction|StringStyles|StringStyles|string $style ) : StringStyle
+
+
+ Covert string to a style from enum list, passed in parameter. Can be string \"upper\" or StringStyles::UPPER for Upper (example).
+
+ `
+ return div
+ },
+ apply: snippet("stringStyle(" + "$" + "{" + "1:style" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringTitle",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringTitle ( ScalarFunction|bool $allWords = false ) : StringTitle
+
+
+ Changes all graphemes/code points to \"title case\".
+
+ `
+ return div
+ },
+ apply: snippet("stringTitle(" + "$" + "{" + "1:allWords" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "stringWidth",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ stringWidth ( ) : StringWidth
+
+ `
+ return div
+ },
+ apply: snippet("stringWidth()"),
+ boost: 10
+ }, {
+ label: "strPad",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ strPad ( int $length , string $pad_string = ' ' , int $type = 1 ) : StrPad
+
+ `
+ return div
+ },
+ apply: snippet("strPad(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:pad_string" + "}" + ", " + "$" + "{" + "3:type" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "strPadBoth",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ strPadBoth ( int $length , string $pad_string = ' ' ) : StrPad
+
+ `
+ return div
+ },
+ apply: snippet("strPadBoth(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:pad_string" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "strPadLeft",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ strPadLeft ( int $length , string $pad_string = ' ' ) : StrPad
+
+ `
+ return div
+ },
+ apply: snippet("strPadLeft(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:pad_string" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "strPadRight",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ strPadRight ( int $length , string $pad_string = ' ' ) : StrPad
+
+ `
+ return div
+ },
+ apply: snippet("strPadRight(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:pad_string" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "strReplace",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ strReplace ( ScalarFunction|array|string $search , ScalarFunction|array|string $replace ) : StrReplace
+
+
+ @param array|ScalarFunction|string $search @param array|ScalarFunction|string $replace
+
+ `
+ return div
+ },
+ apply: snippet("strReplace(" + "$" + "{" + "1:search" + "}" + ", " + "$" + "{" + "2:replace" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "toDate",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ toDate ( ScalarFunction|string $format = 'Y-m-d\\\\TH:i:sP' , ScalarFunction|DateTimeZone $timeZone = DateTimeZone::... ) : ToDate
+
+
+ @param ScalarFunction|string $format - current format of the date that will be used to create DateTimeImmutable instance
+
+ `
+ return div
+ },
+ apply: snippet("toDate(" + "$" + "{" + "1:format" + "}" + ", " + "$" + "{" + "2:timeZone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "toDateTime",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ toDateTime ( ScalarFunction|string $format = 'Y-m-d H:i:s' , ScalarFunction|DateTimeZone $timeZone = DateTimeZone::... ) : ToDateTime
+
+
+ @param ScalarFunction|string $format - current format of the date that will be used to create DateTimeImmutable instance @param \\DateTimeZone|ScalarFunction $timeZone
+
+ `
+ return div
+ },
+ apply: snippet("toDateTime(" + "$" + "{" + "1:format" + "}" + ", " + "$" + "{" + "2:timeZone" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "trim",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ trim ( Type $type = Flow\\ETL\\Function\\Trim\\Type::... , string $characters = ' \\t\\n\\r\\0' ) : Trim
+
+ `
+ return div
+ },
+ apply: snippet("trim(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:characters" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "truncate",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ truncate ( ScalarFunction|int $length , ScalarFunction|string $ellipsis = '...' ) : Truncate
+
+ `
+ return div
+ },
+ apply: snippet("truncate(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:ellipsis" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "unicodeLength",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ unicodeLength ( ) : UnicodeLength
+
+ `
+ return div
+ },
+ apply: snippet("unicodeLength()"),
+ boost: 10
+ }, {
+ label: "unpack",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ unpack ( ScalarFunction|array $skipKeys = [] , ScalarFunction|string|null $entryPrefix = null ) : ArrayUnpack
+
+
+ @param array
$skipKeys
+
+ `
+ return div
+ },
+ apply: snippet("unpack(" + "$" + "{" + "1:skipKeys" + "}" + ", " + "$" + "{" + "2:entryPrefix" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "upper",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ upper ( ) : ToUpper
+
+ `
+ return div
+ },
+ apply: snippet("upper()"),
+ boost: 10
+ }, {
+ label: "wordwrap",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ wordwrap ( ScalarFunction|int $width , ScalarFunction|string $break = '\\n' , ScalarFunction|bool $cut = false ) : Wordwrap
+
+ `
+ return div
+ },
+ apply: snippet("wordwrap(" + "$" + "{" + "1:width" + "}" + ", " + "$" + "{" + "2:break" + "}" + ", " + "$" + "{" + "3:cut" + "}" + ")"),
+ boost: 10
+ }, {
+ label: "xpath",
+ type: "method",
+ detail: "Flow\\\\ETL\\\\Function\\\\ScalarFunctionChain",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ xpath ( string $string ) : XPath
+
+ `
+ return div
+ },
+ apply: snippet("xpath(" + "$" + "{" + "1:string" + "}" + ")"),
+ boost: 10
+ } ]
+
+/**
+ * ScalarFunctionChain method completion source for CodeMirror
+ * @param {CompletionContext} context
+ * @returns {CompletionResult|null}
+ */
+export function scalarFunctionChainCompletions(context) {
+ // Get text before cursor (potentially across multiple lines)
+ // Look back up to 2000 characters to find the pattern
+ const maxLookback = 2000
+ const docText = context.state.doc.toString()
+ const startPos = Math.max(0, context.pos - maxLookback)
+ const textBefore = docText.slice(startPos, context.pos)
+
+ // Check if we're directly after -> (method chaining context)
+ if (!new RegExp('->\\w*$').test(textBefore)) {
+ return null
+ }
+
+ // Check if we're after a ScalarFunctionChain-returning function
+ // Pattern: any of the DSL functions with scalar_function_chain: true
+ if (scalarFunctionChainFunctions.length === 0) {
+ return null
+ }
+
+ // Find all matching functions and check if any are at top level with ->
+ const functionPattern = new RegExp('\\b(' + scalarFunctionChainFunctions.join('|') + ')\\s*\\(', 'g')
+ let matches = []
+ let match
+
+ while ((match = functionPattern.exec(textBefore)) !== null) {
+ matches.push({ name: match[1], index: match.index, endOfName: match.index + match[0].length })
+ }
+
+ // Walk backwards from cursor tracking parenthesis depth
+ let depth = 0
+ let i = textBefore.length - 1
+
+ // Skip back past the -> and any word being typed
+ while (i >= 0 && /[\w>-]/.test(textBefore[i])) {
+ i--
+ }
+
+ // Now count parentheses going backwards
+ while (i >= 0) {
+ if (textBefore[i] === ')') depth++
+ else if (textBefore[i] === '(') {
+ depth--
+ // If we're back to depth 0, check if this ( belongs to a ScalarFunctionChain function
+ if (depth === 0) {
+ // Look backwards to find the function name
+ let funcEnd = i
+ while (funcEnd > 0 && /\s/.test(textBefore[funcEnd - 1])) {
+ funcEnd--
+ }
+ let funcStart = funcEnd
+ while (funcStart > 0 && /\w/.test(textBefore[funcStart - 1])) {
+ funcStart--
+ }
+ const funcName = textBefore.slice(funcStart, funcEnd)
+
+ // Check if this is a ScalarFunctionChain-returning function
+ if (scalarFunctionChainFunctions.includes(funcName)) {
+ // This is it! We're directly after this function call
+ return continueWithCompletions()
+ }
+ // If not, we're inside some other call
+ return null
+ }
+ }
+ i--
+ }
+
+ return null
+
+ function continueWithCompletions() {
+ // Match word being typed (method name after ->)
+ const word = context.matchBefore(/\w*/)
+
+ // If no word and not explicit, don't show completions
+ if (!word && !context.explicit) {
+ return null
+ }
+
+ // Filter methods based on what's being typed
+ const prefix = word ? word.text.toLowerCase() : ''
+ const options = scalarFunctionChainMethods.filter(method =>
+ !prefix || method.label.toLowerCase().startsWith(prefix)
+ )
+
+ return {
+ from: word ? word.from : context.pos,
+ options: options,
+ validFor: new RegExp('^\\w*$') // Reuse while typing word characters
+ }
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Integration/Command/CompleterCommandTestCase.php b/web/landing/tests/Flow/Website/Tests/Integration/Command/CompleterCommandTestCase.php
new file mode 100644
index 0000000000..0919b0f0eb
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Integration/Command/CompleterCommandTestCase.php
@@ -0,0 +1,59 @@
+application = new Application(self::$kernel);
+ }
+
+ protected function assertGeneratedFileMatchesFixture(string $generatedPath, string $fixturePath) : void
+ {
+ static::assertFileExists($generatedPath, 'Generated file does not exist');
+ static::assertFileExists($fixturePath, 'Fixture file does not exist');
+
+ $generatedContent = \file_get_contents($generatedPath);
+ $fixtureContent = \file_get_contents($fixturePath);
+
+ static::assertSame($fixtureContent, $generatedContent, 'Generated file content does not match fixture');
+ }
+
+ protected function executeCommand(string $commandName) : CommandTester
+ {
+ $command = $this->application->find($commandName);
+ $commandTester = new CommandTester($command);
+ $commandTester->execute([]);
+
+ return $commandTester;
+ }
+
+ protected function getFixturePath(string $filename) : string
+ {
+ return __DIR__ . '/../../Fixtures/Completers/' . $filename;
+ }
+
+ protected function getOutputPath(string $filename) : string
+ {
+ return self::$kernel->getProjectDir() . '/assets/codemirror/completions/' . $filename;
+ }
+
+ #[\Override]
+ protected static function getKernelClass() : string
+ {
+ return Kernel::class;
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDSLCompleterCommandTest.php b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDSLCompleterCommandTest.php
new file mode 100644
index 0000000000..33d1db48b6
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDSLCompleterCommandTest.php
@@ -0,0 +1,40 @@
+executeCommand('app:generate:dsl-completer');
+
+ self::assertSame(Command::SUCCESS, $commandTester->getStatusCode());
+ self::assertStringContainsString('Generated DSL completer', $commandTester->getDisplay());
+ }
+
+ public function test_generated_js_contains_required_structure() : void
+ {
+ $this->executeCommand('app:generate:dsl-completer');
+
+ $content = \file_get_contents($this->getOutputPath('dsl.js'));
+
+ self::assertStringContainsString('CodeMirror Completer', $content);
+ self::assertStringContainsString('dslFunctions', $content);
+ self::assertStringContainsString('import { CompletionContext, snippet }', $content);
+ self::assertStringContainsString('export function', $content);
+ }
+
+ public function test_generated_output_matches_expected_fixture() : void
+ {
+ $this->executeCommand('app:generate:dsl-completer');
+
+ $this->assertGeneratedFileMatchesFixture(
+ $this->getOutputPath('dsl.js'),
+ $this->getFixturePath('dsl.js')
+ );
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDataFrameCompleterCommandTest.php b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDataFrameCompleterCommandTest.php
new file mode 100644
index 0000000000..e71c13558d
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateDataFrameCompleterCommandTest.php
@@ -0,0 +1,40 @@
+executeCommand('app:generate:data-frame-completer');
+
+ self::assertSame(Command::SUCCESS, $commandTester->getStatusCode());
+ self::assertStringContainsString('Generated DataFrame completer', $commandTester->getDisplay());
+ }
+
+ public function test_generated_js_contains_required_structure() : void
+ {
+ $this->executeCommand('app:generate:data-frame-completer');
+
+ $content = \file_get_contents($this->getOutputPath('dataframe.js'));
+
+ self::assertStringContainsString('CodeMirror Completer', $content);
+ self::assertStringContainsString('dataframeMethods', $content);
+ self::assertStringContainsString('import { CompletionContext, snippet }', $content);
+ self::assertStringContainsString('export function', $content);
+ }
+
+ public function test_generated_output_matches_expected_fixture() : void
+ {
+ $this->executeCommand('app:generate:data-frame-completer');
+
+ $this->assertGeneratedFileMatchesFixture(
+ $this->getOutputPath('dataframe.js'),
+ $this->getFixturePath('dataframe.js')
+ );
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateFlowCompleterCommandTest.php b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateFlowCompleterCommandTest.php
new file mode 100644
index 0000000000..f141562fd3
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateFlowCompleterCommandTest.php
@@ -0,0 +1,40 @@
+executeCommand('app:generate:flow-completer');
+
+ self::assertSame(Command::SUCCESS, $commandTester->getStatusCode());
+ self::assertStringContainsString('Generated Flow completer', $commandTester->getDisplay());
+ }
+
+ public function test_generated_js_contains_required_structure() : void
+ {
+ $this->executeCommand('app:generate:flow-completer');
+
+ $content = \file_get_contents($this->getOutputPath('flow.js'));
+
+ self::assertStringContainsString('CodeMirror Completer', $content);
+ self::assertStringContainsString('flowMethods', $content);
+ self::assertStringContainsString('import { CompletionContext, snippet }', $content);
+ self::assertStringContainsString('export function', $content);
+ }
+
+ public function test_generated_output_matches_expected_fixture() : void
+ {
+ $this->executeCommand('app:generate:flow-completer');
+
+ $this->assertGeneratedFileMatchesFixture(
+ $this->getOutputPath('flow.js'),
+ $this->getFixturePath('flow.js')
+ );
+ }
+}
diff --git a/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateScalarFunctionChainCompleterCommandTest.php b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateScalarFunctionChainCompleterCommandTest.php
new file mode 100644
index 0000000000..be31462d07
--- /dev/null
+++ b/web/landing/tests/Flow/Website/Tests/Integration/Command/GenerateScalarFunctionChainCompleterCommandTest.php
@@ -0,0 +1,40 @@
+executeCommand('app:generate:scalar-function-chain-completer');
+
+ self::assertSame(Command::SUCCESS, $commandTester->getStatusCode());
+ self::assertStringContainsString('Generated ScalarFunctionChain completer', $commandTester->getDisplay());
+ }
+
+ public function test_generated_js_contains_required_structure() : void
+ {
+ $this->executeCommand('app:generate:scalar-function-chain-completer');
+
+ $content = \file_get_contents($this->getOutputPath('scalarfunctionchain.js'));
+
+ self::assertStringContainsString('CodeMirror Completer', $content);
+ self::assertStringContainsString('scalarFunctionChainMethods', $content);
+ self::assertStringContainsString('import { CompletionContext, snippet }', $content);
+ self::assertStringContainsString('export function', $content);
+ }
+
+ public function test_generated_output_matches_expected_fixture() : void
+ {
+ $this->executeCommand('app:generate:scalar-function-chain-completer');
+
+ $this->assertGeneratedFileMatchesFixture(
+ $this->getOutputPath('scalarfunctionchain.js'),
+ $this->getFixturePath('scalarfunctionchain.js')
+ );
+ }
+}