From 5199e4508ac0c1d3902434a9cd05987d053d40f0 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Wed, 23 Apr 2014 13:43:17 +0200 Subject: [PATCH] dont update entity and dont run an update query if an entity wasnt changed at all --- lib/public/appframework/db/entity.php | 3 +++ lib/public/appframework/db/mapper.php | 7 ++++++- tests/lib/appframework/db/EntityTest.php | 11 ++++++++++- tests/lib/appframework/db/MapperTest.php | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/public/appframework/db/entity.php b/lib/public/appframework/db/entity.php index 631bf85061..8ab42bd915 100644 --- a/lib/public/appframework/db/entity.php +++ b/lib/public/appframework/db/entity.php @@ -92,6 +92,9 @@ abstract class Entity { protected function setter($name, $args) { // setters should only work for existing attributes if(property_exists($this, $name)){ + if($this->$name === $args[0]) { + return; + } $this->markFieldUpdated($name); // if type definition exists, cast to correct type diff --git a/lib/public/appframework/db/mapper.php b/lib/public/appframework/db/mapper.php index f65a232ed8..13a4c65e49 100644 --- a/lib/public/appframework/db/mapper.php +++ b/lib/public/appframework/db/mapper.php @@ -127,6 +127,12 @@ abstract class Mapper { * @param Entity $entity the entity that should be created */ public function update(Entity $entity){ + // if entity wasn't changed it makes no sense to run a db query + $properties = $entity->getUpdatedFields(); + if(count($properties) === 0) { + return $entity; + } + // entity needs an id $id = $entity->getId(); if($id === null){ @@ -136,7 +142,6 @@ abstract class Mapper { // get updated fields to save, fields have to be set using a setter to // be saved - $properties = $entity->getUpdatedFields(); // dont update the id field unset($properties['id']); diff --git a/tests/lib/appframework/db/EntityTest.php b/tests/lib/appframework/db/EntityTest.php index f674f435e0..9de44b9b3b 100644 --- a/tests/lib/appframework/db/EntityTest.php +++ b/tests/lib/appframework/db/EntityTest.php @@ -42,8 +42,9 @@ class TestEntity extends Entity { public $testId; public $preName; - public function __construct(){ + public function __construct($name=null){ $this->addType('testId', 'integer'); + $this->name = $name; } }; @@ -211,4 +212,12 @@ class EntityTest extends \PHPUnit_Framework_TestCase { $this->assertEquals('integer', gettype($entity->getId())); } + + public function testFieldsNotMarkedUpdatedIfNothingChanges() { + $entity = new TestEntity('hey'); + $entity->setName('hey'); + $this->assertEquals(0, count($entity->getUpdatedFields())); + } + + } \ No newline at end of file diff --git a/tests/lib/appframework/db/MapperTest.php b/tests/lib/appframework/db/MapperTest.php index e21edbd05c..4ddc4ef042 100644 --- a/tests/lib/appframework/db/MapperTest.php +++ b/tests/lib/appframework/db/MapperTest.php @@ -217,6 +217,20 @@ class MapperTest extends MapperTestUtility { } + public function testUpdateNothingChangedNoQuery(){ + $params = array('john', 'my@email'); + $entity = new Example(); + $entity->setId(3); + $entity->setEmail($params[1]); + $entity->resetUpdatedFields(); + + $this->db->expects($this->never()) + ->method('prepareQuery'); + + $this->mapper->update($entity); + } + + public function testMapRowToEntity(){ $entity1 = $this->mapper->mapRow(array('pre_name' => 'test1', 'email' => 'test2')); $entity2 = new Example();