Skip to content

Commit 9ef833c

Browse files
committed
Added remove method to ModelManager
1 parent 484fce7 commit 9ef833c

4 files changed

Lines changed: 71 additions & 27 deletions

File tree

src/DataMapper/IdentityMap.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public function add(ClassMetadata $metadata, string $id, $model)
2424
$this->identityMap[$metadata->name][$id] = $model;
2525
}
2626

27+
public function delete(ClassMetadata $metadata, string $id)
28+
{
29+
unset($this->identityMap[$metadata->name][$id]);
30+
}
31+
2732
public function clear()
2833
{
2934
$this->identityMap = [];

src/DataMapper/ModelManagerInterface.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
interface ModelManagerInterface
88
{
9-
public function persist($model): Promise;
9+
public function persist($model, IdentityMap $identityMap = null): Promise;
1010

11-
public function find(string $class, string $id): Promise;
11+
public function remove($model, IdentityMap $identityMap = null): Promise;
12+
13+
public function find(string $class, string $id, int $depthLevel = 1, IdentityMap $identityMap = null): Promise;
1214
}

src/DataMapper/Redis/ModelManager.php

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,28 @@ public function persist($model, IdentityMap $identityMap = null): Promise
8080
return $deferred->promise();
8181
}
8282

83+
public function remove($model, IdentityMap $identityMap = null): Promise
84+
{
85+
$deferred = new Deferred();
86+
87+
Loop::defer(wrap(function () use ($deferred, $model, $identityMap) {
88+
if (null === $identityMap) {
89+
$identityMap = new IdentityMap();
90+
}
91+
92+
/** @var ClassMetadata $classMetadata */
93+
$classMetadata = $this->metadataFactory->getMetadataForClass(get_class($model));
94+
95+
yield $this->redisClient->del($this->getKey($classMetadata, $model));
96+
97+
$identityMap->delete($classMetadata, $this->getIdFromModel($classMetadata, $model));
98+
99+
$deferred->resolve(true);
100+
}));
101+
102+
return $deferred->promise();
103+
}
104+
83105
public function find(string $class, string $id, int $depthLevel = 1, IdentityMap $identityMap = null): Promise
84106
{
85107
$deferred = new Deferred();
@@ -101,36 +123,40 @@ public function find(string $class, string $id, int $depthLevel = 1, IdentityMap
101123

102124
$modelData = yield $this->redisClient->hGetAll($this->getKeyByClassNameId($class, $id));
103125

104-
/** @var PropertyMetadata $propertyMetadata */
105-
foreach ($classMetadata->propertyMetadata as $propertyMetadata) {
106-
if (array_key_exists($propertyMetadata->name, $modelData)) {
107-
if ($propertyMetadata->isField) {
108-
$propertyMetadata->setValue($modelInstance, $modelData[$propertyMetadata->name]);
109-
} elseif ($depthLevel <= $this->maxDepthLevel && !empty($modelData[$propertyMetadata->name])) {
110-
if ($propertyMetadata->referenceType === 'one') {
111-
$referenceModel = yield $this->find(
112-
$propertyMetadata->referenceTarget,
113-
$modelData[$propertyMetadata->name],
114-
$depthLevel + 1,
115-
$identityMap
116-
);
117-
$propertyMetadata->setValue($modelInstance, $referenceModel);
118-
} elseif ($propertyMetadata->referenceType === 'many') {
119-
$referenceModels = [];
120-
foreach (explode(',', $modelData[$propertyMetadata->name]) as $referenceId) {
121-
$referenceModels[] = $this->find(
126+
if (empty($modelData)) {
127+
$modelInstance = null;
128+
} else {
129+
/** @var PropertyMetadata $propertyMetadata */
130+
foreach ($classMetadata->propertyMetadata as $propertyMetadata) {
131+
if (array_key_exists($propertyMetadata->name, $modelData)) {
132+
if ($propertyMetadata->isField) {
133+
$propertyMetadata->setValue($modelInstance, $modelData[$propertyMetadata->name]);
134+
} elseif ($depthLevel <= $this->maxDepthLevel && !empty($modelData[$propertyMetadata->name])) {
135+
if ($propertyMetadata->referenceType === 'one') {
136+
$referenceModel = yield $this->find(
122137
$propertyMetadata->referenceTarget,
123-
$referenceId,
138+
$modelData[$propertyMetadata->name],
124139
$depthLevel + 1,
125140
$identityMap
126141
);
142+
$propertyMetadata->setValue($modelInstance, $referenceModel);
143+
} elseif ($propertyMetadata->referenceType === 'many') {
144+
$referenceModels = [];
145+
foreach (explode(',', $modelData[$propertyMetadata->name]) as $referenceId) {
146+
$referenceModels[] = $this->find(
147+
$propertyMetadata->referenceTarget,
148+
$referenceId,
149+
$depthLevel + 1,
150+
$identityMap
151+
);
152+
}
153+
154+
if (count($referenceModels) > 0) {
155+
$referenceModels = yield all($referenceModels);
156+
}
157+
158+
$propertyMetadata->setValue($modelInstance, $referenceModels);
127159
}
128-
129-
if (count($referenceModels) > 0) {
130-
$referenceModels = yield all($referenceModels);
131-
}
132-
133-
$propertyMetadata->setValue($modelInstance, $referenceModels);
134160
}
135161
}
136162
}

tests/DataMapper/Redis/RedisImplementationIntegrationTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,17 @@ public function testBooks()
185185
$this->assertTrue($found, 'Not found genres');
186186
}
187187

188+
$loadedBook4 = wait($modelManager->find(Book::class, 'book-id4', 1, $identityMap));
189+
$this->assertSame($book4, $loadedBook4);
190+
191+
wait($modelManager->remove($book4, $identityMap));
192+
193+
$loadedBook4AfterRemove = wait($modelManager->find(Book::class, 'book-id4', 1, $identityMap));
194+
$this->assertNull($loadedBook4AfterRemove);
195+
196+
wait($modelManager->remove($book5));
197+
$this->assertNull(wait($modelManager->find(Book::class, 'book-id5')));
198+
188199
$identityMap->clear();
189200

190201
$loadedAuthor1AfterClear = wait($modelManager->find(Author::class, 'author-id1', 1, $identityMap));

0 commit comments

Comments
 (0)