Commit 3d17cb0d authored by romanb's avatar romanb

[2.0] Applied fixes for character casing issues. Simplified inheritance...

[2.0] Applied fixes for character casing issues. Simplified inheritance mapping and improved handling of outer joins in Class Table Inheritance.
parent d8c80783
...@@ -269,6 +269,13 @@ class Parser ...@@ -269,6 +269,13 @@ class Parser
public function Values() public function Values()
{ {
$values = array(); $values = array();
// Handle the case of a single array as value, i.e. @Foo({....})
if ($this->_lexer->isNextToken('{')) {
$values['value'] = $this->Value();
return $values;
}
$values[] = $this->Value(); $values[] = $this->Value();
while ($this->_lexer->isNextToken(',')) { while ($this->_lexer->isNextToken(',')) {
......
...@@ -34,7 +34,7 @@ class MySqlSchemaManager extends AbstractSchemaManager ...@@ -34,7 +34,7 @@ class MySqlSchemaManager extends AbstractSchemaManager
{ {
protected function _getPortableViewDefinition($view) protected function _getPortableViewDefinition($view)
{ {
return $view['table_name']; return $view['TABLE_NAME'];
} }
protected function _getPortableTableDefinition($table) protected function _getPortableTableDefinition($table)
...@@ -45,8 +45,8 @@ class MySqlSchemaManager extends AbstractSchemaManager ...@@ -45,8 +45,8 @@ class MySqlSchemaManager extends AbstractSchemaManager
protected function _getPortableUserDefinition($user) protected function _getPortableUserDefinition($user)
{ {
return array( return array(
'user' => $user['user'], 'user' => $user['User'],
'password' => $user['password'], 'password' => $user['Password'],
); );
} }
...@@ -83,12 +83,12 @@ class MySqlSchemaManager extends AbstractSchemaManager ...@@ -83,12 +83,12 @@ class MySqlSchemaManager extends AbstractSchemaManager
protected function _getPortableDatabaseDefinition($database) protected function _getPortableDatabaseDefinition($database)
{ {
return $database['database']; return $database['Database'];
} }
protected function _getPortableTableColumnDefinition($tableColumn) protected function _getPortableTableColumnDefinition($tableColumn)
{ {
$dbType = strtolower($tableColumn['type']); $dbType = strtolower($tableColumn['Type']);
$dbType = strtok($dbType, '(), '); $dbType = strtok($dbType, '(), ');
if ($dbType == 'national') { if ($dbType == 'national') {
$dbType = strtok('(), '); $dbType = strtok('(), ');
...@@ -117,28 +117,28 @@ class MySqlSchemaManager extends AbstractSchemaManager ...@@ -117,28 +117,28 @@ class MySqlSchemaManager extends AbstractSchemaManager
if (preg_match('/^(is|has)/', $tableColumn['name'])) { if (preg_match('/^(is|has)/', $tableColumn['name'])) {
$type = array_reverse($type); $type = array_reverse($type);
} }
$unsigned = preg_match('/ unsigned/i', $tableColumn['type']); $unsigned = preg_match('/ unsigned/i', $tableColumn['Type']);
$length = 1; $length = 1;
break; break;
case 'smallint': case 'smallint':
$type = 'integer'; $type = 'integer';
$unsigned = preg_match('/ unsigned/i', $tableColumn['type']); $unsigned = preg_match('/ unsigned/i', $tableColumn['Type']);
$length = 2; $length = 2;
break; break;
case 'mediumint': case 'mediumint':
$type = 'integer'; $type = 'integer';
$unsigned = preg_match('/ unsigned/i', $tableColumn['type']); $unsigned = preg_match('/ unsigned/i', $tableColumn['Type']);
$length = 3; $length = 3;
break; break;
case 'int': case 'int':
case 'integer': case 'integer':
$type = 'integer'; $type = 'integer';
$unsigned = preg_match('/ unsigned/i', $tableColumn['type']); $unsigned = preg_match('/ unsigned/i', $tableColumn['Type']);
$length = 4; $length = 4;
break; break;
case 'bigint': case 'bigint':
$type = 'integer'; $type = 'integer';
$unsigned = preg_match('/ unsigned/i', $tableColumn['type']); $unsigned = preg_match('/ unsigned/i', $tableColumn['Type']);
$length = 8; $length = 8;
break; break;
case 'tinytext': case 'tinytext':
...@@ -249,12 +249,12 @@ class MySqlSchemaManager extends AbstractSchemaManager ...@@ -249,12 +249,12 @@ class MySqlSchemaManager extends AbstractSchemaManager
$values = isset($def['values']) ? $def['values'] : array(); $values = isset($def['values']) ? $def['values'] : array();
$column = array( $column = array(
'name' => $tableColumn['field'], 'name' => $tableColumn['Field'],
'values' => $values, 'values' => $values,
'primary' => (bool) (strtolower($tableColumn['key']) == 'pri'), 'primary' => (bool) (strtolower($tableColumn['Key']) == 'pri'),
'default' => $tableColumn['default'], 'default' => $tableColumn['Default'],
'notnull' => (bool) ($tableColumn['null'] != 'YES'), 'notnull' => (bool) ($tableColumn['Null'] != 'YES'),
'autoincrement' => (bool) (strpos($tableColumn['extra'], 'auto_increment') !== false), 'autoincrement' => (bool) (strpos($tableColumn['Extra'], 'auto_increment') !== false),
); );
$column = array_merge($column, $def); $column = array_merge($column, $def);
......
...@@ -40,7 +40,6 @@ class ObjectHydrator extends AbstractHydrator ...@@ -40,7 +40,6 @@ class ObjectHydrator extends AbstractHydrator
*/ */
/* Local ClassMetadata cache to avoid going to the EntityManager all the time. */ /* Local ClassMetadata cache to avoid going to the EntityManager all the time. */
private $_ce = array(); private $_ce = array();
private $_discriminatorMap = array();
/* /*
* The following parts are reinitialized on every hydration run. * The following parts are reinitialized on every hydration run.
*/ */
...@@ -76,17 +75,6 @@ class ObjectHydrator extends AbstractHydrator ...@@ -76,17 +75,6 @@ class ObjectHydrator extends AbstractHydrator
if ( ! isset($this->_ce[$className])) { if ( ! isset($this->_ce[$className])) {
$this->_ce[$className] = $class; $this->_ce[$className] = $class;
// Gather class descriptors and discriminator values of subclasses, if necessary
if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined()) {
$this->_discriminatorMap[$className][$class->discriminatorValue] = $className;
foreach (array_merge($class->parentClasses, $class->subClasses) as $className) {
$otherClass = $this->_em->getClassMetadata($className);
$value = $otherClass->discriminatorValue;
$this->_ce[$className] = $otherClass;
$this->_discriminatorMap[$class->name][$value] = $className;
$this->_discriminatorMap[$className][$value] = $className;
}
}
} }
// Remember which associations are "fetch joined" // Remember which associations are "fetch joined"
...@@ -172,7 +160,7 @@ class ObjectHydrator extends AbstractHydrator ...@@ -172,7 +160,7 @@ class ObjectHydrator extends AbstractHydrator
$className = $this->_rsm->aliasMap[$dqlAlias]; $className = $this->_rsm->aliasMap[$dqlAlias];
if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) { if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) {
$discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]]; $discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]];
$className = $this->_discriminatorMap[$className][$data[$discrColumn]]; $className = $this->_ce[$className]->discriminatorMap[$data[$discrColumn]];
unset($data[$discrColumn]); unset($data[$discrColumn]);
} }
...@@ -180,7 +168,7 @@ class ObjectHydrator extends AbstractHydrator ...@@ -180,7 +168,7 @@ class ObjectHydrator extends AbstractHydrator
// Properly initialize any unfetched associations, if partial objects are not allowed. // Properly initialize any unfetched associations, if partial objects are not allowed.
if ( ! $this->_allowPartialObjects) { if ( ! $this->_allowPartialObjects) {
foreach ($this->_ce[$className]->associationMappings as $field => $assoc) { foreach ($this->_getClassMetadata($className)->associationMappings as $field => $assoc) {
// Check if the association is not among the fetch-joined associatons already. // Check if the association is not among the fetch-joined associatons already.
if ( ! isset($this->_fetchedAssociations[$className][$field])) { if ( ! isset($this->_fetchedAssociations[$className][$field])) {
if ($assoc->isOneToOne()) { if ($assoc->isOneToOne()) {
......
...@@ -254,7 +254,7 @@ final class ClassMetadata ...@@ -254,7 +254,7 @@ final class ClassMetadata
public $fieldNames = array(); public $fieldNames = array();
/** /**
* An array of column names. Keys are field names and values column names. * A map of field names to column names. Keys are field names and values column names.
* Used to look up column names from field names. * Used to look up column names from field names.
* This is the reverse lookup map of $_fieldNames. * This is the reverse lookup map of $_fieldNames.
* *
...@@ -262,6 +262,15 @@ final class ClassMetadata ...@@ -262,6 +262,15 @@ final class ClassMetadata
*/ */
public $columnNames = array(); public $columnNames = array();
/**
* A map of column names as they appear in an SQL result set to column names as they
* are defined in the mapping. This includes the columns of all mapped fields as well
* as any join columns and discriminator columns.
*
* @var array
*/
public $resultColumnNames = array();
/** /**
* Whether to automatically OUTER JOIN subtypes when a basetype is queried. * Whether to automatically OUTER JOIN subtypes when a basetype is queried.
* *
...@@ -282,6 +291,17 @@ final class ClassMetadata ...@@ -282,6 +291,17 @@ final class ClassMetadata
*/ */
public $discriminatorValue; public $discriminatorValue;
/**
* The discriminator map of all mapped classes in the hierarchy.
*
* <b>This does only apply to the JOINED and SINGLE_TABLE inheritance mapping strategies
* where a discriminator column is used.</b>
*
* @var mixed
* @see _discriminatorColumn
*/
public $discriminatorMap = array();
/** /**
* The definition of the descriminator column used in JOINED and SINGLE_TABLE * The definition of the descriminator column used in JOINED and SINGLE_TABLE
* inheritance mappings. * inheritance mappings.
...@@ -1139,16 +1159,19 @@ final class ClassMetadata ...@@ -1139,16 +1159,19 @@ final class ClassMetadata
} }
/** /**
* Sets the subclasses of the mapped class. * Sets the mapped subclasses of this class.
* *
* <b>All entity classes that participate in a hierarchy and have subclasses * @param array $subclasses The names of all mapped subclasses.
* need to declare them this way.</b>
*
* @param array $subclasses The names of all subclasses.
*/ */
public function setSubclasses(array $subclasses) public function setSubclasses(array $subclasses)
{ {
$this->subClasses = $subclasses; foreach ($subclasses as $subclass) {
if (strpos($subclass, '\\') === false) {
$this->subClasses[] = $this->namespace . '\\' . $subclass;
} else {
$this->subClasses[] = $subclass;
}
}
} }
/** /**
...@@ -1572,14 +1595,24 @@ final class ClassMetadata ...@@ -1572,14 +1595,24 @@ final class ClassMetadata
} }
/** /**
* Sets the dsicriminator value used by this class. * Sets the dsicriminator values used by this class.
* Used for JOINED and SINGLE_TABLE inheritance mapping strategies. * Used for JOINED and SINGLE_TABLE inheritance mapping strategies.
* *
* @param array $map * @param array $map
*/ */
public function setDiscriminatorValue($value) public function setDiscriminatorMap(array $map)
{ {
foreach ($map as $value => $className) {
if (strpos($className, '\\') === false) {
$className = $this->namespace . '\\' . $className;
}
$this->discriminatorMap[$value] = $className;
if ($this->name == $className) {
$this->discriminatorValue = $value; $this->discriminatorValue = $value;
} else if (is_subclass_of($className, $this->name)) {
$this->subClasses[] = $className;
}
}
} }
/** /**
......
...@@ -177,6 +177,7 @@ class ClassMetadataFactory ...@@ -177,6 +177,7 @@ class ClassMetadataFactory
$class->setIdentifier($parent->identifier); $class->setIdentifier($parent->identifier);
$class->setVersioned($parent->isVersioned); $class->setVersioned($parent->isVersioned);
$class->setVersionField($parent->versionField); $class->setVersionField($parent->versionField);
$class->setDiscriminatorMap($parent->discriminatorMap);
} }
// Invoke driver // Invoke driver
...@@ -291,6 +292,11 @@ class ClassMetadataFactory ...@@ -291,6 +292,11 @@ class ClassMetadataFactory
if (isset($class->fieldMappings[$name]['inherited']) && ! isset($class->fieldMappings[$name]['id']) if (isset($class->fieldMappings[$name]['inherited']) && ! isset($class->fieldMappings[$name]['id'])
|| isset($class->inheritedAssociationFields[$name]) || isset($class->inheritedAssociationFields[$name])
|| ($versioned && $versionField == $name)) { || ($versioned && $versionField == $name)) {
if (isset($class->columnNames[$name])) {
// Add column mapping for SQL result sets
$columnName = $class->columnNames[$name];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
}
continue; continue;
} }
...@@ -300,11 +306,20 @@ class ClassMetadataFactory ...@@ -300,11 +306,20 @@ class ClassMetadataFactory
foreach ($assoc->targetToSourceKeyColumns as $sourceCol) { foreach ($assoc->targetToSourceKeyColumns as $sourceCol) {
$columns[] = $assoc->getQuotedJoinColumnName($sourceCol, $this->_targetPlatform); $columns[] = $assoc->getQuotedJoinColumnName($sourceCol, $this->_targetPlatform);
$values[] = '?'; $values[] = '?';
// Add column mapping for SQL result sets
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($sourceCol)] = $sourceCol;
} }
} }
} else if ($class->name != $class->rootEntityName || ! $class->isIdGeneratorIdentity() || $class->identifier[0] != $name) { } else if ($class->name != $class->rootEntityName || ! $class->isIdGeneratorIdentity() || $class->identifier[0] != $name) {
$columns[] = $class->getQuotedColumnName($name, $this->_targetPlatform); $columns[] = $class->getQuotedColumnName($name, $this->_targetPlatform);
$values[] = '?'; $values[] = '?';
// Add column mapping for SQL result sets
$columnName = $class->columnNames[$name];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
} else {
// Add column mapping for SQL result sets
$columnName = $class->columnNames[$name];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
} }
} }
} else { } else {
...@@ -319,20 +334,35 @@ class ClassMetadataFactory ...@@ -319,20 +334,35 @@ class ClassMetadataFactory
foreach ($assoc->targetToSourceKeyColumns as $sourceCol) { foreach ($assoc->targetToSourceKeyColumns as $sourceCol) {
$columns[] = $assoc->getQuotedJoinColumnName($sourceCol, $this->_targetPlatform); $columns[] = $assoc->getQuotedJoinColumnName($sourceCol, $this->_targetPlatform);
$values[] = '?'; $values[] = '?';
// Add column mapping for SQL result sets
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($sourceCol)] = $sourceCol;
} }
} }
} else if ($class->generatorType != ClassMetadata::GENERATOR_TYPE_IDENTITY || $class->identifier[0] != $name) { } else if ($class->generatorType != ClassMetadata::GENERATOR_TYPE_IDENTITY || $class->identifier[0] != $name) {
$columns[] = $class->getQuotedColumnName($name, $this->_targetPlatform); $columns[] = $class->getQuotedColumnName($name, $this->_targetPlatform);
$values[] = '?'; $values[] = '?';
// Add column mapping for SQL result sets
$columnName = $class->columnNames[$name];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
} else {
// Add column mapping for SQL result sets
$columnName = $class->columnNames[$name];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
} }
} }
} }
// Add discriminator column to the INSERT SQL if necessary // Add discriminator column to the INSERT SQL if necessary
if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined() && $class->name == $class->rootEntityName) { if (isset($class->discriminatorColumn['name'])) {
if ($class->isInheritanceTypeSingleTable() || $class->isInheritanceTypeJoined()
&& $class->name == $class->rootEntityName) {
$columns[] = $class->getQuotedDiscriminatorColumnName($this->_targetPlatform); $columns[] = $class->getQuotedDiscriminatorColumnName($this->_targetPlatform);
$values[] = '?'; $values[] = '?';
} }
// Add column mapping for SQL result sets
$columnName = $class->discriminatorColumn['name'];
$class->resultColumnNames[$this->_targetPlatform->getSqlResultCasing($columnName)] = $columnName;
}
$class->insertSql = 'INSERT INTO ' . $class->insertSql = 'INSERT INTO ' .
$class->getQuotedTableName($this->_targetPlatform) $class->getQuotedTableName($this->_targetPlatform)
......
...@@ -95,10 +95,10 @@ class AnnotationDriver implements Driver ...@@ -95,10 +95,10 @@ class AnnotationDriver implements Driver
)); ));
} }
// Evaluate DiscriminatorValue annotation // Evaluate DiscriminatorMap annotation
if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorValue'])) { if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap'])) {
$discrValueAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorValue']; $discrMapAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap'];
$metadata->setDiscriminatorValue($discrValueAnnot->value); $metadata->setDiscriminatorMap($discrMapAnnot->value);
} }
// Evaluate DoctrineSubClasses annotation // Evaluate DoctrineSubClasses annotation
......
...@@ -25,26 +25,25 @@ use \Doctrine\Common\Annotations\Annotation; ...@@ -25,26 +25,25 @@ use \Doctrine\Common\Annotations\Annotation;
/* Annotations */ /* Annotations */
final class Entity extends \Doctrine\Common\Annotations\Annotation { final class Entity extends Annotation {
public $repositoryClass; public $repositoryClass;
} }
final class MappedSuperclass extends Annotation {} final class MappedSuperclass extends Annotation {}
final class InheritanceType extends \Doctrine\Common\Annotations\Annotation {} final class InheritanceType extends Annotation {}
final class DiscriminatorColumn extends \Doctrine\Common\Annotations\Annotation { final class DiscriminatorColumn extends Annotation {
public $name; public $name;
public $fieldName; // field name used in non-object hydration (array/scalar) public $fieldName; // field name used in non-object hydration (array/scalar)
public $type; public $type;
public $length; public $length;
} }
final class DiscriminatorValue extends \Doctrine\Common\Annotations\Annotation {} final class DiscriminatorMap extends Annotation {}
final class SubClasses extends \Doctrine\Common\Annotations\Annotation {} /*final class SubClasses extends Annotation {}*/
final class Id extends \Doctrine\Common\Annotations\Annotation {} final class Id extends Annotation {}
final class GeneratedValue extends \Doctrine\Common\Annotations\Annotation { final class GeneratedValue extends Annotation {
public $strategy; public $strategy;
//public $generator;
} }
final class Version extends \Doctrine\Common\Annotations\Annotation {} final class Version extends Annotation {}
final class JoinColumn extends \Doctrine\Common\Annotations\Annotation { final class JoinColumn extends Annotation {
public $name; public $name;
public $fieldName; // field name used in non-object hydration (array/scalar) public $fieldName; // field name used in non-object hydration (array/scalar)
public $referencedColumnName; public $referencedColumnName;
...@@ -53,8 +52,8 @@ final class JoinColumn extends \Doctrine\Common\Annotations\Annotation { ...@@ -53,8 +52,8 @@ final class JoinColumn extends \Doctrine\Common\Annotations\Annotation {
public $onDelete; public $onDelete;
public $onUpdate; public $onUpdate;
} }
final class JoinColumns extends \Doctrine\Common\Annotations\Annotation {} final class JoinColumns extends Annotation {}
final class Column extends \Doctrine\Common\Annotations\Annotation { final class Column extends Annotation {
public $type; public $type;
public $length; public $length;
public $unique = false; public $unique = false;
...@@ -62,7 +61,7 @@ final class Column extends \Doctrine\Common\Annotations\Annotation { ...@@ -62,7 +61,7 @@ final class Column extends \Doctrine\Common\Annotations\Annotation {
public $default; public $default;
public $name; public $name;
} }
final class OneToOne extends \Doctrine\Common\Annotations\Annotation { final class OneToOne extends Annotation {
public $targetEntity; public $targetEntity;
public $mappedBy; public $mappedBy;
public $cascade; public $cascade;
...@@ -70,54 +69,54 @@ final class OneToOne extends \Doctrine\Common\Annotations\Annotation { ...@@ -70,54 +69,54 @@ final class OneToOne extends \Doctrine\Common\Annotations\Annotation {
public $optional; public $optional;
public $orphanRemoval = false; public $orphanRemoval = false;
} }
final class OneToMany extends \Doctrine\Common\Annotations\Annotation { final class OneToMany extends Annotation {
public $mappedBy; public $mappedBy;
public $targetEntity; public $targetEntity;
public $cascade; public $cascade;
public $fetch; public $fetch;
public $orphanRemoval = false; public $orphanRemoval = false;
} }
final class ManyToOne extends \Doctrine\Common\Annotations\Annotation { final class ManyToOne extends Annotation {
public $targetEntity; public $targetEntity;
public $cascade; public $cascade;
public $fetch; public $fetch;
public $optional; public $optional;
} }
final class ManyToMany extends \Doctrine\Common\Annotations\Annotation { final class ManyToMany extends Annotation {
public $targetEntity; public $targetEntity;
public $mappedBy; public $mappedBy;
public $cascade; public $cascade;
public $fetch; public $fetch;
} }
final class ElementCollection extends \Doctrine\Common\Annotations\Annotation { final class ElementCollection extends Annotation {
public $tableName; public $tableName;
} }
final class Table extends \Doctrine\Common\Annotations\Annotation { final class Table extends Annotation {
public $name; public $name;
public $schema; public $schema;
} }
final class JoinTable extends \Doctrine\Common\Annotations\Annotation { final class JoinTable extends Annotation {
public $name; public $name;
public $schema; public $schema;
public $joinColumns; public $joinColumns;
public $inverseJoinColumns; public $inverseJoinColumns;
} }
final class SequenceGenerator extends \Doctrine\Common\Annotations\Annotation { final class SequenceGenerator extends Annotation {
public $sequenceName; public $sequenceName;
public $allocationSize = 10; public $allocationSize = 10;
public $initialValue = 1; public $initialValue = 1;
} }
final class ChangeTrackingPolicy extends \Doctrine\Common\Annotations\Annotation {} final class ChangeTrackingPolicy extends Annotation {}
/* Annotations for lifecycle callbacks */ /* Annotations for lifecycle callbacks */
final class LifecycleListener extends \Doctrine\Common\Annotations\Annotation {} final class LifecycleListener extends Annotation {}
final class PrePersist extends \Doctrine\Common\Annotations\Annotation {} final class PrePersist extends Annotation {}
final class PostPersist extends \Doctrine\Common\Annotations\Annotation {} final class PostPersist extends Annotation {}
final class PreUpdate extends \Doctrine\Common\Annotations\Annotation {} final class PreUpdate extends Annotation {}
final class PostUpdate extends \Doctrine\Common\Annotations\Annotation {} final class PostUpdate extends Annotation {}
final class PreRemove extends \Doctrine\Common\Annotations\Annotation {} final class PreRemove extends Annotation {}
final class PostRemove extends \Doctrine\Common\Annotations\Annotation {} final class PostRemove extends Annotation {}
final class PostLoad extends \Doctrine\Common\Annotations\Annotation {} final class PostLoad extends Annotation {}
/* Generic annotation for Doctrine extensions */ /* Generic annotation for Doctrine extensions */
final class DoctrineX extends \Doctrine\Common\Annotations\Annotation {} final class DoctrineX extends Annotation {}
...@@ -288,16 +288,25 @@ class JoinedSubclassPersister extends StandardEntityPersister ...@@ -288,16 +288,25 @@ class JoinedSubclassPersister extends StandardEntityPersister
$tableAlias = isset($mapping['inherited']) ? $tableAlias = isset($mapping['inherited']) ?
$tableAliases[$mapping['inherited']] : $baseTableAlias; $tableAliases[$mapping['inherited']] : $baseTableAlias;
if ($columnList != '') $columnList .= ', '; if ($columnList != '') $columnList .= ', ';
$columnList .= $tableAlias . '.' . $this->_class->columnNames[$fieldName]; $columnList .= $tableAlias . '.' . $this->_class->getQuotedColumnName($fieldName, $this->_platform);
} }
$sql = 'SELECT ' . $columnList . ' FROM ' . $this->_class->primaryTable['name']. ' ' . $baseTableAlias; // Add discriminator column
if ($this->_class->rootEntityName == $this->_class->name) {
$columnList .= ', ' . $baseTableAlias . '.' .
$this->_class->getQuotedDiscriminatorColumnName($this->_platform);
} else {
$columnList .= ', ' . $tableAliases[$this->_class->rootEntityName] . '.' .
$this->_class->getQuotedDiscriminatorColumnName($this->_platform);
}
$sql = 'SELECT ' . $columnList . ' FROM ' . $this->_class->getQuotedTableName($this->_platform) . ' ' . $baseTableAlias;
// INNER JOIN parent tables // INNER JOIN parent tables
foreach ($this->_class->parentClasses as $parentClassName) { foreach ($this->_class->parentClasses as $parentClassName) {
$parentClass = $this->_em->getClassMetadata($parentClassName); $parentClass = $this->_em->getClassMetadata($parentClassName);
$tableAlias = $tableAliases[$parentClassName]; $tableAlias = $tableAliases[$parentClassName];
$sql .= ' INNER JOIN ' . $parentClass->primaryTable['name'] . ' ' . $tableAlias . ' ON '; $sql .= ' INNER JOIN ' . $parentClass->getQuotedTableName($this->_platform) . ' ' . $tableAlias . ' ON ';
$first = true; $first = true;
foreach ($idColumns as $idColumn) { foreach ($idColumns as $idColumn) {
if ($first) $first = false; else $sql .= ' AND '; if ($first) $first = false; else $sql .= ' AND ';
...@@ -309,7 +318,7 @@ class JoinedSubclassPersister extends StandardEntityPersister ...@@ -309,7 +318,7 @@ class JoinedSubclassPersister extends StandardEntityPersister
foreach ($this->_class->subClasses as $subClassName) { foreach ($this->_class->subClasses as $subClassName) {
$subClass = $this->_em->getClassMetadata($subClassName); $subClass = $this->_em->getClassMetadata($subClassName);
$tableAlias = $tableAliases[$subClassName]; $tableAlias = $tableAliases[$subClassName];
$sql .= ' LEFT JOIN ' . $subClass->primaryTable['name'] . ' ' . $tableAlias . ' ON '; $sql .= ' LEFT JOIN ' . $subClass->getQuotedTableName($this->_platform) . ' ' . $tableAlias . ' ON ';
$first = true; $first = true;
foreach ($idColumns as $idColumn) { foreach ($idColumns as $idColumn) {
if ($first) $first = false; else $sql .= ' AND '; if ($first) $first = false; else $sql .= ' AND ';
...@@ -323,6 +332,6 @@ class JoinedSubclassPersister extends StandardEntityPersister ...@@ -323,6 +332,6 @@ class JoinedSubclassPersister extends StandardEntityPersister
$conditionSql .= $baseTableAlias . '.' . $this->_class->columnNames[$field] . ' = ?'; $conditionSql .= $baseTableAlias . '.' . $this->_class->columnNames[$field] . ' = ?';
} }
return $sql . ' WHERE ' . $conditionSql; return $sql . ($conditionSql != '' ? ' WHERE ' . $conditionSql : '');
} }
} }
...@@ -86,8 +86,6 @@ class StandardEntityPersister ...@@ -86,8 +86,6 @@ class StandardEntityPersister
*/ */
protected $_queuedInserts = array(); protected $_queuedInserts = array();
//protected $_rsm;
/** /**
* Initializes a new instance of a class derived from AbstractEntityPersister * Initializes a new instance of a class derived from AbstractEntityPersister
* that uses the given EntityManager and persists instances of the class described * that uses the given EntityManager and persists instances of the class described
...@@ -485,34 +483,23 @@ class StandardEntityPersister ...@@ -485,34 +483,23 @@ class StandardEntityPersister
} }
$data = $joinColumnValues = array(); $data = $joinColumnValues = array();
$entityName = $this->_entityName;
/*if ($this->_rsm === null) {
$this->_rsm = array();
foreach ($this->_class->columnNames as $column) {
$this->_rsm[$this->_platform->getSqlResultCasing($column)] = $column;
}
foreach ($this->_class->associationMappings as $assoc) {
if ($assoc->isOwningSide && $assoc->isOneToOne()) {
foreach ($assoc->targetToSourceKeyColumns as $keyColumn) {
$this->_rsm[$this->_platform->getSqlResultCasing($keyColumn)] = $keyColumn;
}
}
}
}*/
foreach ($result as $column => $value) { foreach ($result as $column => $value) {
//$column = $this->_rsm[$column]; $column = $this->_class->resultColumnNames[$column];
if (isset($this->_class->fieldNames[$column])) { if (isset($this->_class->fieldNames[$column])) {
$fieldName = $this->_class->fieldNames[$column]; $fieldName = $this->_class->fieldNames[$column];
$data[$fieldName] = Type::getType($this->_class->fieldMappings[$fieldName]['type']) $data[$fieldName] = Type::getType($this->_class->fieldMappings[$fieldName]['type'])
->convertToPHPValue($value, $this->_platform); ->convertToPHPValue($value, $this->_platform);
} else if ($this->_class->discriminatorColumn !== null && $column == $this->_class->discriminatorColumn['name']) {
$entityName = $this->_class->discriminatorMap[$value];
} else { } else {
$joinColumnValues[$column] = $value; $joinColumnValues[$column] = $value;
} }
} }
if ($entity === null) { if ($entity === null) {
$entity = $this->_em->getUnitOfWork()->createEntity($this->_entityName, $data); $entity = $this->_em->getUnitOfWork()->createEntity($entityName, $data);
} else { } else {
foreach ($data as $field => $value) { foreach ($data as $field => $value) {
$this->_class->reflFields[$field]->setValue($entity, $value); $this->_class->reflFields[$field]->setValue($entity, $value);
......
...@@ -1689,7 +1689,7 @@ class Parser ...@@ -1689,7 +1689,7 @@ class Parser
/** /**
* ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")" * ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")"
* *
* @return \Doctrine\ORM\Query\AST\ConditionalPrimary * @return Doctrine\ORM\Query\AST\ConditionalPrimary
*/ */
public function ConditionalPrimary() public function ConditionalPrimary()
{ {
......
...@@ -248,7 +248,8 @@ class SqlWalker implements TreeWalker ...@@ -248,7 +248,8 @@ class SqlWalker implements TreeWalker
} }
} }
// LEFT JOIN subclass tables // LEFT JOIN subclass tables, only if partial objects disallowed
if ( ! $this->_em->getConfiguration()->getAllowPartialObjects() && ! $this->_query->getHint(Query::HINT_FORCE_PARTIAL_LOAD)) {
foreach ($class->subClasses as $subClassName) { foreach ($class->subClasses as $subClassName) {
$subClass = $this->_em->getClassMetadata($subClassName); $subClass = $this->_em->getClassMetadata($subClassName);
$tableAlias = $this->getSqlTableAlias($subClass->primaryTable['name'], $dqlAlias); $tableAlias = $this->getSqlTableAlias($subClass->primaryTable['name'], $dqlAlias);
...@@ -265,6 +266,7 @@ class SqlWalker implements TreeWalker ...@@ -265,6 +266,7 @@ class SqlWalker implements TreeWalker
. $tableAlias . '.' . $columnName; . $tableAlias . '.' . $columnName;
} }
} }
}
return $sql; return $sql;
} }
...@@ -471,7 +473,7 @@ class SqlWalker implements TreeWalker ...@@ -471,7 +473,7 @@ class SqlWalker implements TreeWalker
$sql .= ", $tblAlias." . $rootClass->getQuotedDiscriminatorColumnName($this->_platform) $sql .= ", $tblAlias." . $rootClass->getQuotedDiscriminatorColumnName($this->_platform)
. ' AS ' . $columnAlias; . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->setDiscriminatorColumn($dqlAlias, $columnAlias); $this->_rsm->setDiscriminatorColumn($dqlAlias, $columnAlias);
$this->_rsm->addMetaResult($dqlAlias, $columnAlias, $discrColumn['fieldName']); $this->_rsm->addMetaResult($dqlAlias, $columnAlias, $discrColumn['fieldName']);
...@@ -490,7 +492,7 @@ class SqlWalker implements TreeWalker ...@@ -490,7 +492,7 @@ class SqlWalker implements TreeWalker
$columnAlias = $this->getSqlColumnAlias($srcColumn); $columnAlias = $this->getSqlColumnAlias($srcColumn);
$sql .= ", $sqlTableAlias." . $assoc->getQuotedJoinColumnName($srcColumn, $this->_platform) $sql .= ", $sqlTableAlias." . $assoc->getQuotedJoinColumnName($srcColumn, $this->_platform)
. ' AS ' . $columnAlias; . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn); $this->_rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn);
} }
} }
...@@ -506,7 +508,7 @@ class SqlWalker implements TreeWalker ...@@ -506,7 +508,7 @@ class SqlWalker implements TreeWalker
foreach ($assoc->targetToSourceKeyColumns as $srcColumn) { foreach ($assoc->targetToSourceKeyColumns as $srcColumn) {
$columnAlias = $this->getSqlColumnAlias($srcColumn); $columnAlias = $this->getSqlColumnAlias($srcColumn);
$sql .= ', ' . $sqlTableAlias . '.' . $assoc->getQuotedJoinColumnName($srcColumn, $this->_platform) . ' AS ' . $columnAlias; $sql .= ', ' . $sqlTableAlias . '.' . $assoc->getQuotedJoinColumnName($srcColumn, $this->_platform) . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn); $this->_rsm->addMetaResult($dqlAlias, $columnAlias, $srcColumn);
} }
} }
...@@ -748,7 +750,7 @@ class SqlWalker implements TreeWalker ...@@ -748,7 +750,7 @@ class SqlWalker implements TreeWalker
$columnAlias = $this->getSqlColumnAlias($class->columnNames[$fieldName]); $columnAlias = $this->getSqlColumnAlias($class->columnNames[$fieldName]);
$sql .= $sqlTableAlias . '.' . $columnName . ' AS ' . $columnAlias; $sql .= $sqlTableAlias . '.' . $columnName . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName); $this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName);
} else { } else {
throw DoctrineException::updateMe( throw DoctrineException::updateMe(
...@@ -765,7 +767,7 @@ class SqlWalker implements TreeWalker ...@@ -765,7 +767,7 @@ class SqlWalker implements TreeWalker
$columnAlias = 'sclr' . $this->_aliasCounter++; $columnAlias = 'sclr' . $this->_aliasCounter++;
$sql .= $this->walkAggregateExpression($expr) . ' AS ' . $columnAlias; $sql .= $this->walkAggregateExpression($expr) . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addScalarResult($columnAlias, $resultAlias); $this->_rsm->addScalarResult($columnAlias, $resultAlias);
} else if ($expr instanceof AST\Subselect) { } else if ($expr instanceof AST\Subselect) {
$sql .= $this->walkSubselect($expr); $sql .= $this->walkSubselect($expr);
...@@ -779,7 +781,7 @@ class SqlWalker implements TreeWalker ...@@ -779,7 +781,7 @@ class SqlWalker implements TreeWalker
$columnAlias = 'sclr' . $this->_aliasCounter++; $columnAlias = 'sclr' . $this->_aliasCounter++;
$sql .= $this->walkFunction($expr) . ' AS ' . $columnAlias; $sql .= $this->walkFunction($expr) . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addScalarResult($columnAlias, $resultAlias); $this->_rsm->addScalarResult($columnAlias, $resultAlias);
} else { } else {
// IdentificationVariable // IdentificationVariable
...@@ -807,14 +809,18 @@ class SqlWalker implements TreeWalker ...@@ -807,14 +809,18 @@ class SqlWalker implements TreeWalker
$sql .= $sqlTableAlias . '.' . $class->getQuotedColumnName($fieldName, $this->_platform) $sql .= $sqlTableAlias . '.' . $class->getQuotedColumnName($fieldName, $this->_platform)
. ' AS ' . $columnAlias; . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName); $this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName);
} }
// Add any additional fields of subclasses (not inherited fields) // Add any additional fields of subclasses (not inherited fields)
// 1) on Single Table Inheritance: always, since its marginal overhead
// 2) on Class Table Inheritance only if partial objects are disallowed,
// since it requires outer joining subtables.
if ($class->isInheritanceTypeSingleTable() || ! $this->_em->getConfiguration()->getAllowPartialObjects()
&& ! $this->_query->getHint(Query::HINT_FORCE_PARTIAL_LOAD)) {
foreach ($class->subClasses as $subClassName) { foreach ($class->subClasses as $subClassName) {
$subClass = $this->_em->getClassMetadata($subClassName); $subClass = $this->_em->getClassMetadata($subClassName);
foreach ($subClass->fieldMappings as $fieldName => $mapping) { foreach ($subClass->fieldMappings as $fieldName => $mapping) {
if (isset($mapping['inherited'])) { if (isset($mapping['inherited'])) {
continue; continue;
...@@ -827,11 +833,12 @@ class SqlWalker implements TreeWalker ...@@ -827,11 +833,12 @@ class SqlWalker implements TreeWalker
$sql .= $sqlTableAlias . '.' . $subClass->getQuotedColumnName($fieldName, $this->_platform) $sql .= $sqlTableAlias . '.' . $subClass->getQuotedColumnName($fieldName, $this->_platform)
. ' AS ' . $columnAlias; . ' AS ' . $columnAlias;
//$columnAlias = $this->_platform->getSqlResultCasing($columnAlias); $columnAlias = $this->_platform->getSqlResultCasing($columnAlias);
$this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName); $this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName);
} }
} }
} }
}
return $sql; return $sql;
} }
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
namespace Doctrine\ORM\Tools; namespace Doctrine\ORM\Tools;
use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Types\Type,
use Doctrine\ORM\EntityManager; Doctrine\ORM\EntityManager;
/** /**
* The SchemaTool is a tool to create and/or drop database schemas based on * The SchemaTool is a tool to create and/or drop database schemas based on
...@@ -306,4 +306,14 @@ class SchemaTool ...@@ -306,4 +306,14 @@ class SchemaTool
{ {
//TODO //TODO
} }
public function updateSchema(array $classes)
{
//TODO
}
public function getUpdateSchemaSql(array $classes)
{
//TODO
}
} }
...@@ -5,8 +5,6 @@ namespace Doctrine\Tests\Models\Company; ...@@ -5,8 +5,6 @@ namespace Doctrine\Tests\Models\Company;
/** /**
* @Entity * @Entity
* @Table(name="company_employees") * @Table(name="company_employees")
* @DiscriminatorValue("employee")
* @SubClasses({"Doctrine\Tests\Models\Company\CompanyManager"})
*/ */
class CompanyEmployee extends CompanyPerson class CompanyEmployee extends CompanyPerson
{ {
......
...@@ -5,7 +5,6 @@ namespace Doctrine\Tests\Models\Company; ...@@ -5,7 +5,6 @@ namespace Doctrine\Tests\Models\Company;
/** /**
* @Entity * @Entity
* @Table(name="company_managers") * @Table(name="company_managers")
* @DiscriminatorValue("manager")
*/ */
class CompanyManager extends CompanyEmployee class CompanyManager extends CompanyEmployee
{ {
......
...@@ -8,11 +8,12 @@ namespace Doctrine\Tests\Models\Company; ...@@ -8,11 +8,12 @@ namespace Doctrine\Tests\Models\Company;
* @author robo * @author robo
* @Entity * @Entity
* @Table(name="company_persons") * @Table(name="company_persons")
* @DiscriminatorValue("person")
* @InheritanceType("JOINED") * @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorColumn(name="discr", type="string")
* @SubClasses({"Doctrine\Tests\Models\Company\CompanyEmployee", * @DiscriminatorMap({
"Doctrine\Tests\Models\Company\CompanyManager"}) * "person" = "CompanyPerson",
* "manager" = "CompanyManager",
* "employee" = "CompanyEmployee"})
*/ */
class CompanyPerson class CompanyPerson
{ {
...@@ -40,6 +41,10 @@ class CompanyPerson ...@@ -40,6 +41,10 @@ class CompanyPerson
*/ */
private $friends; private $friends;
public function __construct() {
$this->friends = new \Doctrine\Common\Collections\ArrayCollection;
}
public function getId() { public function getId() {
return $this->id; return $this->id;
} }
...@@ -61,9 +66,6 @@ class CompanyPerson ...@@ -61,9 +66,6 @@ class CompanyPerson
} }
public function addFriend(CompanyPerson $friend) { public function addFriend(CompanyPerson $friend) {
if ( ! $this->friends) {
$this->friends = new \Doctrine\Common\Collections\ArrayCollection;
}
if ( ! $this->friends->contains($friend)) { if ( ! $this->friends->contains($friend)) {
$this->friends->add($friend); $this->friends->add($friend);
$friend->addFriend($this); $friend->addFriend($this);
......
...@@ -39,6 +39,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -39,6 +39,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->clear(); $this->_em->clear();
$this->_em->getConfiguration()->setAllowPartialObjects(false);
$query = $this->_em->createQuery("select p from Doctrine\Tests\Models\Company\CompanyPerson p order by p.id asc"); $query = $this->_em->createQuery("select p from Doctrine\Tests\Models\Company\CompanyPerson p order by p.id asc");
$entities = $query->getResult(); $entities = $query->getResult();
...@@ -51,6 +52,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -51,6 +52,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->assertEquals('Roman S. Borschel', $entities[0]->getName()); $this->assertEquals('Roman S. Borschel', $entities[0]->getName());
$this->assertEquals('Guilherme Blanco', $entities[1]->getName()); $this->assertEquals('Guilherme Blanco', $entities[1]->getName());
$this->assertEquals(100000, $entities[1]->getSalary()); $this->assertEquals(100000, $entities[1]->getSalary());
$this->_em->getConfiguration()->setAllowPartialObjects(true);
$this->_em->clear(); $this->_em->clear();
...@@ -99,6 +101,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -99,6 +101,7 @@ class ClassTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
$manager = $this->_em->find('Doctrine\Tests\Models\Company\CompanyManager', $manager->getId()); $manager = $this->_em->find('Doctrine\Tests\Models\Company\CompanyManager', $manager->getId());
$this->assertTrue($manager instanceof CompanyManager);
$this->assertEquals('Roman B.', $manager->getName()); $this->assertEquals('Roman B.', $manager->getName());
$this->assertEquals(119000, $manager->getSalary()); $this->assertEquals(119000, $manager->getSalary());
$this->assertEquals('CEO', $manager->getTitle()); $this->assertEquals('CEO', $manager->getTitle());
......
...@@ -124,10 +124,9 @@ class OptimisticTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -124,10 +124,9 @@ class OptimisticTest extends \Doctrine\Tests\OrmFunctionalTestCase
/** /**
* @Entity * @Entity
* @Table(name="optimistic_joined_parent") * @Table(name="optimistic_joined_parent")
* @DiscriminatorValue("parent")
* @InheritanceType("JOINED") * @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorColumn(name="discr", type="string")
* @SubClasses({"Doctrine\Tests\ORM\Functional\Locking\OptimisticJoinedChild"}) * @DiscriminatorMap({"parent" = "OptimisticJoinedParent", "child" = "OptimisticJoinedChild"})
*/ */
class OptimisticJoinedParent class OptimisticJoinedParent
{ {
...@@ -151,7 +150,6 @@ class OptimisticJoinedParent ...@@ -151,7 +150,6 @@ class OptimisticJoinedParent
/** /**
* @Entity * @Entity
* @Table(name="optimistic_joined_child") * @Table(name="optimistic_joined_child")
* @DiscriminatorValue("child")
*/ */
class OptimisticJoinedChild extends OptimisticJoinedParent class OptimisticJoinedChild extends OptimisticJoinedParent
{ {
......
...@@ -101,8 +101,7 @@ class SingleTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -101,8 +101,7 @@ class SingleTableInheritanceTest extends \Doctrine\Tests\OrmFunctionalTestCase
* @Entity * @Entity
* @InheritanceType("SINGLE_TABLE") * @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorColumn(name="discr", type="string")
* @SubClasses({"Doctrine\Tests\ORM\Functional\ChildEntity"}) * @DiscriminatorMap({"parent"="ParentEntity", "child"="ChildEntity"})
* @DiscriminatorValue("parent")
*/ */
class ParentEntity { class ParentEntity {
/** /**
...@@ -132,7 +131,6 @@ class ParentEntity { ...@@ -132,7 +131,6 @@ class ParentEntity {
/** /**
* @Entity * @Entity
* @DiscriminatorValue("child")
*/ */
class ChildEntity extends ParentEntity { class ChildEntity extends ParentEntity {
/** /**
......
...@@ -38,7 +38,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase ...@@ -38,7 +38,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
$this->assertTrue($cm->reflClass instanceof \ReflectionClass); $this->assertTrue($cm->reflClass instanceof \ReflectionClass);
$this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name); $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name);
$this->assertEquals('UserParent', $cm->rootEntityName); $this->assertEquals('UserParent', $cm->rootEntityName);
$this->assertEquals(array('One', 'Two', 'Three'), $cm->subClasses); $this->assertEquals(array('Doctrine\Tests\Models\CMS\One', 'Doctrine\Tests\Models\CMS\Two', 'Doctrine\Tests\Models\CMS\Three'), $cm->subClasses);
$this->assertEquals(array('UserParent'), $cm->parentClasses); $this->assertEquals(array('UserParent'), $cm->parentClasses);
$this->assertEquals('UserRepository', $cm->getCustomRepositoryClass()); $this->assertEquals('UserRepository', $cm->getCustomRepositoryClass());
$this->assertEquals(array('name' => 'disc', 'type' => 'integer', 'fieldName' => 'disc'), $cm->discriminatorColumn); $this->assertEquals(array('name' => 'disc', 'type' => 'integer', 'fieldName' => 'disc'), $cm->discriminatorColumn);
......
...@@ -296,15 +296,16 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase ...@@ -296,15 +296,16 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
// "Get all persons who have $person as a friend." // "Get all persons who have $person as a friend."
// Tough one: Many-many self-referencing ("friends") with class table inheritance // Tough one: Many-many self-referencing ("friends") with class table inheritance
$q3 = $this->_em->createQuery('SELECT p.id FROM Doctrine\Tests\Models\Company\CompanyPerson p WHERE :param MEMBER OF p.friends'); $this->_em->getConfiguration()->setAllowPartialObjects(false);
$q3 = $this->_em->createQuery('SELECT p FROM Doctrine\Tests\Models\Company\CompanyPerson p WHERE :param MEMBER OF p.friends');
$person = new \Doctrine\Tests\Models\Company\CompanyPerson; $person = new \Doctrine\Tests\Models\Company\CompanyPerson;
$this->_em->getClassMetadata(get_class($person))->setIdentifierValues($person, 101); $this->_em->getClassMetadata(get_class($person))->setIdentifierValues($person, 101);
$q3->setParameter('param', $person); $q3->setParameter('param', $person);
$this->assertEquals( $this->assertEquals(
'SELECT c0_.id AS id0, c0_.discr AS discr1 FROM company_persons c0_ LEFT JOIN company_employees c1_ ON c0_.id = c1_.id LEFT JOIN company_managers c2_ ON c0_.id = c2_.id WHERE EXISTS (SELECT 1 FROM company_persons_friends c3_ INNER JOIN company_persons c4_ ON c3_.person_id = c0_.id WHERE c3_.friend_id = c4_.id AND c4_.id = ?)', 'SELECT c0_.id AS id0, c0_.name AS name1, c1_.title AS title2, c2_.salary AS salary3, c2_.department AS department4, c0_.discr AS discr5, c0_.spouse_id AS spouse_id6 FROM company_persons c0_ LEFT JOIN company_managers c1_ ON c0_.id = c1_.id LEFT JOIN company_employees c2_ ON c0_.id = c2_.id WHERE EXISTS (SELECT 1 FROM company_persons_friends c3_ INNER JOIN company_persons c4_ ON c3_.person_id = c0_.id WHERE c3_.friend_id = c4_.id AND c4_.id = ?)',
$q3->getSql() $q3->getSql()
); );
$this->_em->getConfiguration()->setAllowPartialObjects(true);
} }
public function testSupportsCurrentDateFunction() public function testSupportsCurrentDateFunction()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment