diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 107f3cdcf..14bc7015d 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -240,13 +240,13 @@ class ClassMetadataFactory if ($parent) { $class->setInheritanceType($parent->inheritanceType); + $class->setDiscriminatorColumn($parent->discriminatorColumn); $class->setIdGeneratorType($parent->generatorType); $this->_addInheritedFields($class, $parent); $this->_addInheritedRelations($class, $parent); $class->setIdentifier($parent->identifier); $class->setVersioned($parent->isVersioned); $class->setVersionField($parent->versionField); - $this->_addInheritedDiscriminatorColumn($class, $parent); $class->setDiscriminatorMap($parent->discriminatorMap); $class->setLifecycleCallbacks($parent->lifecycleCallbacks); } @@ -314,29 +314,6 @@ class ClassMetadataFactory return new ClassMetadata($className); } - /** - * Adds inherited discriminator column to the subclass mapping. - * - * @param Doctrine\ORM\Mapping\ClassMetadata $subClass - * @param Doctrine\ORM\Mapping\ClassMetadata $parentClass - */ - private function _addInheritedDiscriminatorColumn(ClassMetadata $subClass, ClassMetadata $parentClass) - { - if ($parentClass->discriminatorColumn) { - $columnDef = $parentClass->discriminatorColumn; - - if ( ! isset($columnDef['inherited'])) { - $columnDef['inherited'] = $parentClass->name; - } - - if ( ! isset($columnDef['declared'])) { - $columnDef['declared'] = $parentClass->name; - } - - $subClass->setDiscriminatorColumn($columnDef); - } - } - /** * Adds inherited fields to the subclass mapping. * diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 3b48d3961..b00ffcc9d 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -19,7 +19,8 @@ namespace Doctrine\ORM\Query; -use Doctrine\ORM\Query, +use Doctrine\DBAL\LockMode, + Doctrine\ORM\Query, Doctrine\ORM\Query\QueryException; /** @@ -375,13 +376,13 @@ class SqlWalker implements TreeWalker ); if (($lockMode = $this->_query->getHint(Query::HINT_LOCK_MODE)) !== false) { - if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_READ) { + if ($lockMode == LockMode::PESSIMISTIC_READ) { $sql .= " " . $this->_platform->getReadLockSQL(); - } else if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE) { + } else if ($lockMode == LockMode::PESSIMISTIC_WRITE) { $sql .= " " . $this->_platform->getWriteLockSQL(); - } else if ($lockMode == \Doctrine\DBAL\LockMode::OPTIMISTIC) { + } else if ($lockMode == LockMode::OPTIMISTIC) { foreach ($this->_selectedClasses AS $class) { - if (!$class->isVersioned) { + if ( ! $class->isVersioned) { throw \Doctrine\ORM\OptimisticLockException::lockFailed(); } } @@ -1447,7 +1448,7 @@ class SqlWalker implements TreeWalker . $targetClass->getQuotedColumnName($idField, $this->_platform) . ' = ?'; } } - + return $sql . ')'; } @@ -1517,7 +1518,7 @@ class SqlWalker implements TreeWalker * @param InstanceOfExpression * @return string The SQL. */ - function walkInstanceOfExpression($instanceOfExpr) + public function walkInstanceOfExpression($instanceOfExpr) { $sql = ''; @@ -1525,15 +1526,15 @@ class SqlWalker implements TreeWalker $discrClass = $class = $this->_queryComponents[$dqlAlias]['metadata']; $fieldName = null; - if ($class->discriminatorColumn && isset($class->discriminatorColumn['inherited'])) { - $discrClass = $this->_em->getClassMetadata($class->discriminatorColumn['inherited']); + if ($class->discriminatorColumn) { + $discrClass = $this->_em->getClassMetadata($class->rootEntityName); } if ($this->_useSqlTableAliases) { $sql .= $this->getSQLTableAlias($discrClass->table['name'], $dqlAlias) . '.'; } - $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' != ' : ' = '); + $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' <> ' : ' = '); if ($instanceOfExpr->value instanceof AST\InputParameter) { // We need to modify the parameter value to be its correspondent mapped value @@ -1546,20 +1547,15 @@ class SqlWalker implements TreeWalker $entityClassName = $paramValue->name; } else { - $entityClassName = $instanceOfExpr->value; + // Get name from ClassMetadata to resolve aliases. + $entityClassName = $this->_em->getClassMetadata($instanceOfExpr->value)->name; } - $conn = $this->_em->getConnection(); - if ($entityClassName == $class->name) { - $sql .= $conn->quote($class->discriminatorValue); + $sql .= $this->_conn->quote($class->discriminatorValue); } else { - foreach ($class->subClasses as $subclassName) { - if ($entityClassName === $subclassName) { - $sql .= $conn->quote($this->_em->getClassMetadata($subclassName)->discriminatorValue); - break; - } - } + $discrMap = array_flip($class->discriminatorMap); + $sql .= $this->_conn->quote($discrMap[$entityClassName]); } return $sql; @@ -1781,7 +1777,7 @@ class SqlWalker implements TreeWalker return $primary->dispatch($this); } - // We need to deal with IdentificationVariable here + // TODO: We need to deal with IdentificationVariable here return ''; }