39 lines
2 KiB
Diff
39 lines
2 KiB
Diff
# 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.
|