Author: ts
Date: Mon Jan 21 20:54:12 2008
New Revision: 7219

Log:
- Implemented delete cascading for multi-relations.
- Finished implementation of enhancement #10373: Several relations to the same
  table for PersistentObject.

Modified:
    trunk/PersistentObject/ChangeLog
    trunk/PersistentObject/src/handlers/delete_handler.php
    trunk/PersistentObject/tests/multi_relation_test.php

Modified: trunk/PersistentObject/ChangeLog
==============================================================================
--- trunk/PersistentObject/ChangeLog [iso-8859-1] (original)
+++ trunk/PersistentObject/ChangeLog [iso-8859-1] Mon Jan 21 20:54:12 2008
@@ -2,6 +2,8 @@
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 - Refactored ezcPersistentSession.
+- Implemented enhancement #10373: Several relations to the same table for
+  PersistentObject.
 - Fixed issue #10205: binding variables with an undeclared var doesn't throw
   an exception. If getState() on a persistent object does not return an array
   an exception is thrown now.

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 20:54:12 2008
@@ -280,31 +280,41 @@
      * @param object $object                  The persistent object.
      * @param string $relatedClass            The class of the related 
persistent
      *                                        object.
-     * @param ezcPersistentRelation $relation The relation to check.
+     * @param ezcPersistentRelation|ezcPersistentRelationCollection $relation 
The relation to check.
      *
      * @todo Revise cascading code. So far it sends 1 delete statement per
      *       object but we can also collect them table wise and send just 1
      *       for each table.
      */
-    private function cascadeDelete( $object, $relatedClass, 
ezcPersistentRelation $relation )
-    {
+    private function cascadeDelete( $object, $relatedClass, $relation, 
$relationName = null )
+    {
+        // New multi-relations for a single class
+        if ( $relation instanceof ezcPersistentRelationCollection )
+        {
+            foreach( $relation as $relationName => $realRelation )
+            {
+                $this->cascadeDelete( $object, $relatedClass, $realRelation, 
$relationName );
+            }
+        }
+
         // Remove relation records for ManyToMany relations
         if ( $relation instanceof ezcPersistentManyToManyRelation )
         {
             $relatedObjects = $this->session->loadHandler->getRelatedObjects(
                 $object,
-                $relatedClass
+                $relatedClass,
+                $relationName
             );
             foreach ( $relatedObjects as $relatedObject )
             {
                 // Determine the correct direction for removal.
                 if ( $relation->reverse === true  )
                 {
-                    $this->removeRelatedObject( $relatedObject, $object );
+                    $this->removeRelatedObject( $relatedObject, $object, 
$relationName );
                 }
                 else
                 {
-                    $this->removeRelatedObject( $object, $relatedObject );
+                    $this->removeRelatedObject( $object, $relatedObject, 
$relationName );
                 }
             }
         }
@@ -325,7 +335,8 @@
             }
             $relatedObjects = $this->session->loadHandler->getRelatedObjects(
                 $object,
-                $relatedClass
+                $relatedClass,
+                $relationName
             );
             foreach ( $relatedObjects as $relatedObject )
             {

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 20:54:12 2008
@@ -414,6 +414,83 @@
             'Incorrect number of relation records after removing all siblings.'
         );
     }
+
+    public function testDeleteCascade()
+    {
+        $mother   = $this->session->load( 'MultiRelationTestPerson', 1 );
+
+        $this->session->delete( $mother );
+
+        $q = $this->session->createFindQuery( 'MultiRelationTestPerson' );
+        $q->where(
+            $q->expr->eq(
+                'mother',
+                $q->bindValue( 1 )
+            )
+          );
+
+        $stmt = $q->prepare();
+        $stmt->execute();
+        $rows = $stmt->fetchAll( PDO::FETCH_ASSOC );
+
+        $this->assertEquals(
+            0,
+            count( $rows ),
+            "Cascading while deleting MultiRelationTestPerson mother did not 
work."
+        );
+    }
+
+    public function testDeleteNoCascade()
+    {
+        $father   = $this->session->load( 'MultiRelationTestPerson', 2 );
+
+        $this->session->delete( $father );
+
+        $q = $this->session->createFindQuery( 'MultiRelationTestPerson' );
+        $q->where(
+            $q->expr->eq(
+                'father',
+                $q->bindValue( 2 )
+            )
+          );
+
+        $stmt = $q->prepare();
+        $stmt->execute();
+        $rows = $stmt->fetchAll( PDO::FETCH_ASSOC );
+
+        $this->assertNotEquals(
+            0,
+            count( $rows ),
+            "Cascaded while deleting MultiRelationTestPerson father while 
cascade was not desired."
+        );
+    }
+
+    public function testRemoveRelatioRecordsOnDeleteSiblings()
+    {
+        $child    = $this->session->load( 'MultiRelationTestPerson', 3 );
+
+        $this->session->delete( $child );
+
+        $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
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to