Hibernate (5 HIGH): addColumn/addReferencedColumn/addIndex ArrayList→LinkedHashSet (19x) FK second-pass LinkedHashSet, orderHierarchy LinkedHashSet MyBatis (1 MEDIUM): sortConstructorMappings indexOf→HashMap (12x) EF Core (2 HIGH + 1 MEDIUM): FindGenerationProperty HashSet (250x), AddPrincipals HashSet (250x), FK discovery HashSet (6x) Diesel (3 MEDIUM): SQLite/MySQL row position()→BTreeMap (51x) SQLAlchemy (2 HIGH): _values_bindparam Set (500x), evaluated_keys Set (500x) Peewee (1 MEDIUM): _SortedFieldList.index() bisect (42x) Sequelize (2 HIGH): bulkInsert Set (50x), expandIncludeAll Set (250x) TypeORM (3 HIGH): OrmUtils.uniq Map (500x), diffColumns Set (125x), updatedColumns Set (100x) Doctrine ORM (1 HIGH + 2 MEDIUM): hydrator discriminator (26x), addSubClass (250x), SqlWalker partial (130x) GORM (1 MEDIUM): sortCallbacks getRIndex→map (194x) SQLite: SqliteTest unit proof 4/4 PASS (101x) Unit tests: all PASS — Hibernate/MyBatis/EfCore/Diesel/SQLAlchemy/Peewee/ Sequelize/TypeORM/Doctrine/GORM Whitepaper: 157 sites, 62 ecosystems; PDF 752K
26 lines
1.2 KiB
Diff
26 lines
1.2 KiB
Diff
Fixes doctrine-0002: ClassMetadata::addSubClass in_array dedup.
|
||
|
||
--- a/src/Doctrine/ORM/Mapping/ClassMetadata.php
|
||
+++ b/src/Doctrine/ORM/Mapping/ClassMetadata.php
|
||
|
||
@@ DEFECT doctrine-0002: ClassMetadata.php:2313 addSubClass()
|
||
|
||
+ /** @var array<string, true> FIX doctrine-0002: hash set for O(1) subclass dedup */
|
||
+ public array $subClassesSet = [];
|
||
|
||
public function addSubClass(string $className): void
|
||
{
|
||
- if (is_subclass_of($className, $this->name) && ! in_array($className, $this->subClasses, true)) {
|
||
- $this->subClasses[] = $className;
|
||
+ // FIX doctrine-0002: replace O(S) in_array scan with O(1) hash check.
|
||
+ if (is_subclass_of($className, $this->name) && ! isset($this->subClassesSet[$className])) {
|
||
+ $this->subClasses[] = $className;
|
||
+ $this->subClassesSet[$className] = true;
|
||
}
|
||
}
|
||
|
||
# BEFORE: in_array($className, $this->subClasses) — O(S) per addSubClass call.
|
||
# ClassMetadataFactory calls addSubClass in loops over parent hierarchies.
|
||
# Total: O(H × S) where H = hierarchy depth, S = subclass count.
|
||
# AFTER: isset($this->subClassesSet[$className]) — O(1).
|
||
# Triggered by: application startup / metadata cache warming.
|