Tweaked INSTANCE OF implementation.
This commit is contained in:
parent
a25101add1
commit
0c07b31136
@ -240,13 +240,13 @@ class ClassMetadataFactory
|
|||||||
|
|
||||||
if ($parent) {
|
if ($parent) {
|
||||||
$class->setInheritanceType($parent->inheritanceType);
|
$class->setInheritanceType($parent->inheritanceType);
|
||||||
|
$class->setDiscriminatorColumn($parent->discriminatorColumn);
|
||||||
$class->setIdGeneratorType($parent->generatorType);
|
$class->setIdGeneratorType($parent->generatorType);
|
||||||
$this->_addInheritedFields($class, $parent);
|
$this->_addInheritedFields($class, $parent);
|
||||||
$this->_addInheritedRelations($class, $parent);
|
$this->_addInheritedRelations($class, $parent);
|
||||||
$class->setIdentifier($parent->identifier);
|
$class->setIdentifier($parent->identifier);
|
||||||
$class->setVersioned($parent->isVersioned);
|
$class->setVersioned($parent->isVersioned);
|
||||||
$class->setVersionField($parent->versionField);
|
$class->setVersionField($parent->versionField);
|
||||||
$this->_addInheritedDiscriminatorColumn($class, $parent);
|
|
||||||
$class->setDiscriminatorMap($parent->discriminatorMap);
|
$class->setDiscriminatorMap($parent->discriminatorMap);
|
||||||
$class->setLifecycleCallbacks($parent->lifecycleCallbacks);
|
$class->setLifecycleCallbacks($parent->lifecycleCallbacks);
|
||||||
}
|
}
|
||||||
@ -314,29 +314,6 @@ class ClassMetadataFactory
|
|||||||
return new ClassMetadata($className);
|
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.
|
* Adds inherited fields to the subclass mapping.
|
||||||
*
|
*
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
|
|
||||||
namespace Doctrine\ORM\Query;
|
namespace Doctrine\ORM\Query;
|
||||||
|
|
||||||
use Doctrine\ORM\Query,
|
use Doctrine\DBAL\LockMode,
|
||||||
|
Doctrine\ORM\Query,
|
||||||
Doctrine\ORM\Query\QueryException;
|
Doctrine\ORM\Query\QueryException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -375,13 +376,13 @@ class SqlWalker implements TreeWalker
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (($lockMode = $this->_query->getHint(Query::HINT_LOCK_MODE)) !== false) {
|
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();
|
$sql .= " " . $this->_platform->getReadLockSQL();
|
||||||
} else if ($lockMode == \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE) {
|
} else if ($lockMode == LockMode::PESSIMISTIC_WRITE) {
|
||||||
$sql .= " " . $this->_platform->getWriteLockSQL();
|
$sql .= " " . $this->_platform->getWriteLockSQL();
|
||||||
} else if ($lockMode == \Doctrine\DBAL\LockMode::OPTIMISTIC) {
|
} else if ($lockMode == LockMode::OPTIMISTIC) {
|
||||||
foreach ($this->_selectedClasses AS $class) {
|
foreach ($this->_selectedClasses AS $class) {
|
||||||
if (!$class->isVersioned) {
|
if ( ! $class->isVersioned) {
|
||||||
throw \Doctrine\ORM\OptimisticLockException::lockFailed();
|
throw \Doctrine\ORM\OptimisticLockException::lockFailed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1447,7 +1448,7 @@ class SqlWalker implements TreeWalker
|
|||||||
. $targetClass->getQuotedColumnName($idField, $this->_platform) . ' = ?';
|
. $targetClass->getQuotedColumnName($idField, $this->_platform) . ' = ?';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql . ')';
|
return $sql . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1517,7 +1518,7 @@ class SqlWalker implements TreeWalker
|
|||||||
* @param InstanceOfExpression
|
* @param InstanceOfExpression
|
||||||
* @return string The SQL.
|
* @return string The SQL.
|
||||||
*/
|
*/
|
||||||
function walkInstanceOfExpression($instanceOfExpr)
|
public function walkInstanceOfExpression($instanceOfExpr)
|
||||||
{
|
{
|
||||||
$sql = '';
|
$sql = '';
|
||||||
|
|
||||||
@ -1525,15 +1526,15 @@ class SqlWalker implements TreeWalker
|
|||||||
$discrClass = $class = $this->_queryComponents[$dqlAlias]['metadata'];
|
$discrClass = $class = $this->_queryComponents[$dqlAlias]['metadata'];
|
||||||
$fieldName = null;
|
$fieldName = null;
|
||||||
|
|
||||||
if ($class->discriminatorColumn && isset($class->discriminatorColumn['inherited'])) {
|
if ($class->discriminatorColumn) {
|
||||||
$discrClass = $this->_em->getClassMetadata($class->discriminatorColumn['inherited']);
|
$discrClass = $this->_em->getClassMetadata($class->rootEntityName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_useSqlTableAliases) {
|
if ($this->_useSqlTableAliases) {
|
||||||
$sql .= $this->getSQLTableAlias($discrClass->table['name'], $dqlAlias) . '.';
|
$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) {
|
if ($instanceOfExpr->value instanceof AST\InputParameter) {
|
||||||
// We need to modify the parameter value to be its correspondent mapped value
|
// We need to modify the parameter value to be its correspondent mapped value
|
||||||
@ -1546,20 +1547,15 @@ class SqlWalker implements TreeWalker
|
|||||||
|
|
||||||
$entityClassName = $paramValue->name;
|
$entityClassName = $paramValue->name;
|
||||||
} else {
|
} 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) {
|
if ($entityClassName == $class->name) {
|
||||||
$sql .= $conn->quote($class->discriminatorValue);
|
$sql .= $this->_conn->quote($class->discriminatorValue);
|
||||||
} else {
|
} else {
|
||||||
foreach ($class->subClasses as $subclassName) {
|
$discrMap = array_flip($class->discriminatorMap);
|
||||||
if ($entityClassName === $subclassName) {
|
$sql .= $this->_conn->quote($discrMap[$entityClassName]);
|
||||||
$sql .= $conn->quote($this->_em->getClassMetadata($subclassName)->discriminatorValue);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
@ -1781,7 +1777,7 @@ class SqlWalker implements TreeWalker
|
|||||||
return $primary->dispatch($this);
|
return $primary->dispatch($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to deal with IdentificationVariable here
|
// TODO: We need to deal with IdentificationVariable here
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user