diff --git a/src/Database/Query.php b/src/Database/Query.php index cfa6a5934..825f4f7ec 100644 --- a/src/Database/Query.php +++ b/src/Database/Query.php @@ -824,21 +824,39 @@ public static function and(array $queries): self * * @param array $queries * @param array $types + * @param bool $clone * @return array */ - public static function getByType(array $queries, array $types): array + public static function getByType(array $queries, array $types, bool $clone = true): array { $filtered = []; foreach ($queries as $query) { if (\in_array($query->getMethod(), $types, true)) { - $filtered[] = clone $query; + $filtered[] = $clone ? clone $query : $query; } } return $filtered; } + /** + * @param array $queries + * @param bool $clone + * @return array + */ + public static function getCursorQueries(array $queries, bool $clone = true): array + { + return self::getByType( + $queries, + [ + Query::TYPE_CURSOR_AFTER, + Query::TYPE_CURSOR_BEFORE, + ], + $clone + ); + } + /** * Iterates through queries are groups them by type * diff --git a/tests/unit/Validator/QueryTest.php b/tests/unit/Validator/QueryTest.php index dbe7a6b52..8433f47f2 100644 --- a/tests/unit/Validator/QueryTest.php +++ b/tests/unit/Validator/QueryTest.php @@ -238,16 +238,68 @@ public function testQueryGetByType(): void { $queries = [ Query::equal('key', ['value']), - Query::select(['attr1', 'attr2']), Query::cursorBefore(new Document([])), Query::cursorAfter(new Document([])), ]; - $queries = Query::getByType($queries, [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - $this->assertCount(2, $queries); - foreach ($queries as $query) { + $queries1 = Query::getByType($queries, [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); + + $this->assertCount(2, $queries1); + foreach ($queries1 as $query) { $this->assertEquals(true, in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE])); } + + $cursor = reset($queries1); + + $this->assertInstanceOf(Query::class, $cursor); + + $cursor->setValue(new Document(['$id' => 'hello1'])); + + $query1 = $queries[1]; + + $this->assertEquals(Query::TYPE_CURSOR_BEFORE, $query1->getMethod()); + $this->assertInstanceOf(Document::class, $query1->getValue()); + $this->assertTrue($query1->getValue()->isEmpty()); // Cursor Document is not updated + + /** + * Using reference $queries2 => $queries + */ + $queries2 = Query::getByType($queries, [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE], false); + + $cursor = reset($queries2); + $this->assertInstanceOf(Query::class, $cursor); + + $cursor->setValue(new Document(['$id' => 'hello1'])); + + $query2 = $queries[1]; + + $this->assertCount(2, $queries2); + $this->assertEquals(Query::TYPE_CURSOR_BEFORE, $query2->getMethod()); + $this->assertInstanceOf(Document::class, $query2->getValue()); + $this->assertEquals('hello1', $query2->getValue()->getId()); // Cursor Document is updated + + /** + * Using getCursorQueries + */ + $queries = [ + Query::equal('key', ['value']), + Query::cursorBefore(new Document([])), + Query::cursorAfter(new Document([])), + ]; + + $queries3 = Query::getCursorQueries($queries, false); + + $cursor = reset($queries3); // Same as writing $cursor = $queries3[0]; + $this->assertInstanceOf(Query::class, $cursor); + + $cursor->setValue(new Document(['$id' => 'hello3'])); + + $query3 = $queries[1]; + + $this->assertCount(2, $queries3); + $this->assertEquals(Query::TYPE_CURSOR_BEFORE, $query3->getMethod()); + $this->assertInstanceOf(Document::class, $query3->getValue()); + $this->assertEquals('hello3', $query3->getValue()->getId()); // Cursor Document is updated } /**