Skip to content

feat: introduction of encoder/hydrator row contract #2536

Merged
norberttech merged 1 commit into
1.xfrom
encoders-hydrators-contract
Jul 18, 2026
Merged

feat: introduction of encoder/hydrator row contract #2536
norberttech merged 1 commit into
1.xfrom
encoders-hydrators-contract

Conversation

@norberttech

@norberttech norberttech commented Jul 18, 2026

Copy link
Copy Markdown
Member

Change Log


Added

  • flow-php/etl - bucketed hash join with disk spilling and JoinConfig DSL
  • flow-php/etl - Row\Encoder and Row\Hydrator abstractions (PHP, native, adaptive)
  • flow-php/etl - NullEntry and NullDefinition
  • flow-php/etl - Floe stream reader/writer with PHP and Rust encoders
  • flow-php/etl - InMemoryBucketsCache for external sort
  • flow-php/etl - Serializer DSL functions
  • flow-php/filesystem - in-memory string source/destination streams

Fixed

Changed

  • flow-php/etl - simplified Cache contract
  • flow-php/etl-adapter-csv - RowsNormalizer replaced with CSVEncoder, schema-driven hydration in extractor
  • flow-php/etl-adapter-doctrine - RowsNormalizer replaced with DbalEncoder, schema-driven hydration in extractors
  • flow-php/etl-adapter-excel - ExcelRowsNormalizer replaced with ExcelEncoder, schema-driven hydration in extractor
  • flow-php/etl-adapter-google-sheet - GoogleSheetEncoder, schema-driven hydration in extractor
  • flow-php/etl-adapter-json - RowsNormalizer replaced with JSONEncoder, schema-driven hydration in extractors
  • flow-php/etl-adapter-parquet - RowsNormalizer replaced with ParquetEncoder, schema-driven hydration in extractor
  • flow-php/etl-adapter-postgresql - PostgreSqlEncoder, schema-driven hydration in extractors
  • flow-php/etl-adapter-seal - RowsNormalizer replaced with SealEncoder
  • flow-php/etl-adapter-text - TextEncoder, schema-driven hydration in extractor
  • flow-php/etl-adapter-xml - RowsNormalizer replaced with XMLEncoder, schema-driven hydration in extractors
  • flow-php/flow-php-ext - reworked Rust encode/hydrate/cast pipeline

Removed

  • flow-php/etl - legacy Processor\HashJoin hash table and buckets
  • flow-php/etl - FloeFile and legacy Floe encoders/serializers

Deprecated

Security

Since one picture tells more than a thousand words, we pretty much moved away from:

image

Into

image

Which allowed us to supercharge some of the expensive operations through rust based php flow dedicated extension flow-php/flow-php-ext 💪

Reworked benchmarks are coming next!


View with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is enabled.

- rework hash join into spillable bucketed HashTable with configurable
join memory via JoinConfig DSL
- replace per-adapter RowsNormalizers with shared Row Encoder
abstraction (CSV, JSON, XML, Parquet, Doctrine, PostgreSQL, Excel, Seal,
Text, Google Sheet)
- introduce Row Hydrator (PHP, native, adaptive) with schema-driven
entry instantiation and RawRowValues
- add NullEntry and NullDefinition for schema-level null handling
- rewrite Floe format around stream reader/writer and adaptive PHP/Rust
encoders, with matching flow-php-ext hydrate/cast rework
- simplify Cache contract and add in-memory buckets cache for
sort/group-by
@codecov

codecov Bot commented Jul 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.76864% with 239 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.31%. Comparing base (3f168ea) to head (a6ce8e0).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@             Coverage Diff              @@
##                1.x    #2536      +/-   ##
============================================
- Coverage     86.40%   86.31%   -0.10%     
- Complexity        0    23210   +23210     
============================================
  Files          1749     1759      +10     
  Lines         70532    70733     +201     
============================================
+ Hits          60944    61054     +110     
- Misses         9588     9679      +91     
Components Coverage Δ
etl 89.67% <94.84%> (-0.21%) ⬇️
cli 89.40% <ø> (ø)
lib-array-dot 81.44% <ø> (ø)
lib-azure-sdk 64.44% <ø> (ø)
lib-doctrine-dbal-bulk 93.61% <ø> (ø)
lib-filesystem 86.64% <ø> (+0.60%) ⬆️
lib-types 91.15% <ø> (+0.60%) ⬆️
lib-parquet 70.23% <ø> (ø)
lib-parquet-viewer 82.26% <ø> (ø)
lib-snappy 89.82% <ø> (+0.44%) ⬆️
lib-dremel 0.00% <ø> (ø)
lib-postgresql 88.62% <ø> (ø)
lib-telemetry 86.58% <ø> (ø)
bridge-filesystem-async-aws 92.74% <ø> (ø)
bridge-filesystem-azure 90.45% <ø> (ø)
bridge-monolog-http 96.82% <ø> (ø)
bridge-monolog-telemetry 94.79% <ø> (ø)
bridge-openapi-specification 92.07% <ø> (ø)
symfony-http-foundation 78.57% <ø> (ø)
bridge-psr18-telemetry 100.00% <ø> (ø)
bridge-psr3-telemetry 98.95% <ø> (ø)
bridge-psr7-telemetry 100.00% <ø> (ø)
bridge-telemetry-otlp 90.41% <ø> (ø)
bridge-symfony-http-foundation-telemetry 92.85% <ø> (ø)
bridge-symfony-filesystem-bundle 91.85% <ø> (ø)
bridge-symfony-filesystem-cache 98.18% <ø> (ø)
bridge-symfony-postgresql-bundle 93.70% <ø> (ø)
bridge-symfony-postgresql-cache 94.41% <ø> (ø)
bridge-symfony-postgresql-messenger 98.80% <ø> (ø)
bridge-symfony-postgresql-session 93.65% <ø> (ø)
bridge-symfony-telemetry-bundle 90.10% <ø> (ø)
adapter-chartjs 84.05% <ø> (ø)
adapter-csv 89.46% <88.06%> (-2.21%) ⬇️
adapter-doctrine 90.75% <93.33%> (-0.04%) ⬇️
adapter-google-sheet 91.56% <82.43%> (-7.62%) ⬇️
adapter-http 73.23% <ø> (ø)
adapter-json 87.30% <81.06%> (-1.33%) ⬇️
adapter-logger 50.00% <ø> (ø)
adapter-parquet 88.58% <95.23%> (+5.03%) ⬆️
adapter-text 92.59% <97.33%> (+18.01%) ⬆️
adapter-xml 83.56% <84.45%> (-2.93%) ⬇️
adapter-avro 0.00% <ø> (ø)
adapter-excel 86.72% <75.73%> (-7.44%) ⬇️
adapter-postgresql 90.84% <90.78%> (-0.23%) ⬇️
adapter-seal 83.26% <65.82%> (-10.62%) ⬇️
bridge-phpunit-postgresql 75.30% <ø> (ø)
bridge-phpunit-telemetry 87.32% <ø> (ø)
bridge-phpstan-types 0.00% <ø> (ø)
bridge-postgresql-valinor 100.00% <ø> (ø)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@norberttech
norberttech merged commit b0ea501 into 1.x Jul 18, 2026
53 checks passed
@norberttech
norberttech deleted the encoders-hydrators-contract branch July 18, 2026 18:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant