java-topology/defects/doctrine/patch/doctrine-0003-sqlwalker-partialfield-set.patch

35 lines
1.7 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-000000052
Fixes doctrine-0003: SqlWalker::walkObjectExpression in_array per field.
--- a/src/Doctrine/ORM/Query/SqlWalker.php
+++ b/src/Doctrine/ORM/Query/SqlWalker.php
@@ DEFECT doctrine-0003: SqlWalker.php:1405,1445 walkObjectExpression()
private function walkObjectExpression(...): string
{
+ // FIX doctrine-0003: convert partialFieldSet from array to set for O(1) lookup.
+ // Previously: in_array($fieldName, $partialFieldSet) is O(|partialFieldSet|) per field.
+ // Called for every fieldMapping in every class/subclass in the DQL result.
+ $partialFieldSetFlip = $partialFieldSet !== null ? array_flip($partialFieldSet) : null;
foreach ($class->fieldMappings as $fieldName => $mapping) {
- if ($partialFieldSet && ! in_array($fieldName, $partialFieldSet, true)) {
+ if ($partialFieldSetFlip !== null && ! isset($partialFieldSetFlip[$fieldName])) {
continue;
}
// ... build SQL
}
foreach ($subClass->fieldMappings as $fieldName => $mapping) {
- if (isset($mapping->inherited) || ($partialFieldSet && ! in_array($fieldName, $partialFieldSet, true))) {
+ if (isset($mapping->inherited) || ($partialFieldSetFlip !== null && ! isset($partialFieldSetFlip[$fieldName]))) {
continue;
}
}
}
# BEFORE: in_array($field, $partialFieldSet) — O(P) per field across all mappings.
# Total: O(F × P) for F field mappings, P partial field set size.
# AFTER: isset($partialFieldSetFlip[$field]) — O(1).
# Triggered by: any DQL query using SELECT PARTIAL entity.{field1,field2,...}.