Author: ts
Date: Mon Jan 21 19:13:26 2008
New Revision: 7218
Log:
- Implemented removeRelatedObject() for multi-relation handling.
Modified:
trunk/PersistentObject/src/handlers/delete_handler.php
trunk/PersistentObject/src/persistent_session.php
trunk/PersistentObject/tests/multi_relation_test.php
Modified: trunk/PersistentObject/src/handlers/delete_handler.php
==============================================================================
--- trunk/PersistentObject/src/handlers/delete_handler.php [iso-8859-1]
(original)
+++ trunk/PersistentObject/src/handlers/delete_handler.php [iso-8859-1] Mon Jan
21 19:13:26 2008
@@ -123,19 +123,41 @@
* @throws ezcPersistentRelationNotFoundException
* if the deisred relation is not defined.
*/
- public function removeRelatedObject( $object, $relatedObject )
+ public function removeRelatedObject( $object, $relatedObject,
$relationName = null )
{
$class = get_class( $object );
$relatedClass = get_class( $relatedObject );
+
$def = $this->definitionManager->fetchDefinition( $class );
- $relatedDef = $this->definitionManager->fetchDefinition( get_class(
$relatedObject ) );
+ $relatedDef = $this->definitionManager->fetchDefinition( get_class(
$relatedObject ) );
// Sanity checks.
if ( !isset( $def->relations[$relatedClass] ) )
{
throw new ezcPersistentRelationNotFoundException( $class,
$relatedClass );
}
- if ( isset( $def->relations[$relatedClass]->reverse ) &&
$def->relations[$relatedClass]->reverse === true )
+
+ $relation = $def->relations[$relatedClass];
+
+ // New multi-relations for a single class
+ if ( $relation instanceof ezcPersistentRelationCollection )
+ {
+ if ( $relationName === null )
+ {
+ throw new ezcPersistentUndeterministicRelationException(
$relatedClass );
+ }
+ if ( !isset( $relation[$relationName] ) )
+ {
+ throw new ezcPersistentRelationNotFoundException(
+ $class,
+ $relatedClass,
+ $relationName
+ );
+ }
+ $relation = $relation[$relationName];
+ }
+
+ if ( isset( $relation->reverse ) && $relation->reverse === true )
{
throw new ezcPersistentRelationOperationNotSupportedException(
$class,
@@ -148,7 +170,7 @@
$objectState = $this->session->getObjectState( $object );
$relatedObjectState = $this->session->getObjectState( $relatedObject );
- switch ( get_class( ( $relation = $def->relations[get_class(
$relatedObject )] ) ) )
+ switch ( get_class( $relation ) )
{
case "ezcPersistentOneToManyRelation":
case "ezcPersistentOneToOneRelation":
Modified: trunk/PersistentObject/src/persistent_session.php
==============================================================================
--- trunk/PersistentObject/src/persistent_session.php [iso-8859-1] (original)
+++ trunk/PersistentObject/src/persistent_session.php [iso-8859-1] Mon Jan 21
19:13:26 2008
@@ -414,9 +414,9 @@
* @throws ezcPersistentRelationNotFoundException
* if the deisred relation is not defined.
*/
- public function addRelatedObject( $object, $relatedObject, $relatioName =
null )
- {
- return $this->saveHandler->addRelatedObject( $object, $relatedObject,
$relatioName );
+ public function addRelatedObject( $object, $relatedObject, $relationName =
null )
+ {
+ return $this->saveHandler->addRelatedObject( $object, $relatedObject,
$relationName );
}
/**
@@ -508,9 +508,9 @@
* @throws ezcPersistentRelationNotFoundException
* if the deisred relation is not defined.
*/
- public function removeRelatedObject( $object, $relatedObject )
- {
- return $this->deleteHandler->removeRelatedObject( $object,
$relatedObject );
+ public function removeRelatedObject( $object, $relatedObject,
$relationName = null )
+ {
+ return $this->deleteHandler->removeRelatedObject( $object,
$relatedObject, $relationName );
}
/**
Modified: trunk/PersistentObject/tests/multi_relation_test.php
==============================================================================
--- trunk/PersistentObject/tests/multi_relation_test.php [iso-8859-1] (original)
+++ trunk/PersistentObject/tests/multi_relation_test.php [iso-8859-1] Mon Jan
21 19:13:26 2008
@@ -46,7 +46,7 @@
public function teardown()
{
- // MultiRelationTestPerson::cleanup();
+ MultiRelationTestPerson::cleanup();
}
public function testLoad()
@@ -100,6 +100,20 @@
);
}
+ public function testSave()
+ {
+ $newChild = new MultiRelationTestPerson();
+ $newChild->name = "New child";
+
+ $this->session->save( $newChild );
+
+ $this->assertEquals(
+ 6,
+ $newChild->id,
+ 'New MultiRelationTestPerson saved with incorrect ID.'
+ );
+ }
+
public function testGetRelatedObjectsFailureWithoutRelationName()
{
$mother = $this->session->load( 'MultiRelationTestPerson', 1 );
@@ -218,18 +232,21 @@
);
}
- public function testSave()
+ public function testAddObjectsFailureWithoutRelationName()
{
$newChild = new MultiRelationTestPerson();
$newChild->name = "New child";
$this->session->save( $newChild );
- $this->assertEquals(
- 6,
- $newChild->id,
- 'New MultiRelationTestPerson saved with incorrect ID.'
- );
+ $mother = $this->session->load( 'MultiRelationTestPerson', 1 );
+
+ try
+ {
+ $this->session->addRelatedObject( $mother, $newChild );
+ $this->fail( 'Exception not thrown on addRelatedObject() without
relation name.' );
+ }
+ catch ( ezcPersistentUndeterministicRelationException $e ) {}
}
public function testAddRelatedObjectOneToManySuccess()
@@ -287,6 +304,116 @@
'Incorrect perso ID in relation record.'
);
}
+
+ public function testRemoveObjectsFailureWithoutRelationName()
+ {
+ $mother = $this->session->load( 'MultiRelationTestPerson', 1 );
+ $children = $this->session->getRelatedObjects( $mother,
'MultiRelationTestPerson', 'mothers_children' );
+
+ try
+ {
+ $this->session->removeRelatedObject( $mother, $children[0] );
+ $this->fail( 'Exception not thrown on removeRelatedObject()
without relation name.' );
+ }
+ catch ( ezcPersistentUndeterministicRelationException $e ) {}
+ }
+
+ public function testRemoveRelatedObjectSuccessMotherChildren()
+ {
+ $mother = $this->session->load( 'MultiRelationTestPerson', 1 );
+ $children = $this->session->getRelatedObjects( $mother,
'MultiRelationTestPerson', 'mothers_children' );
+
+ foreach( $children as $child )
+ {
+ $this->session->removeRelatedObject( $mother, $child,
'mothers_children' );
+
+ $this->assertNull(
+ $child->mother,
+ "MultiRelationTestPerson child {$child->id} not correctly
removed from mother."
+ );
+ $this->assertNotNull(
+ $child->father,
+ "MultiRelationTestPerson child {$child->id} also removed from
father instead from mother only."
+ );
+ }
+ }
+
+ public function testRemoveRelatedObjectSuccessFatherChildren()
+ {
+ $father = $this->session->load( 'MultiRelationTestPerson', 2 );
+ $children = $this->session->getRelatedObjects( $father,
'MultiRelationTestPerson', 'fathers_children' );
+
+ foreach( $children as $child )
+ {
+ $this->session->removeRelatedObject( $father, $child,
'fathers_children' );
+
+ $this->assertNull(
+ $child->father,
+ "MultiRelationTestPerson child {$child->id} not correctly
removed from father."
+ );
+ $this->assertNotNull(
+ $child->mother,
+ "MultiRelationTestPerson child {$child->id} also removed from
mother instead from father only."
+ );
+ }
+ }
+
+ public function testRemoveRelatedObjectFailureChildMother()
+ {
+ $child = $this->session->load( 'MultiRelationTestPerson', 3 );
+ $mother = $this->session->getRelatedObject( $child,
'MultiRelationTestPerson', 'mother' );
+
+ try
+ {
+ $this->session->removeRelatedObject( $child, $mother, 'mother' );
+ $this->fail( "MultiRelationTestPerson correctly removed from
mother although relation is marked reverse." );
+ }
+ catch ( ezcPersistentRelationOperationNotSupportedException $e ) {}
+ }
+
+ public function testRemoveRelatedObjectFailureChildFather()
+ {
+ $child = $this->session->load( 'MultiRelationTestPerson', 4 );
+ $father = $this->session->getRelatedObject( $child,
'MultiRelationTestPerson', 'father' );
+
+ try
+ {
+ $this->session->removeRelatedObject( $child, $father, 'father' );
+ $this->fail( "MultiRelationTestPerson correctly removed from
father although relation is marked reverse." );
+ }
+ catch ( ezcPersistentRelationOperationNotSupportedException $e ) {}
+ }
+
+ public function testRemoveRelatedObjectSuccessSiblings()
+ {
+ $child = $this->session->load( 'MultiRelationTestPerson', 3 );
+ $siblings = $this->session->getRelatedObjects( $child,
'MultiRelationTestPerson', 'siblings' );
+
+ foreach ( $siblings as $sibling )
+ {
+ $this->session->removeRelatedObject( $child, $sibling, 'siblings'
);
+ }
+
+ $q = $this->session->database->createSelectQuery();
+ $q->select( '*' )
+ ->from( 'PO_sibling' )
+ ->where(
+ $q->expr->eq(
+ $this->session->database->quoteIdentifier( 'person' ),
+ $q->bindValue( $child->id )
+ )
+ );
+
+ $stmt = $q->prepare();
+ $stmt->execute();
+ $rows = $stmt->fetchAll( PDO::FETCH_ASSOC );
+
+ $this->assertEquals(
+ 0,
+ count( $rows ),
+ 'Incorrect number of relation records after removing all siblings.'
+ );
+ }
}
?>
--
svn-components mailing list
[email protected]
http://lists.ez.no/mailman/listinfo/svn-components