# 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,...}.