diff --git a/bin/build-phar.sh b/bin/build-phar.sh
new file mode 100755
index 000000000..b46315192
--- /dev/null
+++ b/bin/build-phar.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+set -e
+
+CLI_DIR="src/cli"
+
+composer config repositories.local-etl '{"type": "path", "url": "../core/etl", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-csv '{"type": "path", "url": "../adapter/etl-adapter-csv", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-parquet '{"type": "path", "url": "../adapter/etl-adapter-parquet", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-doctrine '{"type": "path", "url": "../adapter/etl-adapter-doctrine", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-json '{"type": "path", "url": "../adapter/etl-adapter-json", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-text '{"type": "path", "url": "../adapter/etl-adapter-text", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-xml '{"type": "path", "url": "../adapter/etl-adapter-xml", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-excel '{"type": "path", "url": "../adapter/etl-adapter-excel", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-adapter-chartjs '{"type": "path", "url": "../adapter/etl-adapter-chartjs", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-openapi-specification '{"type": "path", "url": "../bridge/openapi/specification", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-parquet-viewer '{"type": "path", "url": "../lib/parquet-viewer", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-postgresql '{"type": "path", "url": "../lib/postgresql", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-types '{"type": "path", "url": "../lib/types", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-array-dot '{"type": "path", "url": "../lib/array-dot", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-filesystem '{"type": "path", "url": "../lib/filesystem", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-parquet '{"type": "path", "url": "../lib/parquet", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-snappy '{"type": "path", "url": "../lib/snappy", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-doctrine-dbal-bulk '{"type": "path", "url": "../lib/doctrine-dbal-bulk", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+composer config repositories.local-dremel '{"type": "path", "url": "../lib/dremel", "options": {"symlink": false}}' --working-dir="$CLI_DIR"
+
+rm -rf "$CLI_DIR/vendor"
+
+composer update --no-dev --working-dir="$CLI_DIR"
+
+tools/box/vendor/bin/box compile --config "$CLI_DIR/box.json"
+
+composer config repositories --unset --working-dir="$CLI_DIR"
+
+rm -rf "$CLI_DIR/vendor"
diff --git a/composer.json b/composer.json
index 34c184b27..0003ee2f5 100644
--- a/composer.json
+++ b/composer.json
@@ -442,8 +442,7 @@
"./tools/rector/vendor/bin/rector -c ./rector.tests.php"
],
"build:phar": [
- "composer update --working-dir=./src/cli",
- "tools/box/vendor/bin/box compile --config ./src/cli/box.json",
+ "bin/build-phar.sh",
"cp ./build/flow.phar ./web/landing/assets/wasm/tools/flow.phar"
],
"build:wasm": [
diff --git a/composer.lock b/composer.lock
index 59990204c..0357aa599 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "e1c47f46e87d296ad8e095c857acca7a",
+ "content-hash": "76b86aeee4538bb6d7fe56d53bff0615",
"packages": [
{
"name": "async-aws/core",
@@ -263,16 +263,16 @@
},
{
"name": "doctrine/dbal",
- "version": "4.3.4",
+ "version": "4.4.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc"
+ "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc",
- "reference": "1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c",
+ "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c",
"shasum": ""
},
"require": {
@@ -291,8 +291,8 @@
"phpunit/phpunit": "11.5.23",
"slevomat/coding-standard": "8.24.0",
"squizlabs/php_codesniffer": "4.0.0",
- "symfony/cache": "^6.3.8|^7.0",
- "symfony/console": "^5.4|^6.3|^7.0"
+ "symfony/cache": "^6.3.8|^7.0|^8.0",
+ "symfony/console": "^5.4|^6.3|^7.0|^8.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -349,7 +349,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/4.3.4"
+ "source": "https://github.com/doctrine/dbal/tree/4.4.1"
},
"funding": [
{
@@ -365,7 +365,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-09T09:11:36+00:00"
+ "time": "2025-12-04T10:11:03+00:00"
},
{
"name": "doctrine/deprecations",
@@ -664,16 +664,16 @@
},
{
"name": "google/apiclient-services",
- "version": "v0.421.0",
+ "version": "v0.423.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git",
- "reference": "d84e7301a52405677807564dab6b1a112dfd03bd"
+ "reference": "c8f2e8a92e2848987db421175eaaf7602ef30c33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d84e7301a52405677807564dab6b1a112dfd03bd",
- "reference": "d84e7301a52405677807564dab6b1a112dfd03bd",
+ "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/c8f2e8a92e2848987db421175eaaf7602ef30c33",
+ "reference": "c8f2e8a92e2848987db421175eaaf7602ef30c33",
"shasum": ""
},
"require": {
@@ -702,9 +702,9 @@
],
"support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues",
- "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.421.0"
+ "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.423.0"
},
- "time": "2025-11-23T01:06:22+00:00"
+ "time": "2025-12-08T01:10:26+00:00"
},
{
"name": "google/auth",
@@ -770,16 +770,16 @@
},
{
"name": "google/protobuf",
- "version": "v4.33.1",
+ "version": "v4.33.2",
"source": {
"type": "git",
"url": "https://github.com/protocolbuffers/protobuf-php.git",
- "reference": "0cd73ccf0cd26c3e72299cce1ea6144091a57e12"
+ "reference": "fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/0cd73ccf0cd26c3e72299cce1ea6144091a57e12",
- "reference": "0cd73ccf0cd26c3e72299cce1ea6144091a57e12",
+ "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318",
+ "reference": "fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318",
"shasum": ""
},
"require": {
@@ -808,9 +808,9 @@
"proto"
],
"support": {
- "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.33.1"
+ "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.33.2"
},
- "time": "2025-11-12T21:58:05+00:00"
+ "time": "2025-12-05T22:12:22+00:00"
},
{
"name": "guzzlehttp/guzzle",
@@ -1139,20 +1139,20 @@
},
{
"name": "halaxa/json-machine",
- "version": "1.2.5",
+ "version": "1.2.6",
"source": {
"type": "git",
"url": "https://github.com/halaxa/json-machine.git",
- "reference": "d0f84abf79ac98145d478b66d2bcf363d706477c"
+ "reference": "8bf0b0ff6ff60ab480778eaa5ad7d505b442c2d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/halaxa/json-machine/zipball/d0f84abf79ac98145d478b66d2bcf363d706477c",
- "reference": "d0f84abf79ac98145d478b66d2bcf363d706477c",
+ "url": "https://api.github.com/repos/halaxa/json-machine/zipball/8bf0b0ff6ff60ab480778eaa5ad7d505b442c2d4",
+ "reference": "8bf0b0ff6ff60ab480778eaa5ad7d505b442c2d4",
"shasum": ""
},
"require": {
- "php": "7.2 - 8.4"
+ "php": "7.2 - 8.5"
},
"require-dev": {
"ext-json": "*",
@@ -1189,7 +1189,7 @@
"description": "Efficient, easy-to-use and fast JSON pull parser",
"support": {
"issues": "https://github.com/halaxa/json-machine/issues",
- "source": "https://github.com/halaxa/json-machine/tree/1.2.5"
+ "source": "https://github.com/halaxa/json-machine/tree/1.2.6"
},
"funding": [
{
@@ -1197,7 +1197,7 @@
"type": "other"
}
],
- "time": "2025-07-07T13:38:34+00:00"
+ "time": "2025-12-05T14:53:09+00:00"
},
{
"name": "meilisearch/meilisearch-php",
@@ -1384,16 +1384,16 @@
},
{
"name": "open-telemetry/api",
- "version": "1.7.0",
+ "version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/opentelemetry-php/api.git",
- "reference": "610b79ad9d6d97e8368bcb6c4d42394fbb87b522"
+ "reference": "45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/610b79ad9d6d97e8368bcb6c4d42394fbb87b522",
- "reference": "610b79ad9d6d97e8368bcb6c4d42394fbb87b522",
+ "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4",
+ "reference": "45bda7efa8fcdd9bdb0daa2f26c8e31f062f49d4",
"shasum": ""
},
"require": {
@@ -1413,7 +1413,7 @@
]
},
"branch-alias": {
- "dev-main": "1.7.x-dev"
+ "dev-main": "1.8.x-dev"
}
},
"autoload": {
@@ -1446,11 +1446,11 @@
],
"support": {
"chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V",
- "docs": "https://opentelemetry.io/docs/php",
+ "docs": "https://opentelemetry.io/docs/languages/php",
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php"
},
- "time": "2025-10-02T23:44:28+00:00"
+ "time": "2025-10-19T10:49:48+00:00"
},
{
"name": "open-telemetry/context",
@@ -2517,16 +2517,16 @@
},
{
"name": "symfony/console",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
"shasum": ""
},
"require": {
@@ -2534,7 +2534,7 @@
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2"
+ "symfony/string": "^7.2|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
@@ -2548,16 +2548,16 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2591,7 +2591,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.6"
+ "source": "https://github.com/symfony/console/tree/v7.4.1"
},
"funding": [
{
@@ -2611,7 +2611,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-04T01:21:42+00:00"
+ "time": "2025-12-05T15:23:39+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -2682,16 +2682,16 @@
},
{
"name": "symfony/http-client",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de"
+ "reference": "26cc224ea7103dda90e9694d9e139a389092d007"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de",
- "reference": "3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/26cc224ea7103dda90e9694d9e139a389092d007",
+ "reference": "26cc224ea7103dda90e9694d9e139a389092d007",
"shasum": ""
},
"require": {
@@ -2722,12 +2722,13 @@
"php-http/httplug": "^1.0|^2.0",
"psr/http-client": "^1.0",
"symfony/amphp-http-client-meta": "^1.0|^2.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/rate-limiter": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0"
+ "symfony/cache": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/rate-limiter": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2758,7 +2759,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v7.3.6"
+ "source": "https://github.com/symfony/http-client/tree/v7.4.1"
},
"funding": [
{
@@ -2778,7 +2779,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-05T17:41:46+00:00"
+ "time": "2025-12-04T21:12:57+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -2860,23 +2861,22 @@
},
{
"name": "symfony/http-foundation",
- "version": "v7.3.7",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4"
+ "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/db488a62f98f7a81d5746f05eea63a74e55bb7c4",
- "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bd1af1e425811d6f077db240c3a588bdb405cd27",
+ "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27",
"shasum": ""
},
"require": {
"php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3.0",
- "symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php83": "^1.27"
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "^1.1"
},
"conflict": {
"doctrine/dbal": "<3.6",
@@ -2885,13 +2885,13 @@
"require-dev": {
"doctrine/dbal": "^3.6|^4",
"predis/predis": "^1.1|^2.0",
- "symfony/cache": "^6.4.12|^7.1.5",
- "symfony/clock": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/expression-language": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/mime": "^6.4|^7.0",
- "symfony/rate-limiter": "^6.4|^7.0"
+ "symfony/cache": "^6.4.12|^7.1.5|^8.0",
+ "symfony/clock": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/expression-language": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/mime": "^6.4|^7.0|^8.0",
+ "symfony/rate-limiter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2919,7 +2919,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v7.3.7"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.4.1"
},
"funding": [
{
@@ -2939,7 +2939,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-08T16:41:12+00:00"
+ "time": "2025-12-07T11:13:10+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -3688,22 +3688,23 @@
},
{
"name": "symfony/string",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -3711,11 +3712,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3754,7 +3755,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
},
"funding": [
{
@@ -3774,27 +3775,27 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T14:36:48+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "ec25870502d0c7072d086e8ffba1420c85965174"
+ "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174",
- "reference": "ec25870502d0c7072d086e8ffba1420c85965174",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68",
+ "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/translation-contracts": "^2.5|^3.0"
+ "symfony/translation-contracts": "^2.5.3|^3.3"
},
"conflict": {
"nikic/php-parser": "<5.0",
@@ -3813,17 +3814,17 @@
"require-dev": {
"nikic/php-parser": "^5.0",
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/console": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/finder": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/finder": "^6.4|^7.0|^8.0",
"symfony/http-client-contracts": "^2.5|^3.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/polyfill-intl-icu": "^1.21",
- "symfony/routing": "^6.4|^7.0",
+ "symfony/routing": "^6.4|^7.0|^8.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/yaml": "^6.4|^7.0"
+ "symfony/yaml": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3854,7 +3855,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.3.4"
+ "source": "https://github.com/symfony/translation/tree/v7.4.0"
},
"funding": [
{
@@ -3874,7 +3875,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-07T11:39:36+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -3960,16 +3961,16 @@
},
{
"name": "symfony/uid",
- "version": "v7.3.1",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb"
+ "reference": "2498e9f81b7baa206f44de583f2f48350b90142c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb",
- "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c",
+ "reference": "2498e9f81b7baa206f44de583f2f48350b90142c",
"shasum": ""
},
"require": {
@@ -3977,7 +3978,7 @@
"symfony/polyfill-uuid": "^1.15"
},
"require-dev": {
- "symfony/console": "^6.4|^7.0"
+ "symfony/console": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -4014,7 +4015,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v7.3.1"
+ "source": "https://github.com/symfony/uid/tree/v7.4.0"
},
"funding": [
{
@@ -4025,12 +4026,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-06-27T19:55:54+00:00"
+ "time": "2025-09-25T11:02:55+00:00"
},
{
"name": "webmozart/glob",
@@ -4340,16 +4345,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.6.2",
+ "version": "v5.7.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb"
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
"shasum": ""
},
"require": {
@@ -4392,9 +4397,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
},
- "time": "2025-10-21T19:32:17+00:00"
+ "time": "2025-12-06T11:56:16+00:00"
},
{
"name": "nyholm/psr7",
@@ -4476,16 +4481,16 @@
},
{
"name": "php-http/client-common",
- "version": "2.7.2",
+ "version": "2.7.3",
"source": {
"type": "git",
"url": "https://github.com/php-http/client-common.git",
- "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
+ "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
- "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/dcc6de29c90dd74faab55f71b79d89409c4bf0c1",
+ "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1",
"shasum": ""
},
"require": {
@@ -4495,15 +4500,13 @@
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0 || ^2.0",
- "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0 || ^8.0",
"symfony/polyfill-php80": "^1.17"
},
"require-dev": {
"doctrine/instantiator": "^1.1",
"guzzlehttp/psr7": "^1.4",
"nyholm/psr7": "^1.2",
- "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
- "phpspec/prophecy": "^1.10.2",
"phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
},
"suggest": {
@@ -4539,33 +4542,33 @@
],
"support": {
"issues": "https://github.com/php-http/client-common/issues",
- "source": "https://github.com/php-http/client-common/tree/2.7.2"
+ "source": "https://github.com/php-http/client-common/tree/2.7.3"
},
- "time": "2024-09-24T06:21:48+00:00"
+ "time": "2025-11-29T19:12:34+00:00"
},
{
"name": "php-http/curl-client",
- "version": "2.3.3",
+ "version": "2.4.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/curl-client.git",
- "reference": "f3eb48d266341afec0229a7a37a03521d3646b81"
+ "reference": "f59d6992065f44be8b8fb484dd678a919c27dbf2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-http/curl-client/zipball/f3eb48d266341afec0229a7a37a03521d3646b81",
- "reference": "f3eb48d266341afec0229a7a37a03521d3646b81",
+ "url": "https://api.github.com/repos/php-http/curl-client/zipball/f59d6992065f44be8b8fb484dd678a919c27dbf2",
+ "reference": "f59d6992065f44be8b8fb484dd678a919c27dbf2",
"shasum": ""
},
"require": {
"ext-curl": "*",
- "php": "^7.4 || ^8.0",
+ "php": "^8.1",
"php-http/discovery": "^1.6",
"php-http/httplug": "^2.0",
"php-http/message": "^1.2",
"psr/http-client": "^1.0",
"psr/http-factory-implementation": "^1.0",
- "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0"
},
"provide": {
"php-http/async-client-implementation": "1.0",
@@ -4575,9 +4578,9 @@
"require-dev": {
"guzzlehttp/psr7": "^2.0",
"laminas/laminas-diactoros": "^2.0 || ^3.0",
- "php-http/client-integration-tests": "^3.0",
+ "php-http/client-integration-tests": "^4.0",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^7.5 || ^9.4"
+ "phpunit/phpunit": "^9.6.17 || ^10.0 || ^11.0 || ^12.0"
},
"type": "library",
"autoload": {
@@ -4604,9 +4607,9 @@
],
"support": {
"issues": "https://github.com/php-http/curl-client/issues",
- "source": "https://github.com/php-http/curl-client/tree/2.3.3"
+ "source": "https://github.com/php-http/curl-client/tree/2.4.0"
},
- "time": "2024-10-31T07:36:58+00:00"
+ "time": "2025-12-09T12:02:56+00:00"
},
{
"name": "php-http/message",
@@ -4895,16 +4898,16 @@
},
{
"name": "symfony/cache",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701"
+ "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/1277a1ec61c8d93ea61b2a59738f1deb9bfb6701",
- "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/21e0755783bbbab58f2bb6a7a57896d21d27a366",
+ "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366",
"shasum": ""
},
"require": {
@@ -4912,12 +4915,14 @@
"psr/cache": "^2.0|^3.0",
"psr/log": "^1.1|^2|^3",
"symfony/cache-contracts": "^3.6",
- "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"conflict": {
"doctrine/dbal": "<3.6",
+ "ext-redis": "<6.1",
+ "ext-relay": "<0.12.1",
"symfony/dependency-injection": "<6.4",
"symfony/http-kernel": "<6.4",
"symfony/var-dumper": "<6.4"
@@ -4932,13 +4937,13 @@
"doctrine/dbal": "^3.6|^4",
"predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
- "symfony/clock": "^6.4|^7.0",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/filesystem": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/clock": "^6.4|^7.0|^8.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/filesystem": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -4973,7 +4978,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v7.3.6"
+ "source": "https://github.com/symfony/cache/tree/v7.4.1"
},
"funding": [
{
@@ -4993,7 +4998,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-30T13:22:58+00:00"
+ "time": "2025-12-04T18:11:45+00:00"
},
{
"name": "symfony/cache-contracts",
@@ -5073,16 +5078,16 @@
},
{
"name": "symfony/dotenv",
- "version": "v7.3.2",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
- "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a"
+ "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dotenv/zipball/2192790a11f9e22cbcf9dc705a3ff22a5503923a",
- "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/1658a4d34df028f3d93bcdd8e81f04423925a364",
+ "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364",
"shasum": ""
},
"require": {
@@ -5093,8 +5098,8 @@
"symfony/process": "<6.4"
},
"require-dev": {
- "symfony/console": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0"
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5127,7 +5132,7 @@
"environment"
],
"support": {
- "source": "https://github.com/symfony/dotenv/tree/v7.3.2"
+ "source": "https://github.com/symfony/dotenv/tree/v7.4.0"
},
"funding": [
{
@@ -5147,27 +5152,27 @@
"type": "tidelift"
}
],
- "time": "2025-07-10T08:29:33+00:00"
+ "time": "2025-11-16T10:14:42+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0"
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5195,7 +5200,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.3.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
"funding": [
{
@@ -5215,20 +5220,20 @@
"type": "tidelift"
}
],
- "time": "2025-10-15T18:45:57+00:00"
+ "time": "2025-11-05T05:42:40+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v7.3.3",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80",
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80",
"shasum": ""
},
"require": {
@@ -5266,7 +5271,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.4.0"
},
"funding": [
{
@@ -5286,7 +5291,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-05T10:16:07+00:00"
+ "time": "2025-11-12T15:39:26+00:00"
},
{
"name": "symfony/polyfill-php80",
@@ -5374,16 +5379,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
@@ -5415,7 +5420,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.4"
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
},
"funding": [
{
@@ -5435,20 +5440,20 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-10-16T11:21:06+00:00"
},
{
"name": "symfony/var-exporter",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
- "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4"
+ "reference": "03a60f169c79a28513a78c967316fbc8bf17816f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4",
- "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f",
+ "reference": "03a60f169c79a28513a78c967316fbc8bf17816f",
"shasum": ""
},
"require": {
@@ -5456,9 +5461,9 @@
"symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
- "symfony/property-access": "^6.4|^7.0",
- "symfony/serializer": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/property-access": "^6.4|^7.0|^8.0",
+ "symfony/serializer": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5496,7 +5501,7 @@
"serialize"
],
"support": {
- "source": "https://github.com/symfony/var-exporter/tree/v7.3.4"
+ "source": "https://github.com/symfony/var-exporter/tree/v7.4.0"
},
"funding": [
{
@@ -5516,7 +5521,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-09-11T10:15:23+00:00"
}
],
"aliases": [],
@@ -5535,6 +5540,7 @@
"ext-xmlreader": "*",
"ext-xmlwriter": "*",
"ext-zlib": "*",
+ "ext-pgsql": "*",
"composer-runtime-api": "^2.1"
},
"platform-dev": {},
diff --git a/manifest.json b/manifest.json
index 5be717984..d7463346b 100644
--- a/manifest.json
+++ b/manifest.json
@@ -76,6 +76,11 @@
"path": "src/adapter/etl-adapter-xml",
"type": "adapter"
},
+ {
+ "name" : "flow-php/etl-adapter-excel",
+ "path": "src/adapter/etl-adapter-excel",
+ "type": "adapter"
+ },
{
"name" : "flow-php/filesystem-async-aws-bridge",
"path": "src/bridge/filesystem/async-aws",
@@ -96,6 +101,11 @@
"path": "src/bridge/symfony/http-foundation",
"type": "bridge"
},
+ {
+ "name" : "flow-php/openapi-specification-bridge",
+ "path": "src/bridge/openapi/specification",
+ "type": "bridge"
+ },
{
"name" : "flow-php/array-dot",
"path": "src/lib/array-dot",
@@ -140,6 +150,11 @@
"name" : "flow-php/types",
"path": "src/lib/types",
"type": "lib"
+ },
+ {
+ "name" : "flow-php/postgresql",
+ "path": "src/lib/postgresql",
+ "type": "lib"
}
]
}
\ No newline at end of file
diff --git a/rector.src.php b/rector.src.php
index 8a6792383..a5d92cc7a 100644
--- a/rector.src.php
+++ b/rector.src.php
@@ -3,9 +3,9 @@
use Rector\Config\RectorConfig;
use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector;
use Rector\Set\ValueObject\LevelSetList;
-use Rector\CodingStyle\Rector\FunctionLike\FunctionLikeToFirstClassCallableRector;
use Rector\CodingStyle\Rector\FuncCall\FunctionFirstClassCallableRector;
use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector;
+use Rector\CodingStyle\Rector\ArrowFunction\ArrowFunctionDelegatingCallToFirstClassCallableRector;
return RectorConfig::configure()
->withPaths([
@@ -22,7 +22,7 @@
->withSkip([
RemoveExtraParametersRector::class,
FunctionFirstClassCallableRector::class,
- FunctionLikeToFirstClassCallableRector::class,
+ ArrowFunctionDelegatingCallToFirstClassCallableRector::class,
StringClassNameToClassConstantRector::class,
__DIR__ . '/src/lib/parquet/src/Flow/Parquet/ThriftModel/*',
])
diff --git a/rector.tests.php b/rector.tests.php
index cd93f5b36..6ace19726 100644
--- a/rector.tests.php
+++ b/rector.tests.php
@@ -76,7 +76,6 @@
use Rector\PHPUnit\AnnotationsToAttributes\Rector\ClassMethod\DataProviderAnnotationToAttributeRector;
use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector;
use Rector\CodingStyle\Rector\FuncCall\FunctionFirstClassCallableRector;
-use Rector\CodingStyle\Rector\FunctionLike\FunctionLikeToFirstClassCallableRector;
use Flow\Filesystem\Path;
use Flow\ETL\Window;
use Flow\ETL\Function\RowNumber;
@@ -84,6 +83,7 @@
use Flow\ETL\Function\Max;
use Flow\ETL\Function\Sum;
use Flow\ETL\Function\Average;
+use Rector\CodingStyle\Rector\ArrowFunction\ArrowFunctionDelegatingCallToFirstClassCallableRector;
return RectorConfig::configure()
->withPaths([
@@ -219,7 +219,7 @@
RemoveParentCallWithoutParentRector::class,
RemoveExtraParametersRector::class,
FunctionFirstClassCallableRector::class,
- FunctionLikeToFirstClassCallableRector::class,
+ ArrowFunctionDelegatingCallToFirstClassCallableRector::class
])
->withCache(__DIR__ . '/var/rector/tests')
->withSkipPath(__DIR__ . '/src/lib/parquet/src/Flow/Parquet/Thrift')
diff --git a/src/adapter/etl-adapter-doctrine/tests/Flow/ETL/Adapter/Doctrine/Tests/Unit/SchemaConverterTest.php b/src/adapter/etl-adapter-doctrine/tests/Flow/ETL/Adapter/Doctrine/Tests/Unit/SchemaConverterTest.php
index ee9d98dd3..ec8f275f2 100644
--- a/src/adapter/etl-adapter-doctrine/tests/Flow/ETL/Adapter/Doctrine/Tests/Unit/SchemaConverterTest.php
+++ b/src/adapter/etl-adapter-doctrine/tests/Flow/ETL/Adapter/Doctrine/Tests/Unit/SchemaConverterTest.php
@@ -94,6 +94,7 @@ public function test_dbal_schema_to_flow_schema_dbal_36() : void
// We are using it to perform a different assertion since prior to 4.0 all
// columns were also getting precision set to 10 due to a bug that was executing precision set
// even when precision value was null.
+ /** @phpstan-ignore-next-line */
if (!\method_exists(Table::class, 'changeColumn')) {
self::markTestSkipped('Doctrine DBAL >= 3.6+ < 4.0');
}
@@ -146,6 +147,7 @@ public function test_dbal_schema_to_flow_schema_dbal_40() : void
// We are using it to perform a different assertion since prior to 4.0 all
// columns were also getting precision set to 10 due to a bug that was executing precision set
// even when precision value was null.
+ /** @phpstan-ignore-next-line */
if (\method_exists(Table::class, 'changeColumn')) {
self::markTestSkipped('Doctrine DBAL >= 4.0+');
}
diff --git a/src/cli/box.json b/src/cli/box.json
index 7becbeb1e..a30d0fb0d 100644
--- a/src/cli/box.json
+++ b/src/cli/box.json
@@ -11,7 +11,11 @@
"fakerphp",
"mock-client",
"dotenv",
- "var-exporter"
+ "var-exporter",
+ "resources/python",
+ "bin/parquet.php",
+ "CONTRIBUTING.md",
+ "README.md"
],
"check-requirements": false,
"compression": "GZ",
diff --git a/src/cli/tests/Flow/CLI/Tests/Integration/DatabaseTableSchemaCommandTest.php b/src/cli/tests/Flow/CLI/Tests/Integration/DatabaseTableSchemaCommandTest.php
index c0f01ea2e..47587c5e9 100644
--- a/src/cli/tests/Flow/CLI/Tests/Integration/DatabaseTableSchemaCommandTest.php
+++ b/src/cli/tests/Flow/CLI/Tests/Integration/DatabaseTableSchemaCommandTest.php
@@ -69,6 +69,7 @@ public function test_run_db_table_list() : void
// We are using it to perform a different assertion since prior to 4.0 all
// columns were also getting precision set to 10 due to a bug that was executing precision set
// even when precision value was null.
+ /** @phpstan-ignore-next-line */
if (!\method_exists(Table::class, 'changeColumn')) {
self::assertSame(
<<<'PHP'
@@ -99,6 +100,7 @@ public function test_run_db_table_list() : void
public function test_selecting_specific_columns_only() : void
{
// We don't need to test this edge case on doctrine/dbal below version 4.0 since the logic does not change.
+ /** @phpstan-ignore-next-line */
if (\method_exists(Table::class, 'changeColumn')) {
$this->markTestSkipped('This test is not supported in doctrine/dbal 4.0');
}
@@ -140,6 +142,7 @@ public function test_selecting_specific_columns_only() : void
public function test_selecting_not_existing_column() : void
{
// We don't need to test this edge case on doctrine/dbal below version 4.0 since the logic does not change.
+ /** @phpstan-ignore-next-line */
if (\method_exists(Table::class, 'changeColumn')) {
$this->markTestSkipped('This test is not supported in doctrine/dbal 4.0');
}
diff --git a/tools/blackfire/composer.lock b/tools/blackfire/composer.lock
index 7456ec8c4..da0e35a95 100644
--- a/tools/blackfire/composer.lock
+++ b/tools/blackfire/composer.lock
@@ -85,16 +85,16 @@
},
{
"name": "composer/ca-bundle",
- "version": "1.5.9",
+ "version": "1.5.10",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54"
+ "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/1905981ee626e6f852448b7aaa978f8666c5bc54",
- "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63",
+ "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63",
"shasum": ""
},
"require": {
@@ -141,7 +141,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.9"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.10"
},
"funding": [
{
@@ -153,7 +153,7 @@
"type": "github"
}
],
- "time": "2025-11-06T11:46:17+00:00"
+ "time": "2025-12-08T15:06:51+00:00"
}
],
"aliases": [],
diff --git a/tools/box/composer.lock b/tools/box/composer.lock
index 0d1568426..d21419a66 100644
--- a/tools/box/composer.lock
+++ b/tools/box/composer.lock
@@ -319,16 +319,16 @@
},
{
"name": "amphp/parallel",
- "version": "v2.3.2",
+ "version": "v2.3.3",
"source": {
"type": "git",
"url": "https://github.com/amphp/parallel.git",
- "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce"
+ "reference": "296b521137a54d3a02425b464e5aee4c93db2c60"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce",
- "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce",
+ "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60",
+ "reference": "296b521137a54d3a02425b464e5aee4c93db2c60",
"shasum": ""
},
"require": {
@@ -391,7 +391,7 @@
],
"support": {
"issues": "https://github.com/amphp/parallel/issues",
- "source": "https://github.com/amphp/parallel/tree/v2.3.2"
+ "source": "https://github.com/amphp/parallel/tree/v2.3.3"
},
"funding": [
{
@@ -399,7 +399,7 @@
"type": "github"
}
],
- "time": "2025-08-27T21:55:40+00:00"
+ "time": "2025-11-15T06:23:42+00:00"
},
{
"name": "amphp/parser",
@@ -1528,21 +1528,21 @@
},
{
"name": "justinrainbow/json-schema",
- "version": "6.6.1",
+ "version": "6.6.3",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "fd8e5c6b1badb998844ad34ce0abcd71a0aeb396"
+ "reference": "134e98916fa2f663afa623970af345cd788e8967"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fd8e5c6b1badb998844ad34ce0abcd71a0aeb396",
- "reference": "fd8e5c6b1badb998844ad34ce0abcd71a0aeb396",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/134e98916fa2f663afa623970af345cd788e8967",
+ "reference": "134e98916fa2f663afa623970af345cd788e8967",
"shasum": ""
},
"require": {
"ext-json": "*",
- "marc-mabe/php-enum": "^4.0",
+ "marc-mabe/php-enum": "^4.4",
"php": "^7.2 || ^8.0"
},
"require-dev": {
@@ -1597,9 +1597,9 @@
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.1"
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.3"
},
- "time": "2025-11-07T18:30:29+00:00"
+ "time": "2025-12-02T10:21:33+00:00"
},
{
"name": "kelunik/certificate",
@@ -1661,20 +1661,20 @@
},
{
"name": "league/uri",
- "version": "7.6.0",
+ "version": "7.7.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri.git",
- "reference": "f625804987a0a9112d954f9209d91fec52182344"
+ "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri/zipball/f625804987a0a9112d954f9209d91fec52182344",
- "reference": "f625804987a0a9112d954f9209d91fec52182344",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
+ "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
"shasum": ""
},
"require": {
- "league/uri-interfaces": "^7.6",
+ "league/uri-interfaces": "^7.7",
"php": "^8.1",
"psr/http-factory": "^1"
},
@@ -1747,7 +1747,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri/tree/7.6.0"
+ "source": "https://github.com/thephpleague/uri/tree/7.7.0"
},
"funding": [
{
@@ -1755,20 +1755,20 @@
"type": "github"
}
],
- "time": "2025-11-18T12:17:23+00:00"
+ "time": "2025-12-07T16:02:06+00:00"
},
{
"name": "league/uri-interfaces",
- "version": "7.6.0",
+ "version": "7.7.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri-interfaces.git",
- "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368"
+ "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/ccbfb51c0445298e7e0b7f4481b942f589665368",
- "reference": "ccbfb51c0445298e7e0b7f4481b942f589665368",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
+ "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
"shasum": ""
},
"require": {
@@ -1831,7 +1831,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri-interfaces/tree/7.6.0"
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0"
},
"funding": [
{
@@ -1839,7 +1839,7 @@
"type": "github"
}
],
- "time": "2025-11-18T12:17:23+00:00"
+ "time": "2025-12-07T16:03:21+00:00"
},
{
"name": "marc-mabe/php-enum",
@@ -1968,16 +1968,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.6.2",
+ "version": "v5.7.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb"
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
"shasum": ""
},
"require": {
@@ -2020,9 +2020,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
},
- "time": "2025-10-21T19:32:17+00:00"
+ "time": "2025-12-06T11:56:16+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -2079,16 +2079,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "5.6.4",
+ "version": "5.6.5",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "90a04bcbf03784066f16038e87e23a0a83cee3c2"
+ "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90a04bcbf03784066f16038e87e23a0a83cee3c2",
- "reference": "90a04bcbf03784066f16038e87e23a0a83cee3c2",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761",
+ "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761",
"shasum": ""
},
"require": {
@@ -2137,9 +2137,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.4"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.5"
},
- "time": "2025-11-17T21:13:10+00:00"
+ "time": "2025-11-27T19:50:05+00:00"
},
{
"name": "phpdocumentor/type-resolver",
@@ -2509,16 +2509,16 @@
},
{
"name": "revolt/event-loop",
- "version": "v1.0.7",
+ "version": "v1.0.8",
"source": {
"type": "git",
"url": "https://github.com/revoltphp/event-loop.git",
- "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3"
+ "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3",
- "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3",
+ "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c",
+ "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c",
"shasum": ""
},
"require": {
@@ -2575,9 +2575,9 @@
],
"support": {
"issues": "https://github.com/revoltphp/event-loop/issues",
- "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7"
+ "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8"
},
- "time": "2025-01-25T19:27:39+00:00"
+ "time": "2025-08-27T21:33:23+00:00"
},
{
"name": "sebastian/diff",
@@ -2760,16 +2760,16 @@
},
{
"name": "symfony/console",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
"shasum": ""
},
"require": {
@@ -2777,7 +2777,7 @@
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2"
+ "symfony/string": "^7.2|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
@@ -2791,16 +2791,16 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2834,7 +2834,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.6"
+ "source": "https://github.com/symfony/console/tree/v7.4.1"
},
"funding": [
{
@@ -2854,7 +2854,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-04T01:21:42+00:00"
+ "time": "2025-12-05T15:23:39+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -3001,16 +3001,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.3.6",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
"shasum": ""
},
"require": {
@@ -3019,7 +3019,7 @@
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^6.4|^7.0"
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3047,7 +3047,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.3.6"
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
},
"funding": [
{
@@ -3067,27 +3067,27 @@
"type": "tidelift"
}
],
- "time": "2025-11-05T09:52:27+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0"
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3115,7 +3115,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.3.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
"funding": [
{
@@ -3135,7 +3135,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-15T18:45:57+00:00"
+ "time": "2025-11-05T05:42:40+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -3638,16 +3638,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
@@ -3679,7 +3679,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.4"
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
},
"funding": [
{
@@ -3699,7 +3699,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-10-16T11:21:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -3790,22 +3790,23 @@
},
{
"name": "symfony/string",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -3813,11 +3814,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3856,7 +3857,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
},
"funding": [
{
@@ -3876,20 +3877,20 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T14:36:48+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d"
+ "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/476c4ae17f43a9a36650c69879dcf5b1e6ae724d",
- "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece",
+ "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece",
"shasum": ""
},
"require": {
@@ -3901,10 +3902,10 @@
"symfony/console": "<6.4"
},
"require-dev": {
- "symfony/console": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/uid": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/uid": "^6.4|^7.0|^8.0",
"twig/twig": "^3.12"
},
"bin": [
@@ -3943,7 +3944,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.3.5"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.4.0"
},
"funding": [
{
@@ -3963,7 +3964,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-27T09:00:46+00:00"
+ "time": "2025-10-27T20:36:44+00:00"
},
{
"name": "thecodingmachine/safe",
diff --git a/tools/cs-fixer/composer.lock b/tools/cs-fixer/composer.lock
index e53862599..e45e2ed2c 100644
--- a/tools/cs-fixer/composer.lock
+++ b/tools/cs-fixer/composer.lock
@@ -403,16 +403,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
- "version": "v3.90.0",
+ "version": "v3.91.3",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "ad732c2e9299c9743f9c55ae53cc0e7642ab1155"
+ "reference": "9f10aa6390cea91da175ea608880e942d7c0226e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ad732c2e9299c9743f9c55ae53cc0e7642ab1155",
- "reference": "ad732c2e9299c9743f9c55ae53cc0e7642ab1155",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/9f10aa6390cea91da175ea608880e942d7c0226e",
+ "reference": "9f10aa6390cea91da175ea608880e942d7c0226e",
"shasum": ""
},
"require": {
@@ -468,7 +468,7 @@
"PhpCsFixer\\": "src/"
},
"exclude-from-classmap": [
- "src/Fixer/Internal/*"
+ "src/**/Internal/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -494,7 +494,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.90.0"
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.91.3"
},
"funding": [
{
@@ -502,7 +502,7 @@
"type": "github"
}
],
- "time": "2025-11-20T15:15:16+00:00"
+ "time": "2025-12-05T19:45:37+00:00"
},
{
"name": "psr/container",
@@ -1252,16 +1252,16 @@
},
{
"name": "symfony/console",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
"shasum": ""
},
"require": {
@@ -1269,7 +1269,7 @@
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2"
+ "symfony/string": "^7.2|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
@@ -1283,16 +1283,16 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1326,7 +1326,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.6"
+ "source": "https://github.com/symfony/console/tree/v7.4.1"
},
"funding": [
{
@@ -1346,7 +1346,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-04T01:21:42+00:00"
+ "time": "2025-12-05T15:23:39+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1417,16 +1417,16 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v7.3.3",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191"
+ "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191",
- "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d",
+ "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d",
"shasum": ""
},
"require": {
@@ -1443,13 +1443,14 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/error-handler": "^6.4|^7.0",
- "symfony/expression-language": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/error-handler": "^6.4|^7.0|^8.0",
+ "symfony/expression-language": "^6.4|^7.0|^8.0",
+ "symfony/framework-bundle": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/stopwatch": "^6.4|^7.0"
+ "symfony/stopwatch": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1477,7 +1478,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0"
},
"funding": [
{
@@ -1497,7 +1498,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-13T11:49:31+00:00"
+ "time": "2025-10-28T09:38:46+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -1577,16 +1578,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.3.6",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
"shasum": ""
},
"require": {
@@ -1595,7 +1596,7 @@
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^6.4|^7.0"
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1623,7 +1624,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.3.6"
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
},
"funding": [
{
@@ -1643,27 +1644,27 @@
"type": "tidelift"
}
],
- "time": "2025-11-05T09:52:27+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0"
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1691,7 +1692,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.3.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
"funding": [
{
@@ -1711,20 +1712,20 @@
"type": "tidelift"
}
],
- "time": "2025-10-15T18:45:57+00:00"
+ "time": "2025-11-05T05:42:40+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v7.3.3",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80",
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80",
"shasum": ""
},
"require": {
@@ -1762,7 +1763,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.4.0"
},
"funding": [
{
@@ -1782,7 +1783,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-05T10:16:07+00:00"
+ "time": "2025-11-12T15:39:26+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -2365,16 +2366,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
@@ -2406,7 +2407,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.4"
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
},
"funding": [
{
@@ -2426,7 +2427,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-10-16T11:21:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2517,16 +2518,16 @@
},
{
"name": "symfony/stopwatch",
- "version": "v7.3.0",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd"
+ "reference": "8a24af0a2e8a872fb745047180649b8418303084"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd",
- "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084",
+ "reference": "8a24af0a2e8a872fb745047180649b8418303084",
"shasum": ""
},
"require": {
@@ -2559,7 +2560,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v7.3.0"
+ "source": "https://github.com/symfony/stopwatch/tree/v7.4.0"
},
"funding": [
{
@@ -2570,31 +2571,36 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-02-24T10:49:57+00:00"
+ "time": "2025-08-04T07:05:15+00:00"
},
{
"name": "symfony/string",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -2602,11 +2608,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2645,7 +2651,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
},
"funding": [
{
@@ -2665,7 +2671,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T14:36:48+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
}
],
"aliases": [],
diff --git a/tools/infection/composer.lock b/tools/infection/composer.lock
index b13ea171c..361488365 100644
--- a/tools/infection/composer.lock
+++ b/tools/infection/composer.lock
@@ -664,21 +664,21 @@
},
{
"name": "justinrainbow/json-schema",
- "version": "6.6.1",
+ "version": "6.6.3",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "fd8e5c6b1badb998844ad34ce0abcd71a0aeb396"
+ "reference": "134e98916fa2f663afa623970af345cd788e8967"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fd8e5c6b1badb998844ad34ce0abcd71a0aeb396",
- "reference": "fd8e5c6b1badb998844ad34ce0abcd71a0aeb396",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/134e98916fa2f663afa623970af345cd788e8967",
+ "reference": "134e98916fa2f663afa623970af345cd788e8967",
"shasum": ""
},
"require": {
"ext-json": "*",
- "marc-mabe/php-enum": "^4.0",
+ "marc-mabe/php-enum": "^4.4",
"php": "^7.2 || ^8.0"
},
"require-dev": {
@@ -733,9 +733,9 @@
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.1"
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.3"
},
- "time": "2025-11-07T18:30:29+00:00"
+ "time": "2025-12-02T10:21:33+00:00"
},
{
"name": "marc-mabe/php-enum",
@@ -812,16 +812,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.6.2",
+ "version": "v5.7.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb"
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
"shasum": ""
},
"require": {
@@ -864,9 +864,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
},
- "time": "2025-10-21T19:32:17+00:00"
+ "time": "2025-12-06T11:56:16+00:00"
},
{
"name": "ondram/ci-detector",
@@ -1437,16 +1437,16 @@
},
{
"name": "symfony/console",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
"shasum": ""
},
"require": {
@@ -1454,7 +1454,7 @@
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2"
+ "symfony/string": "^7.2|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
@@ -1468,16 +1468,16 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1511,7 +1511,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.6"
+ "source": "https://github.com/symfony/console/tree/v7.4.1"
},
"funding": [
{
@@ -1531,7 +1531,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-04T01:21:42+00:00"
+ "time": "2025-12-05T15:23:39+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1602,16 +1602,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.3.6",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
"shasum": ""
},
"require": {
@@ -1620,7 +1620,7 @@
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^6.4|^7.0"
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1648,7 +1648,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.3.6"
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
},
"funding": [
{
@@ -1668,27 +1668,27 @@
"type": "tidelift"
}
],
- "time": "2025-11-05T09:52:27+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0"
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1716,7 +1716,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.3.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
"funding": [
{
@@ -1736,7 +1736,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-15T18:45:57+00:00"
+ "time": "2025-11-05T05:42:40+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -2075,16 +2075,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
@@ -2116,7 +2116,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.4"
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
},
"funding": [
{
@@ -2136,7 +2136,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-10-16T11:21:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2227,22 +2227,23 @@
},
{
"name": "symfony/string",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -2250,11 +2251,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -2293,7 +2294,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
},
"funding": [
{
@@ -2313,7 +2314,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T14:36:48+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "thecodingmachine/safe",
diff --git a/tools/phpbench/composer.lock b/tools/phpbench/composer.lock
index 51af7d6df..d52a9dba4 100644
--- a/tools/phpbench/composer.lock
+++ b/tools/phpbench/composer.lock
@@ -528,16 +528,16 @@
},
{
"name": "symfony/console",
- "version": "v7.3.6",
+ "version": "v7.4.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
- "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
+ "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e",
"shasum": ""
},
"require": {
@@ -545,7 +545,7 @@
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2"
+ "symfony/string": "^7.2|^8.0"
},
"conflict": {
"symfony/dependency-injection": "<6.4",
@@ -559,16 +559,16 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/event-dispatcher": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/process": "^6.4|^7.0",
- "symfony/stopwatch": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0"
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -602,7 +602,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.6"
+ "source": "https://github.com/symfony/console/tree/v7.4.1"
},
"funding": [
{
@@ -622,7 +622,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-04T01:21:42+00:00"
+ "time": "2025-12-05T15:23:39+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -693,16 +693,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.3.6",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
- "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
"shasum": ""
},
"require": {
@@ -711,7 +711,7 @@
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^6.4|^7.0"
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -739,7 +739,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.3.6"
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
},
"funding": [
{
@@ -759,27 +759,27 @@
"type": "tidelift"
}
],
- "time": "2025-11-05T09:52:27+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.3.5",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f"
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
- "reference": "9f696d2f1e340484b4683f7853b273abff94421f",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0"
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -807,7 +807,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.3.5"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
"funding": [
{
@@ -827,20 +827,20 @@
"type": "tidelift"
}
],
- "time": "2025-10-15T18:45:57+00:00"
+ "time": "2025-11-05T05:42:40+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v7.3.3",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
- "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80",
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80",
"shasum": ""
},
"require": {
@@ -878,7 +878,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.4.0"
},
"funding": [
{
@@ -898,7 +898,7 @@
"type": "tidelift"
}
],
- "time": "2025-08-05T10:16:07+00:00"
+ "time": "2025-11-12T15:39:26+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -1237,16 +1237,16 @@
},
{
"name": "symfony/process",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b"
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b",
- "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
@@ -1278,7 +1278,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.3.4"
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
},
"funding": [
{
@@ -1298,7 +1298,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T10:12:26+00:00"
+ "time": "2025-10-16T11:21:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -1389,22 +1389,23 @@
},
{
"name": "symfony/string",
- "version": "v7.3.4",
+ "version": "v7.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
"shasum": ""
},
"require": {
"php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-grapheme": "~1.33",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
@@ -1412,11 +1413,11 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -1455,7 +1456,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
},
"funding": [
{
@@ -1475,7 +1476,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-11T14:36:48+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
"name": "webmozart/glob",
diff --git a/tools/phpstan/composer.lock b/tools/phpstan/composer.lock
index 086ba6808..fd915112f 100644
--- a/tools/phpstan/composer.lock
+++ b/tools/phpstan/composer.lock
@@ -9,11 +9,11 @@
"packages-dev": [
{
"name": "phpstan/phpstan",
- "version": "2.1.32",
+ "version": "2.1.33",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227",
- "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f",
+ "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f",
"shasum": ""
},
"require": {
@@ -58,7 +58,7 @@
"type": "github"
}
],
- "time": "2025-11-11T15:18:17+00:00"
+ "time": "2025-12-05T10:24:31+00:00"
},
{
"name": "spaze/phpstan-disallowed-calls",
diff --git a/tools/phpunit/composer.lock b/tools/phpunit/composer.lock
index 331cc00b1..d8ebacd2c 100644
--- a/tools/phpunit/composer.lock
+++ b/tools/phpunit/composer.lock
@@ -69,16 +69,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.6.2",
+ "version": "v5.7.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb"
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
- "reference": "3a454ca033b9e06b63282ce19562e892747449bb",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
"shasum": ""
},
"require": {
@@ -121,9 +121,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
},
- "time": "2025-10-21T19:32:17+00:00"
+ "time": "2025-12-06T11:56:16+00:00"
},
{
"name": "phar-io/manifest",
@@ -580,16 +580,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.5.44",
+ "version": "11.5.46",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c346885c95423eda3f65d85a194aaa24873cda82"
+ "reference": "75dfe79a2aa30085b7132bb84377c24062193f33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c346885c95423eda3f65d85a194aaa24873cda82",
- "reference": "c346885c95423eda3f65d85a194aaa24873cda82",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/75dfe79a2aa30085b7132bb84377c24062193f33",
+ "reference": "75dfe79a2aa30085b7132bb84377c24062193f33",
"shasum": ""
},
"require": {
@@ -661,7 +661,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.44"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.46"
},
"funding": [
{
@@ -685,7 +685,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-13T07:17:35+00:00"
+ "time": "2025-12-06T08:01:15+00:00"
},
{
"name": "sebastian/cli-parser",
diff --git a/tools/rector/composer.lock b/tools/rector/composer.lock
index 3ec30c4c7..8dda9cc8c 100644
--- a/tools/rector/composer.lock
+++ b/tools/rector/composer.lock
@@ -9,11 +9,11 @@
"packages-dev": [
{
"name": "phpstan/phpstan",
- "version": "2.1.32",
+ "version": "2.1.33",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227",
- "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f",
+ "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f",
"shasum": ""
},
"require": {
@@ -58,25 +58,25 @@
"type": "github"
}
],
- "time": "2025-11-11T15:18:17+00:00"
+ "time": "2025-12-05T10:24:31+00:00"
},
{
"name": "rector/rector",
- "version": "2.2.8",
+ "version": "2.2.14",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "303aa811649ccd1d32e51e62d5c85949d01b5f1b"
+ "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/303aa811649ccd1d32e51e62d5c85949d01b5f1b",
- "reference": "303aa811649ccd1d32e51e62d5c85949d01b5f1b",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/6d56bb0e94d4df4f57a78610550ac76ab403657d",
+ "reference": "6d56bb0e94d4df4f57a78610550ac76ab403657d",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
- "phpstan/phpstan": "^2.1.32"
+ "phpstan/phpstan": "^2.1.33"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -110,7 +110,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.2.8"
+ "source": "https://github.com/rectorphp/rector/tree/2.2.14"
},
"funding": [
{
@@ -118,7 +118,7 @@
"type": "github"
}
],
- "time": "2025-11-12T18:38:00+00:00"
+ "time": "2025-12-09T10:57:55+00:00"
}
],
"aliases": [],
diff --git a/web/landing/assets/codemirror/completions/dsl.js b/web/landing/assets/codemirror/completions/dsl.js
index 096cf8a97..104272ede 100644
--- a/web/landing/assets/codemirror/completions/dsl.js
+++ b/web/landing/assets/codemirror/completions/dsl.js
@@ -1,7 +1,7 @@
/**
* CodeMirror Completer for Flow PHP DSL Functions
*
- * Total functions: 372
+ * Total functions: 543
*
* This completer provides autocompletion for all Flow PHP DSL functions:
* - Extractors (flow-extractors)
@@ -32,6 +32,114 @@ const dslFunctions = [
},
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",
@@ -47,6 +155,42 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\DSL\\all(" + "$" + "{" + "1:functions" + "}" + ")"),
boost: 10
+ }, {
+ label: "all_sub_selects",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dhelpers",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ all_sub_selects(Expression $left, ComparisonOperator $operator, SelectFinalStep $subquery) : All
+
+
+ Create an ALL condition.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\all_sub_selects(" + "$" + "{" + "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\', sql_type_text()))
Example: alter()->sequence(\'user_id_seq\')->restart(1000)
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\alter()"),
+ boost: 10
}, {
label: "analyze",
type: "function",
@@ -62,6 +206,24 @@ const dslFunctions = [
},
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",
@@ -77,6 +239,24 @@ const dslFunctions = [
},
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",
@@ -95,6 +275,42 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\DSL\\append()"),
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",
@@ -131,6 +347,24 @@ const dslFunctions = [
},
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",
@@ -245,6 +479,24 @@ const dslFunctions = [
},
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",
@@ -350,6 +602,24 @@ const dslFunctions = [
},
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::...) : OrderByItem
+
+
+ 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",
@@ -587,6 +857,24 @@ const dslFunctions = [
},
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",
@@ -602,6 +890,42 @@ const dslFunctions = [
},
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",
@@ -675,7 +999,25 @@ const dslFunctions = [
apply: snippet("\\Flow\\ETL\\DSL\\call(" + "$" + "{" + "1:callable" + "}" + ", " + "$" + "{" + "2:parameters" + "}" + ", " + "$" + "{" + "3:return_type" + "}" + ")"),
boost: 10
}, {
- label: "capitalize",
+ 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: () => {
@@ -689,6 +1031,24 @@ const dslFunctions = [
},
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",
@@ -707,6 +1067,42 @@ const dslFunctions = [
},
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, string $type) : TypeCast
+
+
+ Create a type cast expression.
@param Expression $expr Expression to cast
@param string $type Target type name (can include schema like \"pg_catalog.int4\")
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cast(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ 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",
@@ -725,6 +1121,24 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\DSL\\chunks_from(" + "$" + "{" + "1:extractor" + "}" + ", " + "$" + "{" + "2:chunk_size" + "}" + ")"),
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",
@@ -740,6 +1154,24 @@ const dslFunctions = [
},
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",
@@ -758,6 +1190,24 @@ const dslFunctions = [
},
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",
@@ -788,6 +1238,24 @@ const dslFunctions = [
},
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",
@@ -806,6 +1274,60 @@ const dslFunctions = [
},
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",
@@ -957,211 +1479,355 @@ const dslFunctions = [
apply: snippet("\\Flow\\ETL\\DSL\\concat_ws(" + "$" + "{" + "1:separator" + "}" + ", " + "$" + "{" + "2:functions" + "}" + ")"),
boost: 10
}, {
- label: "config",
+ label: "cond_and",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- config() : Config
+ cond_and(Condition $conditions) : AndCondition
+
+
+ Combine conditions with AND.
@param Condition ...$conditions Conditions to combine
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\config()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_and(" + "$" + "{" + "1:conditions" + "}" + ")"),
boost: 10
}, {
- label: "config_builder",
+ label: "cond_not",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- config_builder() : ConfigBuilder
+ cond_not(Condition $condition) : NotCondition
+
+
+ Negate a condition with NOT.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\config_builder()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_not(" + "$" + "{" + "1:condition" + "}" + ")"),
boost: 10
}, {
- label: "constraint_sorted_by",
+ label: "cond_or",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- constraint_sorted_by(Reference|string $column, Reference|string $columns) : SortedByConstraint
+ cond_or(Condition $conditions) : OrCondition
+
+
+ Combine conditions with OR.
@param Condition ...$conditions Conditions to combine
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\constraint_sorted_by(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\cond_or(" + "$" + "{" + "1:conditions" + "}" + ")"),
boost: 10
}, {
- label: "constraint_unique",
+ label: "config",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- constraint_unique(string $reference, string $references) : UniqueConstraint
+ config() : Config
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\constraint_unique(" + "$" + "{" + "1:reference" + "}" + ", " + "$" + "{" + "2:references" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\config()"),
boost: 10
}, {
- label: "count",
+ label: "config_builder",
type: "function",
- detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- count(EntryReference $function = null) : Count
+ config_builder() : ConfigBuilder
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\count(" + "$" + "{" + "1:function" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\config_builder()"),
boost: 10
}, {
- label: "csv_detect_separator",
+ label: "conflict_columns",
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
+ conflict_columns(array $columns) : ConflictTarget
- @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()
+ Create a conflict target for ON CONFLICT (columns).
@param list $columns Columns that define uniqueness
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\CSV\\csv_detect_separator(" + "$" + "{" + "1:stream" + "}" + ", " + "$" + "{" + "2:lines" + "}" + ", " + "$" + "{" + "3:fallback" + "}" + ", " + "$" + "{" + "4:options" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\conflict_columns(" + "$" + "{" + "1:columns" + "}" + ")"),
boost: 10
}, {
- label: "data_frame",
+ label: "conflict_constraint",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- data_frame(Config|ConfigBuilder|null $config = null) : Flow
+ conflict_constraint(string $name) : ConflictTarget
+
+
+ Create a conflict target for ON CONFLICT ON CONSTRAINT.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\data_frame(" + "$" + "{" + "1:config" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\conflict_constraint(" + "$" + "{" + "1:name" + "}" + ")"),
boost: 10
}, {
- label: "datetime_entry",
+ label: "constraint_sorted_by",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- datetime_entry(string $name, DateTimeInterface|string|null $value, Metadata $metadata = null) : Entry
-
-
- @return Entry\\DateTimeInterface>
+ constraint_sorted_by(Reference|string $column, Reference|string $columns) : SortedByConstraint
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\datetime_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\constraint_sorted_by(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ")"),
boost: 10
}, {
- label: "datetime_schema",
+ label: "constraint_unique",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- datetime_schema(string $name, bool $nullable = false, Metadata $metadata = null) : Definition
-
-
- @return Definition<\\DateTimeInterface>
+ constraint_unique(string $reference, string $references) : UniqueConstraint
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\datetime_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\constraint_unique(" + "$" + "{" + "1:reference" + "}" + ", " + "$" + "{" + "2:references" + "}" + ")"),
boost: 10
}, {
- label: "date_entry",
+ label: "copy",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- date_entry(string $name, DateTimeInterface|string|null $value, Metadata $metadata = null) : Entry
+ copy() : CopyFactory
- @return Entry\\DateTimeInterface>
+ 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\\ETL\\DSL\\date_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\copy()"),
boost: 10
}, {
- label: "date_interval_to_microseconds",
+ label: "count",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- date_interval_to_microseconds(DateInterval $interval) : int
+ count(EntryReference $function = null) : Count
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\date_interval_to_microseconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\count(" + "$" + "{" + "1:function" + "}" + ")"),
boost: 10
}, {
- label: "date_interval_to_milliseconds",
+ label: "create",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dschema",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- date_interval_to_milliseconds(DateInterval $interval) : int
+ 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\', sql_type_serial()))
Example: create()->index(\'idx_email\')->on(\'users\')->columns(\'email\')
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\date_interval_to_milliseconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\create()"),
boost: 10
}, {
- label: "date_interval_to_seconds",
+ label: "csv_detect_separator",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- date_interval_to_seconds(DateInterval $interval) : int
+ 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\\DSL\\date_interval_to_seconds(" + "$" + "{" + "1:interval" + "}" + ")"),
+ 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: "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: "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) : Definition
+
+
+ @return Definition<\\DateTimeInterface>
+
+ `
+ 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",
@@ -1313,6 +1979,24 @@ const dslFunctions = [
},
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",
@@ -1343,6 +2027,42 @@ const dslFunctions = [
},
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::...) : OrderByItem
+
+
+ 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",
@@ -1361,6 +2081,24 @@ const dslFunctions = [
},
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",
@@ -1394,6 +2132,24 @@ const dslFunctions = [
},
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",
@@ -1409,6 +2165,42 @@ const dslFunctions = [
},
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",
@@ -1571,6 +2363,24 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\DSL\\enum_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
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",
@@ -1689,34 +2499,70 @@ const dslFunctions = [
apply: snippet("\\Flow\\ETL\\DSL\\exists(" + "$" + "{" + "1:ref" + "}" + ")"),
boost: 10
}, {
- label: "files",
+ label: "exists",
type: "function",
- detail: "flow\u002Ddsl\u002Dextractors",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- files(Path|string $directory) : FilesExtractor
+ exists(SelectFinalStep $subquery) : Exists
+
+
+ Create an EXISTS condition.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\files(" + "$" + "{" + "1:directory" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\exists(" + "$" + "{" + "1:subquery" + "}" + ")"),
boost: 10
}, {
- label: "filesystem_cache",
+ label: "explain",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ 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\\ETL\\DSL\\filesystem_cache(" + "$" + "{" + "1:cache_dir" + "}" + ", " + "$" + "{" + "2:filesystem" + "}" + ", " + "$" + "{" + "3:serializer" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\explain(" + "$" + "{" + "1:query" + "}" + ")"),
+ 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: "first",
@@ -1784,6 +2630,150 @@ const dslFunctions = [
},
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",
@@ -2303,6 +3293,42 @@ const dslFunctions = [
},
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(sql_type_integer())
Example: func_arg(sql_type_text())->named(\'username\')
Example: func_arg(sql_type_integer())->named(\'count\')->default(\'0\')
Example: func_arg(sql_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",
@@ -2369,6 +3395,42 @@ const dslFunctions = [
},
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",
@@ -2384,6 +3446,60 @@ const dslFunctions = [
},
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",
@@ -2535,1909 +3651,3601 @@ const dslFunctions = [
apply: snippet("\\Flow\\ETL\\DSL\\ignore_error_handler()"),
boost: 10
}, {
- label: "integer_entry",
+ label: "index_col",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dschema",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- integer_entry(string $name, int $value, Metadata $metadata = null) : Entry
+ index_col(string $name) : IndexColumn
- @return Entry
+ 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\\ETL\\DSL\\integer_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_col(" + "$" + "{" + "1:name" + "}" + ")"),
boost: 10
}, {
- label: "integer_schema",
+ label: "index_expr",
type: "function",
detail: "flow\u002Ddsl\u002Dschema",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- integer_schema(string $name, bool $nullable = false, Metadata $metadata = null) : Definition
+ index_expr(Expression $expression) : IndexColumn
- @return Definition
+ 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\\ETL\\DSL\\integer_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_expr(" + "$" + "{" + "1:expression" + "}" + ")"),
boost: 10
}, {
- label: "int_entry",
+ label: "index_method_brin",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- int_entry(string $name, int $value, Metadata $metadata = null) : Entry
+ index_method_brin() : IndexMethod
- @return Entry
+ Get the BRIN index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\int_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_brin()"),
boost: 10
}, {
- label: "int_schema",
+ label: "index_method_btree",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- int_schema(string $name, bool $nullable = false, Metadata $metadata = null) : Definition
+ index_method_btree() : IndexMethod
- Alias for \`int_schema\`.
@return Definition
+ Get the BTREE index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\int_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_btree()"),
boost: 10
}, {
- label: "is_type",
+ label: "index_method_gin",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- is_type(Type|array $type, mixed $value) : bool
+ index_method_gin() : IndexMethod
- @param array>|Type $type
@param mixed $value
+ Get the GIN index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\is_type(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:value" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_gin()"),
boost: 10
}, {
- label: "is_valid_excel_sheet_name",
+ label: "index_method_gist",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- is_valid_excel_sheet_name(ScalarFunction|string $sheet_name) : IsValidExcelSheetName
+ index_method_gist() : IndexMethod
+
+
+ Get the GIST index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Excel\\DSL\\is_valid_excel_sheet_name(" + "$" + "{" + "1:sheet_name" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_gist()"),
boost: 10
}, {
- label: "join_on",
+ label: "index_method_hash",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- join_on(Comparison|array $comparisons, string $join_prefix = '') : Expression
+ index_method_hash() : IndexMethod
- @param array<\\Flow\\ETL\\Join\\Comparison|string>|Comparison $comparisons
+ Get the HASH index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\join_on(" + "$" + "{" + "1:comparisons" + "}" + ", " + "$" + "{" + "2:join_prefix" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_hash()"),
boost: 10
}, {
- label: "json_entry",
+ label: "index_method_spgist",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- json_entry(string $name, array|string|null $data, Metadata $metadata = null) : Entry
+ index_method_spgist() : IndexMethod
- @param null|array
|string $data
@return Entry>
+ Get the SPGIST index method.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\json_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\index_method_spgist()"),
boost: 10
}, {
- label: "json_object_entry",
+ 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: "integer_entry",
type: "function",
detail: "flow\u002Ddsl\u002Dentries",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- json_object_entry(string $name, array|string|null $data, Metadata $metadata = null) : Entry
+ integer_entry(string $name, int $value, Metadata $metadata = null) : Entry
- @param null|array
|string $data
@throws InvalidArgumentException
@return Entry
+ @return Entry
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\json_object_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\integer_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
boost: 10
}, {
- label: "json_schema",
+ label: "integer_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) : Definition
+ integer_schema(string $name, bool $nullable = false, Metadata $metadata = null) : Definition
- @return Definition
+ @return Definition
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\json_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\integer_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
boost: 10
}, {
- label: "last",
+ label: "int_entry",
type: "function",
- detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dentries",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- last(EntryReference|string $ref) : Last
+ int_entry(string $name, int $value, Metadata $metadata = null) : Entry
+
+
+ @return Entry
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\last(" + "$" + "{" + "1:ref" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\int_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
boost: 10
}, {
- label: "least",
+ label: "int_schema",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dschema",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- least(mixed $values) : Least
+ int_schema(string $name, bool $nullable = false, Metadata $metadata = null) : Definition
+
+
+ Alias for \`int_schema\`.
@return Definition
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\least(" + "$" + "{" + "1:values" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\int_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:nullable" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
boost: 10
}, {
- label: "limit",
+ label: "is_distinct_from",
type: "function",
- detail: "flow\u002Ddsl\u002Dtransformers",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- limit(int $limit) : Limit
+ is_distinct_from(Expression $left, Expression $right, bool $not = false) : IsDistinctFrom
+
+
+ Create an IS DISTINCT FROM condition.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\limit(" + "$" + "{" + "1:limit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_distinct_from(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ", " + "$" + "{" + "3:not" + "}" + ")"),
boost: 10
}, {
- label: "line_chart",
+ label: "is_in",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- line_chart(EntryReference $label, References $datasets) : LineChart
+ 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\\ETL\\Adapter\\ChartJS\\line_chart(" + "$" + "{" + "1:label" + "}" + ", " + "$" + "{" + "2:datasets" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_in(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:values" + "}" + ")"),
boost: 10
}, {
- label: "list_entry",
+ label: "is_null",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- list_entry(string $name, array $value, ListType $type, Metadata $metadata = null) : Entry
+ is_null(Expression $expr, bool $not = false) : IsNull
- @template T
@param null|list $value
@param ListType $type
@return Entry
+ Create an IS NULL condition.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\list_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:type" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\is_null(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:not" + "}" + ")"),
boost: 10
}, {
- label: "list_ref",
+ label: "is_type",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- list_ref(string $entry) : ListFunctions
+ is_type(Type|array $type, mixed $value) : bool
+
+
+ @param array>|Type $type
@param mixed $value
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\list_ref(" + "$" + "{" + "1:entry" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\is_type(" + "$" + "{" + "1:type" + "}" + ", " + "$" + "{" + "2:value" + "}" + ")"),
boost: 10
}, {
- label: "list_schema",
+ label: "is_valid_excel_sheet_name",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- list_schema(string $name, Type $type, bool $nullable = false, Metadata $metadata = null) : Definition
+ 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
- @template T
@param Type> $type
@return Definition>
+ @param array<\\Flow\\ETL\\Join\\Comparison|string>|Comparison $comparisons
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\list_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\join_on(" + "$" + "{" + "1:comparisons" + "}" + ", " + "$" + "{" + "2:join_prefix" + "}" + ")"),
boost: 10
}, {
- label: "lit",
+ label: "json_contained_by",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- lit(mixed $value) : Literal
+ 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\\ETL\\DSL\\lit(" + "$" + "{" + "1:value" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_contained_by(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
boost: 10
}, {
- label: "lower",
+ label: "json_contains",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- lower(ScalarFunction|string $value) : ToLower
+ 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\\ETL\\DSL\\lower(" + "$" + "{" + "1:value" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_contains(" + "$" + "{" + "1:left" + "}" + ", " + "$" + "{" + "2:right" + "}" + ")"),
boost: 10
}, {
- label: "map_entry",
+ label: "json_entry",
type: "function",
detail: "flow\u002Ddsl\u002Dentries",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- map_entry(string $name, array $value, Type $mapType, Metadata $metadata = null) : Entry
+ json_entry(string $name, array|string|null $data, Metadata $metadata = null) : Entry
- @template TKey of array-key
@template TValue
@param ?array
$value
@param Type> $mapType
@return Entry>
+ @param null|array|string $data
@return Entry>
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\map_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ", " + "$" + "{" + "3:mapType" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\json_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:data" + "}" + ", " + "$" + "{" + "3:metadata" + "}" + ")"),
boost: 10
}, {
- label: "map_schema",
+ label: "json_exists",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- map_schema(string $name, Type $type, bool $nullable = false, Metadata $metadata = null) : Definition
+ json_exists(Expression $expr, Expression $key) : OperatorCondition
- @template TKey of array-key
@template TValue
@param Type
> $type
@return Definition>
+ Create a JSONB key exists condition (?).
Example: json_exists(col(\'metadata\'), literal_string(\'category\'))
Produces: metadata ? \'category\'
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\map_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:type" + "}" + ", " + "$" + "{" + "3:nullable" + "}" + ", " + "$" + "{" + "4:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
boost: 10
}, {
- label: "mask_columns",
+ label: "json_exists_all",
type: "function",
- detail: "flow\u002Ddsl\u002Dtransformers",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- mask_columns(array $columns = [], string $mask = '******') : MaskColumns
+ json_exists_all(Expression $expr, Expression $keys) : OperatorCondition
- @param array $columns
+ 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\\ETL\\DSL\\mask_columns(" + "$" + "{" + "1:columns" + "}" + ", " + "$" + "{" + "2:mask" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists_all(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
boost: 10
}, {
- label: "match_cases",
+ label: "json_exists_any",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- match_cases(array $cases, mixed $default = null) : MatchCases
+ json_exists_any(Expression $expr, Expression $keys) : OperatorCondition
- @param array $cases
+ 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\\ETL\\DSL\\match_cases(" + "$" + "{" + "1:cases" + "}" + ", " + "$" + "{" + "2:default" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_exists_any(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:keys" + "}" + ")"),
boost: 10
}, {
- label: "match_condition",
+ label: "json_get",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- match_condition(mixed $condition, mixed $then) : MatchCondition
+ 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\\ETL\\DSL\\match_condition(" + "$" + "{" + "1:condition" + "}" + ", " + "$" + "{" + "2:then" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_get(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
boost: 10
}, {
- label: "max",
+ label: "json_get_text",
type: "function",
- detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- max(EntryReference|string $ref) : Max
+ 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\\ETL\\DSL\\max(" + "$" + "{" + "1:ref" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_get_text(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:key" + "}" + ")"),
boost: 10
}, {
- label: "meilisearch_hits_to_rows",
+ label: "json_object_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ json_object_entry(string $name, array|string|null $data, Metadata $metadata = null) : Entry
+
+
+ @param null|array
|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 = `
- meilisearch_hits_to_rows() : HitsIntoRowsTransformer
+ json_path(Expression $expr, Expression $path) : BinaryExpression
- Transforms Meilisearch results into clear Flow Rows.
+ 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\\ETL\\Adapter\\Meilisearch\\meilisearch_hits_to_rows()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\json_path(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:path" + "}" + ")"),
boost: 10
}, {
- label: "memory_filesystem",
+ label: "json_path_text",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- memory_filesystem() : MemoryFilesystem
+ json_path_text(Expression $expr, Expression $path) : BinaryExpression
- Create a new memory filesystem and writes data to it in memory.
+ 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\\Filesystem\\DSL\\memory_filesystem()"),
+ 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) : Definition
+
+
+ @return Definition
+
+ `
+ 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, Type $type, bool $nullable = false, Metadata $metadata = null) : Definition
+
+
+ @template T
@param Type> $type
@return Definition>
+
+ `
+ 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: "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: "map_entry",
+ type: "function",
+ detail: "flow\u002Ddsl\u002Dentries",
+ info: () => {
+ const div = document.createElement("div")
+ div.innerHTML = `
+
+ map_entry(string $name, array $value, Type $mapType, Metadata $metadata = null) : Entry
+
+
+ @template TKey of array-key
@template TValue
@param ?array
$value
@param Type> $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, Type $type, bool $nullable = false, Metadata $metadata = null) : Definition
+
+
+ @template TKey of array-key
@template TValue
@param Type
> $type
@return Definition>
+
+ `
+ 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_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: "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: "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) : Definition
+
+
+ @return Definition
+
+ `
+ 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::...) : OrderByItem
+
+
+ Create an ORDER BY item.
+
+ `
+ return div
+ },
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\order_by(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:direction" + "}" + ", " + "$" + "{" + "3:nulls" + "}" + ")"),
+ 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: "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: "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_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: "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: "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).
+
+ `
+ 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).
+
+ `
+ 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: "min",
+ label: "retry_any_throwable",
type: "function",
- detail: "flow\u002Ddsl\u002Daggregating\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- min(EntryReference|string $ref) : Min
+ retry_any_throwable(int $limit) : AnyThrowable
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\min(" + "$" + "{" + "1:ref" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\retry_any_throwable(" + "$" + "{" + "1:limit" + "}" + ")"),
boost: 10
}, {
- label: "mysql_insert_options",
+ label: "retry_on_exception_types",
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
+ retry_on_exception_types(array $exception_types, int $limit) : OnExceptionTypes
- @param array $update_columns
+ @param array> $exception_types
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\mysql_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:upsert" + "}" + ", " + "$" + "{" + "3:update_columns" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\retry_on_exception_types(" + "$" + "{" + "1:exception_types" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ")"),
boost: 10
}, {
- label: "native_local_filesystem",
+ label: "returning",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- native_local_filesystem() : NativeLocalFilesystem
+ returning(Expression $expressions) : ReturningClause
+
+
+ Create a RETURNING clause.
@param Expression ...$expressions Expressions to return
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\native_local_filesystem()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\returning(" + "$" + "{" + "1:expressions" + "}" + ")"),
boost: 10
}, {
- label: "not",
+ label: "returning_all",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- not(ScalarFunction $value) : Not
+ returning_all() : ReturningClause
+
+
+ Create a RETURNING * clause.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\not(" + "$" + "{" + "1:value" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\returning_all()"),
boost: 10
}, {
- label: "now",
+ label: "revoke",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- now(DateTimeZone|ScalarFunction $time_zone = DateTimeZone::...) : Now
+ 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\\ETL\\DSL\\now(" + "$" + "{" + "1:time_zone" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\revoke(" + "$" + "{" + "1:privileges" + "}" + ")"),
boost: 10
}, {
- label: "null_entry",
+ label: "revoke_role",
type: "function",
- detail: "flow\u002Ddsl\u002Dentries",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- null_entry(string $name, Metadata $metadata = null) : Entry
+ revoke_role(string $roles) : RevokeRoleFromStep
- 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
+ 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\\ETL\\DSL\\null_entry(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\revoke_role(" + "$" + "{" + "1:roles" + "}" + ")"),
boost: 10
}, {
- label: "null_schema",
+ label: "rollback",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- null_schema(string $name, Metadata $metadata = null) : Definition
+ rollback() : RollbackOptionsStep
- @return Definition
+ Create a ROLLBACK transaction builder.
Example: rollback()->toSavepoint(\'my_savepoint\')
Produces: ROLLBACK TO SAVEPOINT my_savepoint
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\null_schema(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\rollback()"),
boost: 10
}, {
- label: "number_format",
+ label: "rollback_prepared",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ 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\\ETL\\DSL\\number_format(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:decimals" + "}" + ", " + "$" + "{" + "3:decimal_separator" + "}" + ", " + "$" + "{" + "4:thousands_separator" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\rollback_prepared(" + "$" + "{" + "1:transactionId" + "}" + ")"),
boost: 10
}, {
- label: "optional",
+ label: "round",
type: "function",
detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- optional(ScalarFunction $function) : Optional
+ round(ScalarFunction|int|float $value, ScalarFunction|int $precision = 2, ScalarFunction|int $mode = 1) : Round
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\optional(" + "$" + "{" + "1:function" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\round(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:precision" + "}" + ", " + "$" + "{" + "3:mode" + "}" + ")"),
boost: 10
}, {
- label: "overwrite",
+ label: "row",
type: "function",
detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- overwrite() : SaveMode
+ row(Entry $entry) : Row
- Alias for save_mode_overwrite().
+ @param Entry ...$entry
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\overwrite()"),
+ apply: snippet("\\Flow\\ETL\\DSL\\row(" + "$" + "{" + "1:entry" + "}" + ")"),
boost: 10
}, {
- label: "pagination_key_asc",
+ label: "rows",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pagination_key_asc(string $column, ParameterType|Type|string|int $type = Doctrine\\DBAL\\ParameterType::...) : Key
+ rows(Row $row) : Rows
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\pagination_key_asc(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\rows(" + "$" + "{" + "1:row" + "}" + ")"),
boost: 10
}, {
- label: "pagination_key_desc",
+ label: "rows_partitioned",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pagination_key_desc(string $column, ParameterType|Type|string|int $type = Doctrine\\DBAL\\ParameterType::...) : Key
+ 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\\Adapter\\Doctrine\\pagination_key_desc(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:type" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\rows_partitioned(" + "$" + "{" + "1:rows" + "}" + ", " + "$" + "{" + "2:partitions" + "}" + ")"),
boost: 10
}, {
- label: "pagination_key_set",
+ label: "row_expr",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pagination_key_set(Key $keys) : KeySet
+ row_expr(array $elements) : RowExpression
+
+
+ Create a row expression.
@param list $elements Row elements
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\pagination_key_set(" + "$" + "{" + "1:keys" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\row_expr(" + "$" + "{" + "1:elements" + "}" + ")"),
boost: 10
}, {
- label: "partition",
+ label: "row_number",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- partition(string $name, string $value) : Partition
+ row_number() : RowNumber
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\partition(" + "$" + "{" + "1:name" + "}" + ", " + "$" + "{" + "2:value" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\row_number()"),
boost: 10
}, {
- label: "partitions",
+ label: "sanitize",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- partitions(Partition $partition) : Partitions
+ sanitize(ScalarFunction|string $value, ScalarFunction|string $placeholder = '*', ScalarFunction|int|null $skipCharacters = null) : Sanitize
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\partitions(" + "$" + "{" + "1:partition" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\sanitize(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:placeholder" + "}" + ", " + "$" + "{" + "3:skipCharacters" + "}" + ")"),
boost: 10
}, {
- label: "path",
+ label: "savepoint",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- path(string $path, Options|array $options = []) : Path
+ savepoint(string $name) : SavepointFinalStep
- 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
+ Create a SAVEPOINT.
Example: savepoint(\'my_savepoint\')
Produces: SAVEPOINT my_savepoint
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\path(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\savepoint(" + "$" + "{" + "1:name" + "}" + ")"),
boost: 10
}, {
- label: "path_memory",
+ label: "save_mode_append",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
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
+ save_mode_append() : SaveMode
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\path_memory(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_append()"),
boost: 10
}, {
- label: "path_real",
+ label: "save_mode_exception_if_exists",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- path_real(string $path, array $options = []) : Path
-
-
- Resolve real path from given path.
@param array $options
+ save_mode_exception_if_exists() : SaveMode
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\path_real(" + "$" + "{" + "1:path" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_exception_if_exists()"),
boost: 10
}, {
- label: "path_stdout",
+ label: "save_mode_ignore",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
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
+ save_mode_ignore() : SaveMode
`
return div
},
- apply: snippet("\\Flow\\Filesystem\\DSL\\path_stdout(" + "$" + "{" + "1:options" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_ignore()"),
boost: 10
}, {
- label: "pg_count_modifier",
+ label: "save_mode_overwrite",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_count_modifier() : CountModifier
-
-
- Create a CountModifier that transforms a SELECT query into a COUNT query.
The original query is wrapped in: SELECT COUNT(*) FROM (...) AS _count_subq
ORDER BY and LIMIT/OFFSET are removed from the inner query.
+ save_mode_overwrite() : SaveMode
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_count_modifier()"),
+ apply: snippet("\\Flow\\ETL\\DSL\\save_mode_overwrite()"),
boost: 10
}, {
- label: "pg_deparse",
+ label: "schema",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dschema",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_deparse(ParsedQuery $query, DeparseOptions $options = null) : string
+ schema(Definition $definitions) : Schema
- 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
+ @param Definition ...$definitions
@return Schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_deparse(" + "$" + "{" + "1:query" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema(" + "$" + "{" + "1:definitions" + "}" + ")"),
boost: 10
}, {
- label: "pg_deparse_options",
+ label: "schema_evolving_validator",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_deparse_options() : DeparseOptions
-
-
- Create DeparseOptions for configuring SQL formatting.
+ schema_evolving_validator() : EvolvingValidator
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_deparse_options()"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_evolving_validator()"),
boost: 10
}, {
- label: "pg_fingerprint",
+ label: "schema_from_json",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_fingerprint(string $sql) : string
+ schema_from_json(string $schema) : Schema
- Returns a fingerprint of the given SQL query.
Literal values are normalized so they won\'t affect the fingerprint.
+ @return Schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_fingerprint(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_from_json(" + "$" + "{" + "1:schema" + "}" + ")"),
boost: 10
}, {
- label: "pg_format",
+ label: "schema_from_parquet",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_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
+ schema_from_parquet(Schema $schema) : Schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_format(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_from_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
boost: 10
}, {
- label: "pg_keyset_column",
+ label: "schema_metadata",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_keyset_column(string $column, SortOrder $order = Flow\\PgQuery\\AST\\Transformers\\SortOrder::...) : KeysetColumn
+ schema_metadata(array $metadata = []) : Metadata
- 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)
+ @param array|bool|float|int|string> $metadata
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_keyset_column(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:order" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_metadata(" + "$" + "{" + "1:metadata" + "}" + ")"),
boost: 10
}, {
- label: "pg_keyset_pagination",
+ label: "schema_selective_validator",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_keyset_pagination(int $limit, array $columns, array $cursor = null) : KeysetPaginationModifier
-
-
- Create a KeysetPaginationModifier for cursor-based pagination.
Keyset pagination is more efficient than OFFSET for large datasets because it uses
indexed WHERE conditions instead of scanning and skipping rows.
@param int $limit Maximum number of rows to return
@param list $columns Columns to use for keyset pagination (must match ORDER BY)
@param null|list $cursor Cursor values from the last row of previous page (null for first page)
+ schema_selective_validator() : SelectiveValidator
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_keyset_pagination(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ", " + "$" + "{" + "3:cursor" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_selective_validator()"),
boost: 10
}, {
- label: "pg_keyset_pagination_config",
+ label: "schema_strict_validator",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_keyset_pagination_config(int $limit, array $columns, array $cursor = null) : KeysetPaginationConfig
-
-
- Create a KeysetPaginationConfig for cursor-based pagination.
@param int $limit Maximum number of rows to return
@param list $columns Columns to use for keyset pagination (must match ORDER BY)
@param null|list $cursor Cursor values from the last row of previous page (null for first page)
+ schema_strict_validator() : StrictValidator
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_keyset_pagination_config(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:columns" + "}" + ", " + "$" + "{" + "3:cursor" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_strict_validator()"),
boost: 10
}, {
- label: "pg_normalize",
+ label: "schema_to_ascii",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_normalize(string $sql) : string
+ schema_to_ascii(Schema $schema, SchemaFormatter $formatter = null) : 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.
+ @param Schema $schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_normalize(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_ascii(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
boost: 10
}, {
- label: "pg_normalize_utility",
+ label: "schema_to_json",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_normalize_utility(string $sql) : string
+ schema_to_json(Schema $schema, bool $pretty = false) : string
- Normalize utility SQL statements (DDL like CREATE, ALTER, DROP).
This handles DDL statements differently from pg_normalize() which is optimized for DML.
+ @param Schema $schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_normalize_utility(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_json(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:pretty" + "}" + ")"),
boost: 10
}, {
- label: "pg_pagination",
+ label: "schema_to_parquet",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_pagination(int $limit, int $offset = 0) : PaginationModifier
-
-
- Create a PaginationModifier for offset-based pagination.
Applies LIMIT and OFFSET to the query. OFFSET without ORDER BY will throw an exception.
@param int $limit Maximum number of rows to return
@param int $offset Number of rows to skip (requires ORDER BY in query)
+ schema_to_parquet(Schema $schema) : Schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_pagination(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_to_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
boost: 10
}, {
- label: "pg_pagination_config",
+ label: "schema_to_php",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_pagination_config(int $limit, int $offset = 0) : PaginationConfig
+ schema_to_php(Schema $schema, ValueFormatter $valueFormatter = Flow\\ETL\\Schema\\Formatter\\PHPFormatter\\ValueFormatter::..., TypeFormatter $typeFormatter = Flow\\ETL\\Schema\\Formatter\\PHPFormatter\\TypeFormatter::...) : string
- Create a PaginationConfig for offset-based pagination.
@param int $limit Maximum number of rows to return
@param int $offset Number of rows to skip (requires ORDER BY in query)
+ @param Schema $schema
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_pagination_config(" + "$" + "{" + "1:limit" + "}" + ", " + "$" + "{" + "2:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_to_php(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:valueFormatter" + "}" + ", " + "$" + "{" + "3:typeFormatter" + "}" + ")"),
boost: 10
}, {
- label: "pg_parse",
+ label: "schema_validate",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_parse(string $sql) : ParsedQuery
+ 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\\PgQuery\\DSL\\pg_parse(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\schema_validate(" + "$" + "{" + "1:expected" + "}" + ", " + "$" + "{" + "2:given" + "}" + ", " + "$" + "{" + "3:validator" + "}" + ")"),
boost: 10
}, {
- label: "pg_parser",
+ label: "select",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dtransformers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_parser() : Parser
+ select(Reference|string $entries) : Select
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_parser()"),
+ apply: snippet("\\Flow\\ETL\\DSL\\select(" + "$" + "{" + "1:entries" + "}" + ")"),
boost: 10
}, {
- label: "pg_query_columns",
+ label: "select",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_query_columns(ParsedQuery $query) : Columns
+ select(Expression $expressions) : SelectBuilder
- Extract columns from a parsed SQL query.
+ Create a new SELECT query builder.
@param Expression ...$expressions Columns to select. If empty, returns SelectSelectStep.
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_query_columns(" + "$" + "{" + "1:query" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\select(" + "$" + "{" + "1:expressions" + "}" + ")"),
boost: 10
}, {
- label: "pg_query_functions",
+ label: "set_role",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_query_functions(ParsedQuery $query) : Functions
+ set_role(string $role) : SetRoleFinalStep
- Extract functions from a parsed SQL query.
+ 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\\PgQuery\\DSL\\pg_query_functions(" + "$" + "{" + "1:query" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_role(" + "$" + "{" + "1:role" + "}" + ")"),
boost: 10
}, {
- label: "pg_query_tables",
+ label: "set_session_transaction",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_query_tables(ParsedQuery $query) : Tables
+ set_session_transaction() : SetTransactionOptionsStep
- Extract tables from a parsed SQL query.
+ 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\\PgQuery\\DSL\\pg_query_tables(" + "$" + "{" + "1:query" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_session_transaction()"),
boost: 10
}, {
- label: "pg_split",
+ label: "set_transaction",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_split(string $sql) : array
+ set_transaction() : SetTransactionOptionsStep
- Split string with multiple SQL statements into array of individual statements.
@return array
+ 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\\PgQuery\\DSL\\pg_split(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\set_transaction()"),
boost: 10
}, {
- label: "pg_summary",
+ label: "similar_to",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_summary(string $sql, int $options = 0, int $truncateLimit = 0) : string
+ similar_to(Expression $expr, Expression $pattern) : SimilarTo
- Generate a summary of parsed queries in protobuf format.
Useful for query monitoring and logging without full AST overhead.
+ Create a SIMILAR TO condition.
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_summary(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ", " + "$" + "{" + "3:truncateLimit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\similar_to(" + "$" + "{" + "1:expr" + "}" + ", " + "$" + "{" + "2:pattern" + "}" + ")"),
boost: 10
}, {
- label: "pg_to_count_query",
+ label: "size",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_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
+ size(mixed $value) : Size
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_to_count_query(" + "$" + "{" + "1:sql" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\size(" + "$" + "{" + "1:value" + "}" + ")"),
boost: 10
}, {
- label: "pg_to_keyset_query",
+ label: "skip_rows_handler",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_to_keyset_query(string $sql, int $limit, array $columns, array $cursor = null) : string
+ skip_rows_handler() : SkipRows
-
- Transform a SQL query into a keyset (cursor-based) paginated query.
More efficient than OFFSET for large datasets - uses indexed WHERE conditions.
@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\\ETL\\DSL\\skip_rows_handler()"),
+ 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\\PgQuery\\DSL\\pg_to_keyset_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:columns" + "}" + ", " + "$" + "{" + "4:cursor" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\split(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:separator" + "}" + ", " + "$" + "{" + "3:limit" + "}" + ")"),
boost: 10
}, {
- label: "pg_to_paginated_query",
+ label: "sprintf",
type: "function",
- detail: "flow\u002Ddsl\u002Dhelpers",
+ detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pg_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
+ sprintf(ScalarFunction|string $format, ScalarFunction|string|int|float|null $args) : Sprintf
`
return div
},
- apply: snippet("\\Flow\\PgQuery\\DSL\\pg_to_paginated_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\DSL\\sprintf(" + "$" + "{" + "1:format" + "}" + ", " + "$" + "{" + "2:args" + "}" + ")"),
boost: 10
}, {
- label: "pie_chart",
+ label: "sqlite_insert_options",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- pie_chart(EntryReference $label, References $datasets) : PieChart
+ 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\\ChartJS\\pie_chart(" + "$" + "{" + "1:label" + "}" + ", " + "$" + "{" + "2:datasets" + "}" + ")"),
+ apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\sqlite_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:conflict_columns" + "}" + ", " + "$" + "{" + "3:update_columns" + "}" + ")"),
boost: 10
}, {
- label: "postgresql_insert_options",
+ label: "sql_deparse",
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
+ sql_deparse(ParsedQuery $query, DeparseOptions $options = null) : string
- @param array $conflict_columns
@param array $update_columns
+ 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\\ETL\\Adapter\\Doctrine\\postgresql_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:constraint" + "}" + ", " + "$" + "{" + "3:conflict_columns" + "}" + ", " + "$" + "{" + "4:update_columns" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_deparse(" + "$" + "{" + "1:query" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
boost: 10
}, {
- label: "postgresql_update_options",
+ label: "sql_deparse_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
+ sql_deparse_options() : DeparseOptions
- @param array $primary_key_columns
@param array $update_columns
+ Create DeparseOptions for configuring SQL formatting.
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\postgresql_update_options(" + "$" + "{" + "1:primary_key_columns" + "}" + ", " + "$" + "{" + "2:update_columns" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_deparse_options()"),
boost: 10
}, {
- label: "print_rows",
+ label: "sql_fingerprint",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- print_rows(Rows $rows, int|bool $truncate = false, Formatter $formatter = null) : string
+ 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\\ETL\\DSL\\print_rows(" + "$" + "{" + "1:rows" + "}" + ", " + "$" + "{" + "2:truncate" + "}" + ", " + "$" + "{" + "3:formatter" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_fingerprint(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "print_schema",
+ label: "sql_format",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- print_schema(Schema $schema, SchemaFormatter $formatter = null) : string
+ sql_format(string $sql, DeparseOptions $options = null) : string
- @param Schema $schema
@deprecated Please use schema_to_ascii($schema) instead
+ 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\\ETL\\DSL\\print_schema(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_format(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ")"),
boost: 10
}, {
- label: "protocol",
+ label: "sql_keyset_column",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- protocol(string $protocol) : Protocol
+ 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\\Filesystem\\DSL\\protocol(" + "$" + "{" + "1:protocol" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_keyset_column(" + "$" + "{" + "1:column" + "}" + ", " + "$" + "{" + "2:order" + "}" + ")"),
boost: 10
}, {
- label: "random_string",
+ label: "sql_normalize",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- random_string(ScalarFunction|int $length, RandomValueGenerator $generator = Flow\\ETL\\NativePHPRandomValueGenerator::...) : RandomString
+ 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\\ETL\\DSL\\random_string(" + "$" + "{" + "1:length" + "}" + ", " + "$" + "{" + "2:generator" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_normalize(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "rank",
+ label: "sql_normalize_utility",
type: "function",
- detail: "flow\u002Ddsl\u002Dwindow\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- rank() : Rank
+ 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\\ETL\\DSL\\rank()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_normalize_utility(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "ref",
+ label: "sql_parse",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- ref(string $entry) : EntryReference
+ sql_parse(string $sql) : ParsedQuery
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\ref(" + "$" + "{" + "1:entry" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_parse(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "refs",
+ label: "sql_parser",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- refs(Reference|string $entries) : References
+ sql_parser() : Parser
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\refs(" + "$" + "{" + "1:entries" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_parser()"),
boost: 10
}, {
- label: "regex",
+ label: "sql_query_columns",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- regex(ScalarFunction|string $pattern, ScalarFunction|string $subject, ScalarFunction|int $flags = 0, ScalarFunction|int $offset = 0) : Regex
+ sql_query_columns(ParsedQuery $query) : Columns
+
+
+ Extract columns from a parsed SQL query.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\regex(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_columns(" + "$" + "{" + "1:query" + "}" + ")"),
boost: 10
}, {
- label: "regex_all",
+ label: "sql_query_functions",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ sql_query_functions(ParsedQuery $query) : Functions
+
+
+ Extract functions from a parsed SQL query.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\regex_all(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_functions(" + "$" + "{" + "1:query" + "}" + ")"),
boost: 10
}, {
- label: "regex_match",
+ label: "sql_query_tables",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ sql_query_tables(ParsedQuery $query) : Tables
+
+
+ Extract tables from a parsed SQL query.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\regex_match(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_query_tables(" + "$" + "{" + "1:query" + "}" + ")"),
boost: 10
}, {
- label: "regex_match_all",
+ label: "sql_split",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ sql_split(string $sql) : array
+
+
+ Split string with multiple SQL statements into array of individual statements.
@return array
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\regex_match_all(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:subject" + "}" + ", " + "$" + "{" + "3:flags" + "}" + ", " + "$" + "{" + "4:offset" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_split(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "regex_replace",
+ label: "sql_summary",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
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
+ 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\\ETL\\DSL\\regex_replace(" + "$" + "{" + "1:pattern" + "}" + ", " + "$" + "{" + "2:replacement" + "}" + ", " + "$" + "{" + "3:subject" + "}" + ", " + "$" + "{" + "4:limit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_summary(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:options" + "}" + ", " + "$" + "{" + "3:truncateLimit" + "}" + ")"),
boost: 10
}, {
- label: "rename_replace",
+ label: "sql_to_count_query",
type: "function",
- detail: "flow\u002Ddsl\u002Dtransformers",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- rename_replace(array|string $search, array|string $replace) : RenameReplaceEntryStrategy
+ sql_to_count_query(string $sql) : string
- @param array|string $search
@param array|string $replace
+ 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\\ETL\\DSL\\rename_replace(" + "$" + "{" + "1:search" + "}" + ", " + "$" + "{" + "2:replace" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_count_query(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "rename_style",
+ label: "sql_to_keyset_query",
type: "function",
- detail: "flow\u002Ddsl\u002Dtransformers",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- rename_style(StringStyles|StringStyles $style) : RenameCaseEntryStrategy
+ 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.
@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\\ETL\\DSL\\rename_style(" + "$" + "{" + "1:style" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_keyset_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:columns" + "}" + ", " + "$" + "{" + "4:cursor" + "}" + ")"),
boost: 10
}, {
- label: "retry_any_throwable",
+ label: "sql_to_paginated_query",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- retry_any_throwable(int $limit) : AnyThrowable
+ 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\\ETL\\DSL\\retry_any_throwable(" + "$" + "{" + "1:limit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_paginated_query(" + "$" + "{" + "1:sql" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ", " + "$" + "{" + "3:offset" + "}" + ")"),
boost: 10
}, {
- label: "retry_on_exception_types",
+ label: "sql_to_query_builder",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- retry_on_exception_types(array $exception_types, int $limit) : OnExceptionTypes
+ sql_to_query_builder(string $sql) : SelectBuilder|InsertBuilder|UpdateBuilder|DeleteBuilder
- @param array> $exception_types
+ Parse SQL and convert to a QueryBuilder for modification.
Only works for single-statement queries. For multiple statements,
use pg_split() to parse statements individually.
@throws \\InvalidArgumentException if query contains multiple statements or unsupported statement type
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\retry_on_exception_types(" + "$" + "{" + "1:exception_types" + "}" + ", " + "$" + "{" + "2:limit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_to_query_builder(" + "$" + "{" + "1:sql" + "}" + ")"),
boost: 10
}, {
- label: "round",
+ label: "sql_type_array",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- round(ScalarFunction|int|float $value, ScalarFunction|int $precision = 2, ScalarFunction|int $mode = 1) : Round
+ sql_type_array(DataType $elementType) : DataType
+
+
+ Create an ARRAY data type.
@param DataType $elementType The type of array elements
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\round(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:precision" + "}" + ", " + "$" + "{" + "3:mode" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_array(" + "$" + "{" + "1:elementType" + "}" + ")"),
boost: 10
}, {
- label: "row",
+ label: "sql_type_bigint",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- row(Entry $entry) : Row
+ sql_type_bigint() : DataType
- @param Entry ...$entry
+ Create a BIGINT data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\row(" + "$" + "{" + "1:entry" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_bigint()"),
boost: 10
}, {
- label: "rows",
+ label: "sql_type_bigserial",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- rows(Row $row) : Rows
+ sql_type_bigserial() : DataType
+
+
+ Create a BIGSERIAL (auto-incrementing bigint) data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\rows(" + "$" + "{" + "1:row" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_bigserial()"),
boost: 10
}, {
- label: "rows_partitioned",
+ label: "sql_type_boolean",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- rows_partitioned(array $rows, Partitions|array $partitions) : Rows
+ sql_type_boolean() : DataType
- @param array $rows
@param array<\\Flow\\Filesystem\\Partition|string>|Partitions $partitions
+ Create a BOOLEAN data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\rows_partitioned(" + "$" + "{" + "1:rows" + "}" + ", " + "$" + "{" + "2:partitions" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_boolean()"),
boost: 10
}, {
- label: "row_number",
+ label: "sql_type_bytea",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- row_number() : RowNumber
+ sql_type_bytea() : DataType
+
+
+ Create a BYTEA data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\row_number()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_bytea()"),
boost: 10
}, {
- label: "sanitize",
+ label: "sql_type_char",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- sanitize(ScalarFunction|string $value, ScalarFunction|string $placeholder = '*', ScalarFunction|int|null $skipCharacters = null) : Sanitize
+ sql_type_char(int $length) : DataType
+
+
+ Create a CHAR data type.
@param int $length Fixed character length
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\sanitize(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:placeholder" + "}" + ", " + "$" + "{" + "3:skipCharacters" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_char(" + "$" + "{" + "1:length" + "}" + ")"),
boost: 10
}, {
- label: "save_mode_append",
+ label: "sql_type_cidr",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- save_mode_append() : SaveMode
+ sql_type_cidr() : DataType
+
+
+ Create a CIDR data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\save_mode_append()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_cidr()"),
boost: 10
}, {
- label: "save_mode_exception_if_exists",
+ label: "sql_type_date",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- save_mode_exception_if_exists() : SaveMode
+ sql_type_date() : DataType
+
+
+ Create a DATE data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\save_mode_exception_if_exists()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_date()"),
boost: 10
}, {
- label: "save_mode_ignore",
+ label: "sql_type_decimal",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- save_mode_ignore() : SaveMode
+ sql_type_decimal(int $precision = null, int $scale = null) : DataType
+
+
+ Create a DECIMAL data type (alias for NUMERIC).
@param null|int $precision Total number of digits
@param null|int $scale Number of digits after decimal point
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\save_mode_ignore()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_decimal(" + "$" + "{" + "1:precision" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ")"),
boost: 10
}, {
- label: "save_mode_overwrite",
+ label: "sql_type_double",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- save_mode_overwrite() : SaveMode
+ sql_type_double() : DataType
+
+
+ Create a DOUBLE PRECISION data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\save_mode_overwrite()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_double()"),
boost: 10
}, {
- label: "schema",
+ label: "sql_type_inet",
type: "function",
- detail: "flow\u002Ddsl\u002Dschema",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema(Definition $definitions) : Schema
+ sql_type_inet() : DataType
- @param Definition ...$definitions
@return Schema
+ Create an INET data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema(" + "$" + "{" + "1:definitions" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_inet()"),
boost: 10
}, {
- label: "schema_evolving_validator",
+ label: "sql_type_integer",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_evolving_validator() : EvolvingValidator
+ sql_type_integer() : DataType
+
+
+ Create an INTEGER data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_evolving_validator()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_integer()"),
boost: 10
}, {
- label: "schema_from_json",
+ label: "sql_type_interval",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_from_json(string $schema) : Schema
+ sql_type_interval() : DataType
- @return Schema
+ Create an INTERVAL data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_from_json(" + "$" + "{" + "1:schema" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_interval()"),
boost: 10
}, {
- label: "schema_from_parquet",
+ label: "sql_type_json",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_from_parquet(Schema $schema) : Schema
+ sql_type_json() : DataType
+
+
+ Create a JSON data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_from_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_json()"),
boost: 10
}, {
- label: "schema_metadata",
+ label: "sql_type_jsonb",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_metadata(array $metadata = []) : Metadata
+ sql_type_jsonb() : DataType
- @param array|bool|float|int|string> $metadata
+ Create a JSONB data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_metadata(" + "$" + "{" + "1:metadata" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_jsonb()"),
boost: 10
}, {
- label: "schema_selective_validator",
+ label: "sql_type_macaddr",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_selective_validator() : SelectiveValidator
+ sql_type_macaddr() : DataType
+
+
+ Create a MACADDR data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_selective_validator()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_macaddr()"),
boost: 10
}, {
- label: "schema_strict_validator",
+ label: "sql_type_numeric",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_strict_validator() : StrictValidator
+ sql_type_numeric(int $precision = null, int $scale = null) : DataType
+
+
+ Create a NUMERIC data type.
@param null|int $precision Total number of digits
@param null|int $scale Number of digits after decimal point
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_strict_validator()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_numeric(" + "$" + "{" + "1:precision" + "}" + ", " + "$" + "{" + "2:scale" + "}" + ")"),
boost: 10
}, {
- label: "schema_to_ascii",
+ label: "sql_type_real",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_to_ascii(Schema $schema, SchemaFormatter $formatter = null) : string
+ sql_type_real() : DataType
- @param Schema $schema
+ Create a REAL data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_to_ascii(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:formatter" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_real()"),
boost: 10
}, {
- label: "schema_to_json",
+ label: "sql_type_serial",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_to_json(Schema $schema, bool $pretty = false) : string
+ sql_type_serial() : DataType
- @param Schema $schema
+ Create a SERIAL (auto-incrementing integer) data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_to_json(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:pretty" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_serial()"),
boost: 10
}, {
- label: "schema_to_parquet",
+ label: "sql_type_smallint",
type: "function",
detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- schema_to_parquet(Schema $schema) : Schema
+ sql_type_smallint() : DataType
+
+
+ Create a SMALLINT data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Parquet\\schema_to_parquet(" + "$" + "{" + "1:schema" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_smallint()"),
boost: 10
}, {
- label: "schema_to_php",
+ label: "sql_type_smallserial",
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
+ sql_type_smallserial() : DataType
- @param Schema $schema
+ Create a SMALLSERIAL (auto-incrementing smallint) data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_to_php(" + "$" + "{" + "1:schema" + "}" + ", " + "$" + "{" + "2:valueFormatter" + "}" + ", " + "$" + "{" + "3:typeFormatter" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_smallserial()"),
boost: 10
}, {
- label: "schema_validate",
+ label: "sql_type_text",
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
+ sql_type_text() : DataType
- @param Schema $expected
@param Schema $given
+ Create a TEXT data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\schema_validate(" + "$" + "{" + "1:expected" + "}" + ", " + "$" + "{" + "2:given" + "}" + ", " + "$" + "{" + "3:validator" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_text()"),
boost: 10
}, {
- label: "select",
+ label: "sql_type_time",
type: "function",
- detail: "flow\u002Ddsl\u002Dtransformers",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- select(Reference|string $entries) : Select
+ sql_type_time(int $precision = null) : DataType
+
+
+ Create a TIME data type.
@param null|int $precision Fractional seconds precision
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\select(" + "$" + "{" + "1:entries" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_time(" + "$" + "{" + "1:precision" + "}" + ")"),
boost: 10
}, {
- label: "size",
+ label: "sql_type_timestamp",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- size(mixed $value) : Size
+ sql_type_timestamp(int $precision = null) : DataType
+
+
+ Create a TIMESTAMP data type.
@param null|int $precision Fractional seconds precision
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\size(" + "$" + "{" + "1:value" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_timestamp(" + "$" + "{" + "1:precision" + "}" + ")"),
boost: 10
}, {
- label: "skip_rows_handler",
+ label: "sql_type_timestamptz",
type: "function",
- detail: "flow\u002Ddsl\u002Ddata\u002Dframe",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- skip_rows_handler() : SkipRows
+ sql_type_timestamptz(int $precision = null) : DataType
+
+
+ Create a TIMESTAMP WITH TIME ZONE data type.
@param null|int $precision Fractional seconds precision
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\skip_rows_handler()"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_timestamptz(" + "$" + "{" + "1:precision" + "}" + ")"),
boost: 10
}, {
- label: "split",
+ label: "sql_type_uuid",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- split(ScalarFunction|string $value, ScalarFunction|string $separator, ScalarFunction|int $limit = 9223372036854775807) : Split
+ sql_type_uuid() : DataType
+
+
+ Create a UUID data type.
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\split(" + "$" + "{" + "1:value" + "}" + ", " + "$" + "{" + "2:separator" + "}" + ", " + "$" + "{" + "3:limit" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_uuid()"),
boost: 10
}, {
- label: "sprintf",
+ label: "sql_type_varchar",
type: "function",
- detail: "flow\u002Ddsl\u002Dscalar\u002Dfunctions",
+ detail: "flow\u002Ddsl\u002Dhelpers",
info: () => {
const div = document.createElement("div")
div.innerHTML = `
- sprintf(ScalarFunction|string $format, ScalarFunction|string|int|float|null $args) : Sprintf
+ sql_type_varchar(int $length) : DataType
+
+
+ Create a VARCHAR data type.
@param int $length Maximum character length
`
return div
},
- apply: snippet("\\Flow\\ETL\\DSL\\sprintf(" + "$" + "{" + "1:format" + "}" + ", " + "$" + "{" + "2:args" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\sql_type_varchar(" + "$" + "{" + "1:length" + "}" + ")"),
boost: 10
}, {
- label: "sqlite_insert_options",
+ label: "star",
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
+ star(string $table = null) : Star
- @param array $conflict_columns
@param array $update_columns
+ Create a SELECT * expression.
`
return div
},
- apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\sqlite_insert_options(" + "$" + "{" + "1:skip_conflicts" + "}" + ", " + "$" + "{" + "2:conflict_columns" + "}" + ", " + "$" + "{" + "3:update_columns" + "}" + ")"),
+ apply: snippet("\\Flow\\PostgreSql\\DSL\\star(" + "$" + "{" + "1:table" + "}" + ")"),
boost: 10
}, {
label: "stdout_filesystem",
@@ -4631,6 +7439,24 @@ const dslFunctions = [
},
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",
@@ -4646,6 +7472,42 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\DSL\\sum(" + "$" + "{" + "1:ref" + "}" + ")"),
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",
@@ -4664,6 +7526,24 @@ const dslFunctions = [
},
apply: snippet("\\Flow\\ETL\\Adapter\\Doctrine\\table_schema_to_flow_schema(" + "$" + "{" + "1:table" + "}" + ", " + "$" + "{" + "2:types_map" + "}" + ")"),
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",
@@ -5252,6 +8132,42 @@ const dslFunctions = [
},
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: "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: "types",
type: "function",
@@ -5288,6 +8204,24 @@ const dslFunctions = [
},
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\', sql_type_text())
Produces: name text
Example: type_attr(\'description\', sql_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",
@@ -6023,6 +8957,42 @@ const dslFunctions = [
},
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",
@@ -6104,6 +9074,24 @@ const dslFunctions = [
},
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: "when",
type: "function",
@@ -6119,6 +9107,24 @@ const dslFunctions = [
},
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",
@@ -6134,6 +9140,78 @@ const dslFunctions = [
},
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",
diff --git a/web/landing/assets/wasm/tools/flow.phar b/web/landing/assets/wasm/tools/flow.phar
index f529838bd..69525c9ab 100755
Binary files a/web/landing/assets/wasm/tools/flow.phar and b/web/landing/assets/wasm/tools/flow.phar differ