java-topology/defects/doctrine/patch/doctrine-0001-hydrator-discriminator-set.patch

39 lines
2 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UNDF: UNDF-2026-000000050
Fixes doctrine-0001: AbstractHydrator `discriminatorValues` in_array per row.
--- a/src/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php
+++ b/src/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php
@@ DEFECT doctrine-0001: AbstractHydrator.php:328 gatherRowData()
private function hydrateColumnInfo(array $cacheKeyInfo, mixed $value): mixed
{
// ...
- if (
- isset($cacheKeyInfo['discriminatorColumn'], $data[$cacheKeyInfo['discriminatorColumn']])
- && ! in_array((string) $data[$cacheKeyInfo['discriminatorColumn']], $cacheKeyInfo['discriminatorValues'], true)
+ // FIX doctrine-0001: convert discriminatorValues from array to Set for O(1) lookup
+ // Previously: in_array() scans the entire discriminatorValues array per row — O(subclasses).
+ // Called once per column per row in queries over inheritance hierarchies.
+ if (
+ isset($cacheKeyInfo['discriminatorColumn'], $data[$cacheKeyInfo['discriminatorColumn']])
+ && ! isset($cacheKeyInfo['discriminatorValuesSet'][(string) $data[$cacheKeyInfo['discriminatorColumn']]])
) {
break;
}
}
@@ SETUP: build the set when cacheKeyInfo is first created (in buildCacheEntry)
- $cacheKeyInfo['discriminatorValues'] = $this->getDiscriminatorValues($classMetadata);
+ $discriminatorValues = $this->getDiscriminatorValues($classMetadata);
+ $cacheKeyInfo['discriminatorValues'] = $discriminatorValues;
+ // FIX doctrine-0001: pre-build a hash set for O(1) lookup in gatherRowData
+ $cacheKeyInfo['discriminatorValuesSet'] = array_flip($discriminatorValues);
# BEFORE: in_array($disc, $discriminatorValues) — O(S) per row per col, S = subclass count.
# Total: O(N × C × S) for N rows, C columns, S subclasses.
# AFTER: isset($discriminatorValuesSet[$disc]) — O(1) hash lookup.
# Total: O(N × C).
# Triggered by: any DQL/QueryBuilder query on an entity with CTI/STI inheritance
# that returns multiple rows.