From b49180875c50642a88387114fe4c0b85bdfff905 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Fri, 9 Mar 2012 23:03:25 -0300 Subject: [PATCH] yml driver --- .../ORM/Mapping/Driver/AnnotationDriver.php | 2 +- .../ORM/Mapping/Driver/YamlDriver.php | 74 ++++++++++- .../ORM/Mapping/AbstractMappingDriverTest.php | 8 +- ...ctrine.Tests.Models.CMS.CmsAddress.dcm.xml | 12 +- ...ctrine.Tests.Models.CMS.CmsAddress.dcm.yml | 62 +++++++++ .../Doctrine.Tests.Models.CMS.CmsUser.dcm.yml | 124 ++++++++++++++++++ ...Tests.Models.Company.CompanyPerson.dcm.yml | 75 +++++++++++ 7 files changed, 340 insertions(+), 17 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.yml create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsUser.dcm.yml create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.Company.CompanyPerson.dcm.yml diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 1e6cab682..6a89131fe 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -224,6 +224,7 @@ class AnnotationDriver implements Driver foreach ($sqlResultSetMappingsAnnot->value as $resultSetMapping) { $entities = array(); + $columns = array(); foreach ($resultSetMapping->entities as $entityResultAnnot) { $entityResult = array( 'fields' => array(), @@ -241,7 +242,6 @@ class AnnotationDriver implements Driver $entities[] = $entityResult; } - $columns = array(); foreach ($resultSetMapping->columns as $columnResultAnnot) { $columns[] = array( 'name' => $columnResultAnnot->name, diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index 0c4fb43cb..d602ed975 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -83,6 +83,68 @@ class YamlDriver extends AbstractFileDriver } } + // Evaluate named native queries + if (isset($element['namedNativeQueries'])) { + foreach ($element['namedNativeQueries'] as $name => $mappingElement) { + if (!isset($mappingElement['name'])) { + $mappingElement['name'] = $name; + } + $metadata->addNamedNativeQuery(array( + 'name' => $mappingElement['name'], + 'query' => isset($mappingElement['query']) ? $mappingElement['query'] : null, + 'resultClass' => isset($mappingElement['resultClass']) ? $mappingElement['resultClass'] : null, + 'resultSetMapping' => isset($mappingElement['resultSetMapping']) ? $mappingElement['resultSetMapping'] : null, + )); + } + } + + // Evaluate sql result set mappings + if (isset($element['sqlResultSetMappings'])) { + foreach ($element['sqlResultSetMappings'] as $name => $resultSetMapping) { + if (!isset($resultSetMapping['name'])) { + $resultSetMapping['name'] = $name; + } + + $entities = array(); + $columns = array(); + if (isset($resultSetMapping['entityResult'])) { + foreach ($resultSetMapping['entityResult'] as $entityResultElement) { + $entityResult = array( + 'fields' => array(), + 'entityClass' => isset($entityResultElement['entityClass']) ? $entityResultElement['entityClass'] : null, + 'discriminatorColumn' => isset($entityResultElement['discriminatorColumn']) ? $entityResultElement['discriminatorColumn'] : null, + ); + + if (isset($entityResultElement['fieldResult'])) { + foreach ($entityResultElement['fieldResult'] as $fieldResultElement) { + $entityResult['fields'][] = array( + 'name' => isset($fieldResultElement['name']) ? $fieldResultElement['name'] : null, + 'column' => isset($fieldResultElement['column']) ? $fieldResultElement['column'] : null, + ); + } + } + + $entities[] = $entityResult; + } + } + + + if (isset($resultSetMapping['columnResult'])) { + foreach ($resultSetMapping['columnResult'] as $columnResultAnnot) { + $columns[] = array( + 'name' => isset($columnResultAnnot['name']) ? $columnResultAnnot['name'] : null, + ); + } + } + + $metadata->addSqlResultSetMapping(array( + 'name' => $resultSetMapping['name'], + 'entities' => $entities, + 'columns' => $columns + )); + } + } + /* not implemented specially anyway. use table = schema.table if (isset($element['schema'])) { $metadata->table['schema'] = $element['schema']; @@ -484,10 +546,14 @@ class YamlDriver extends AbstractFileDriver */ private function _getJoinColumnMapping($joinColumnElement) { - $joinColumn = array( - 'name' => $joinColumnElement['name'], - 'referencedColumnName' => $joinColumnElement['referencedColumnName'] - ); + $joinColumn = array(); + if (isset($joinColumnElement['referencedColumnName'])) { + $joinColumn['referencedColumnName'] = (string) $joinColumnElement['referencedColumnName']; + } + + if (isset($joinColumnElement['name'])) { + $joinColumn['name'] = (string) $joinColumnElement['name']; + } if (isset($joinColumnElement['fieldName'])) { $joinColumn['fieldName'] = (string) $joinColumnElement['fieldName']; diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index df7490132..1060bae84 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -495,7 +495,9 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase */ public function testNamedNativeQuery() { - if (!$this instanceof AnnotationDriverTest && !$this instanceof XmlMappingDriverTest) { + if (!$this instanceof AnnotationDriverTest && + !$this instanceof XmlMappingDriverTest && + !$this instanceof YamlMappingDriverTest) { $this->markTestIncomplete(); } @@ -551,7 +553,9 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase */ public function testSqlResultSetMapping() { - if (!$this instanceof AnnotationDriverTest && !$this instanceof XmlMappingDriverTest) { + if (!$this instanceof AnnotationDriverTest && + !$this instanceof XmlMappingDriverTest && + !$this instanceof YamlMappingDriverTest) { $this->markTestIncomplete(); } diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.xml index a65d08371..0af5facda 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.xml @@ -46,17 +46,9 @@ - - - - - - - - - - + + diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.yml new file mode 100644 index 000000000..604acb293 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsAddress.dcm.yml @@ -0,0 +1,62 @@ +Doctrine\Tests\Models\CMS\CmsAddress: + type: entity + table: cms_address + namedNativeQueries: + find-all: + resultSetMapping: mapping-find-all + query: SELECT id, country, city FROM cms_addresses + find-by-id: + name: find-by-id + resultClass: CmsAddress + query: SELECT * FROM cms_addresses WHERE id = ? + count: + name: count + resultSetMapping: mapping-count + query: SELECT COUNT(*) AS count FROM cms_addresses + + sqlResultSetMappings: + mapping-find-all: + entityResult: + address: + entityClass: CmsAddress + fieldResult: + 0: + name: id + column: id + 1: + name: city + column: city + 2: + name: country + column: country + mapping-without-fields: + name: mapping-without-fields + entityResult: + address: + entityClass: CmsAddress + mapping-count: + name: mapping-count + columnResult: + count: + name: count + id: + id: + type: integer + generator: + strategy: AUTO + fields: + country: + type: string + length: 50 + city: + type: string + length: 50 + zip: + type: string + length: 50 + oneToOne: + address: + targetEntity: CmsUser + inversedBy: address + joinColumn: + referencedColumnName: id \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsUser.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsUser.dcm.yml new file mode 100644 index 000000000..ce860b251 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.CMS.CmsUser.dcm.yml @@ -0,0 +1,124 @@ +Doctrine\Tests\Models\CMS\CmsUser: + type: entity + table: cms_users + namedQueries: + all: SELECT u FROM __CLASS__ u + namedNativeQueries: + fetchIdAndUsernameWithResultClass: + resultClass: CmsUser + query: SELECT id, username FROM cms_users WHERE username = ? + fetchAllColumns: + name: fetchAllColumns + resultClass: CmsUser + query: SELECT * FROM cms_users WHERE username = ? + fetchJoinedAddress: + name: fetchJoinedAddress + resultSetMapping: mappingJoinedAddress + query: SELECT u.id, u.name, u.status, a.id AS a_id, a.country, a.zip, a.city FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ? + fetchJoinedPhonenumber: + name: fetchJoinedPhonenumber + resultSetMapping: mappingJoinedPhonenumber + query: SELECT id, name, status, phonenumber AS number FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username = ? + fetchUserPhonenumberCount: + name: fetchUserPhonenumberCount + resultSetMapping: mappingUserPhonenumberCount + query: SELECT id, name, status, COUNT(phonenumber) AS numphones FROM cms_users INNER JOIN cms_phonenumbers ON id = user_id WHERE username IN (?) GROUP BY id, name, status, username ORDER BY username + + sqlResultSetMappings: + mappingJoinedAddress: + entityResult: + 0: + entityClass: __CLASS__ + fieldResult: + 0: + name: id + 1: + name: name + 2: + name: status + 3: + name: address.zip + 4: + name: address.city + 5: + name: address.country + 6: + name: address.id + column: a_id + mappingJoinedPhonenumber: + name: mappingJoinedPhonenumber + entityResult: + user: + entityClass: CmsUser + fieldResult: + 0: + name: id + 1: + name: name + 2: + name: status + 3: + name: phonenumbers.phonenumber + column: number + mappingUserPhonenumberCount: + name: mappingUserPhonenumberCount + columnResult: + 0: + name: numphones + entityResult: + user_0: + entityClass: CmsUser + fieldResult: + 0: + name: id + 1: + name: name + 2: + name: status + id: + id: + type: integer + generator: + strategy: AUTO + fields: + name: + type: string + length: 255 + username: + type: string + length: 255 + unique: true + status: + type: string + length: 50 + unique: true + oneToOne: + address: + targetEntity: CmsAddress + orphanRemoval: true + inversedBy: user + joinColumn: + name: address_id + referencedColumnName: id + cascade: [ persist ] + oneToOne: + email: + targetEntity: CmsEmail + orphanRemoval: true + inversedBy: user + joinColumn: + nullable: true + referencedColumnName: id + cascade: [ persist ] + manyToMany: + groups: + targetEntity: CmsGroup + joinTable: + name: cms_users_groups + joinColumns: + user_id: + referencedColumnName: id + inverseJoinColumns: + group_id: + referencedColumnName: id + cascade: [ persist , detach, merge] \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.Company.CompanyPerson.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.Company.CompanyPerson.dcm.yml new file mode 100644 index 000000000..26846c5de --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.Company.CompanyPerson.dcm.yml @@ -0,0 +1,75 @@ +Doctrine\Tests\Models\Company\CompanyPerson: + type: entity + table: company_persons + inheritanceType: JOINED + discriminatorMap: + person: CompanyPerson + manager: CompanyManager + employee: CompanyEmployee + namedNativeQueries: + fetchAllWithResultClass: + resultClass: __CLASS__ + query: SELECT id, name, discr FROM company_persons ORDER BY name + fetchAllWithSqlResultSetMapping: + name: fetchAllWithSqlResultSetMapping + resultSetMapping: mappingFetchAll + query: SELECT id, name, discr AS discriminator FROM company_persons ORDER BY name + + sqlResultSetMappings: + mappingFetchAll: + entityResult: + 0: + entityClass: __CLASS__ + discriminatorColumn: discriminator + fieldResult: + 0: + name: id + 1: + name: name + id: + id: + type: integer + generator: + strategy: AUTO + fields: + name: + type: string + length: 255 + username: + type: string + length: 255 + unique: true + status: + type: string + length: 50 + unique: true + oneToOne: + address: + targetEntity: CmsAddress + orphanRemoval: true + inversedBy: user + joinColumn: + name: address_id + referencedColumnName: id + cascade: [ persist ] + oneToOne: + email: + targetEntity: CmsEmail + orphanRemoval: true + inversedBy: user + joinColumn: + nullable: true + referencedColumnName: id + cascade: [ persist ] + manyToMany: + groups: + targetEntity: CmsGroup + joinTable: + name: cms_users_groups + joinColumns: + user_id: + referencedColumnName: id + inverseJoinColumns: + group_id: + referencedColumnName: id + cascade: [ persist , detach, merge] \ No newline at end of file