Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions src/Database/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -824,21 +824,39 @@ public static function and(array $queries): self
*
* @param array<Query> $queries
* @param array<string> $types
* @param bool $clone
* @return array<Query>
*/
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<Query> $queries
* @param bool $clone
* @return array<Query>
*/
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
*
Expand Down
60 changes: 56 additions & 4 deletions tests/unit/Validator/QueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

/**
Expand Down