From bedae2fc572e34cfc94ec6ac70db386e47b238e6 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 20 Mar 2017 13:52:53 +0200 Subject: [PATCH] Store object original data in the object. Do not track _id changes. --- docker-compose.yml | 5 ++-- src/ChangesCollector.php | 34 ++++++++------------- src/Converter.php | 4 +++ src/Storage.php | 4 --- tests/ChangesCollectorTest.php | 55 ++++++++++++++++++++++++++++++---- 5 files changed, 69 insertions(+), 33 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 84a6a42..20de81d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,7 @@ version: '2' services: yadm: image: formapro/nginx-php-fpm:latest-all-exts + working_dir: /yadm volumes: - ./:/yadm environment: @@ -9,5 +10,5 @@ services: mongo: image: mongo:3 - ports: - - "27017:27017" \ No newline at end of file +# ports: +# - "27017:27017" diff --git a/src/ChangesCollector.php b/src/ChangesCollector.php index c186d5c..e615b57 100644 --- a/src/ChangesCollector.php +++ b/src/ChangesCollector.php @@ -1,39 +1,31 @@ originalValues[$id] = get_values($object); - } - } - - public function unregister($object) - { - if ($id = get_object_id($object)) { - unset($this->originalValues[$id]); - } + (function() { + $this->originalValues = $this->values; + })->call($object); } public function changes($object) { - if (false == $id = get_object_id($object)) { - throw new \LogicException(sprintf('Object does not have an id set.')); - } + return (function() { + $values = $this->values; + + if (property_exists($this, 'originalValues')) { + $originalValues = $this->originalValues; - if (false == array_key_exists($id, $this->originalValues)) { - throw new \LogicException(sprintf('Changes has not been collected. The object with id "%s" original data is missing.')); - } + $diff = JsonPatch::diff($originalValues, $values); - $diff = JsonPatch::diff($this->originalValues[$id], get_values($object)); + return Converter::convertJsonPatchToMongoUpdate($diff); + } - return Converter::convertJsonPatchToMongoUpdate($diff); + return ['$set' => $values]; + })->call($object); } } diff --git a/src/Converter.php b/src/Converter.php index 15e22a6..40ad7ec 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -12,6 +12,10 @@ public static function convertJsonPatchToMongoUpdate(array $diff) { $update = ['$set' => [], '$unset' => []]; foreach ($diff as $op) { + if (isset($op['path']) && '/_id' == $op['path']) { + continue; + } + switch ($op['op']) { case 'add': if (is_array($op['value'])) { diff --git a/src/Storage.php b/src/Storage.php index fdb92a5..590a04f 100644 --- a/src/Storage.php +++ b/src/Storage.php @@ -141,10 +141,6 @@ public function delete($model, array $options = []) throw new \LogicException('Operation is not acknowledged'); } - // TODO remove id??? - - $this->changesCollector->unregister($model); - return $result; } diff --git a/tests/ChangesCollectorTest.php b/tests/ChangesCollectorTest.php index 3aa77e9..e2fbfe0 100644 --- a/tests/ChangesCollectorTest.php +++ b/tests/ChangesCollectorTest.php @@ -12,9 +12,6 @@ class ChangesCollectorTest extends TestCase { - /** - * @group d - */ public function testShouldTrackSetValue() { $obj = $this->createPersistedObject(); @@ -23,7 +20,7 @@ public function testShouldTrackSetValue() $collector->register($obj); set_value($obj, 'aKey', 'aVal'); -var_dump($collector->changes($obj)); + self::assertEquals([ '$set' => [ 'aKey' => 'aVal', @@ -31,7 +28,7 @@ public function testShouldTrackSetValue() ], $collector->changes($obj)); } - public function testShouldTrackAddedValue() + public function testShouldTrackAddedValueToEmptyCollection() { $obj = $this->createPersistedObject(); @@ -47,6 +44,52 @@ public function testShouldTrackAddedValue() ], $collector->changes($obj)); } + public function testShouldSkipMongoIdField() + { + $obj = $this->createPersistedObject(); + set_value($obj, '_id',123); + + $collector = new ChangesCollector(); + $collector->register($obj); + + set_value($obj, '_id',321); + + self::assertEquals([], $collector->changes($obj)); + } + + public function testShouldUseWholeValuesIfNotRegistered() + { + $collector = new ChangesCollector(); + + $obj = new Object(); + set_value($obj, 'foo','fooVal'); + set_value($obj, 'bar.baz','barVal'); + + self::assertEquals([ + '$set' => [ + 'foo' => 'fooVal', + 'bar' => ['baz' => 'barVal'], + ], + ], $collector->changes($obj)); + } + + public function testShouldTrackAddedValue() + { + $obj = $this->createPersistedObject(); + add_value($obj, 'aKey', 'anOldVal'); + + $collector = new ChangesCollector(); + $collector->register($obj); + + add_value($obj, 'aKey', 'aVal'); + + self::assertEquals([ + '$set' => [ + 'aKey.1' => 'aVal', + ], + ], $collector->changes($obj)); + } + public function testShouldNotTrackSetValueAndUnsetLater() { $obj = $this->createPersistedObject(); @@ -155,7 +198,7 @@ public function testShouldFoo() } /** - * @return Object + * @return object */ private function createPersistedObject(array $values = []) {