diff options
author | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-04-23 13:43:17 +0200 |
---|---|---|
committer | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-04-23 13:43:17 +0200 |
commit | 5199e4508ac0c1d3902434a9cd05987d053d40f0 (patch) | |
tree | d91739aeac078e7c9a1c50d01afd1bd37221c142 | |
parent | 309aa3bcd253d5584ff4b514874ef51a6623a621 (diff) | |
download | nextcloud-server-5199e4508ac0c1d3902434a9cd05987d053d40f0.tar.gz nextcloud-server-5199e4508ac0c1d3902434a9cd05987d053d40f0.zip |
dont update entity and dont run an update query if an entity wasnt changed at all
-rw-r--r-- | lib/public/appframework/db/entity.php | 3 | ||||
-rw-r--r-- | lib/public/appframework/db/mapper.php | 7 | ||||
-rw-r--r-- | tests/lib/appframework/db/EntityTest.php | 11 | ||||
-rw-r--r-- | 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 631bf85061e..8ab42bd9153 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 f65a232ed83..13a4c65e493 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 f674f435e09..9de44b9b3ba 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 e21edbd05cf..4ddc4ef0422 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(); |