Skip to content

Commit a8ab3a7

Browse files
authored
Merge pull request #653 from utopia-php/add-date-query-wrappers
Add date-based query helpers for createdAt and updatedAt
2 parents 828acd3 + c7975f9 commit a8ab3a7

3 files changed

Lines changed: 194 additions & 0 deletions

File tree

src/Database/Query.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,50 @@ public static function notEndsWith(string $attribute, string $value): self
625625
return new self(self::TYPE_NOT_ENDS_WITH, $attribute, [$value]);
626626
}
627627

628+
/**
629+
* Helper method to create Query for documents created before a specific date
630+
*
631+
* @param string $value
632+
* @return Query
633+
*/
634+
public static function createdBefore(string $value): self
635+
{
636+
return self::lessThan('$createdAt', $value);
637+
}
638+
639+
/**
640+
* Helper method to create Query for documents created after a specific date
641+
*
642+
* @param string $value
643+
* @return Query
644+
*/
645+
public static function createdAfter(string $value): self
646+
{
647+
return self::greaterThan('$createdAt', $value);
648+
}
649+
650+
/**
651+
* Helper method to create Query for documents updated before a specific date
652+
*
653+
* @param string $value
654+
* @return Query
655+
*/
656+
public static function updatedBefore(string $value): self
657+
{
658+
return self::lessThan('$updatedAt', $value);
659+
}
660+
661+
/**
662+
* Helper method to create Query for documents updated after a specific date
663+
*
664+
* @param string $value
665+
* @return Query
666+
*/
667+
public static function updatedAfter(string $value): self
668+
{
669+
return self::greaterThan('$updatedAt', $value);
670+
}
671+
628672
/**
629673
* @param array<Query> $queries
630674
* @return Query

tests/e2e/Adapter/Scopes/DocumentTests.php

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,6 +2644,110 @@ public function testFindOrderByUpdateDateAndCursor(): void
26442644
$this->assertEquals($documentsTest[1]['$id'], $documents[0]['$id']);
26452645
}
26462646

2647+
public function testFindCreatedBefore(): void
2648+
{
2649+
/** @var Database $database */
2650+
$database = static::getDatabase();
2651+
2652+
/**
2653+
* Test Query::createdBefore wrapper
2654+
*/
2655+
$futureDate = '2050-01-01T00:00:00.000Z';
2656+
$pastDate = '1900-01-01T00:00:00.000Z';
2657+
2658+
$documents = $database->find('movies', [
2659+
Query::createdBefore($futureDate),
2660+
Query::limit(1)
2661+
]);
2662+
2663+
$this->assertGreaterThan(0, count($documents));
2664+
2665+
$documents = $database->find('movies', [
2666+
Query::createdBefore($pastDate),
2667+
Query::limit(1)
2668+
]);
2669+
2670+
$this->assertEquals(0, count($documents));
2671+
}
2672+
2673+
public function testFindCreatedAfter(): void
2674+
{
2675+
/** @var Database $database */
2676+
$database = static::getDatabase();
2677+
2678+
/**
2679+
* Test Query::createdAfter wrapper
2680+
*/
2681+
$futureDate = '2050-01-01T00:00:00.000Z';
2682+
$pastDate = '1900-01-01T00:00:00.000Z';
2683+
2684+
$documents = $database->find('movies', [
2685+
Query::createdAfter($pastDate),
2686+
Query::limit(1)
2687+
]);
2688+
2689+
$this->assertGreaterThan(0, count($documents));
2690+
2691+
$documents = $database->find('movies', [
2692+
Query::createdAfter($futureDate),
2693+
Query::limit(1)
2694+
]);
2695+
2696+
$this->assertEquals(0, count($documents));
2697+
}
2698+
2699+
public function testFindUpdatedBefore(): void
2700+
{
2701+
/** @var Database $database */
2702+
$database = static::getDatabase();
2703+
2704+
/**
2705+
* Test Query::updatedBefore wrapper
2706+
*/
2707+
$futureDate = '2050-01-01T00:00:00.000Z';
2708+
$pastDate = '1900-01-01T00:00:00.000Z';
2709+
2710+
$documents = $database->find('movies', [
2711+
Query::updatedBefore($futureDate),
2712+
Query::limit(1)
2713+
]);
2714+
2715+
$this->assertGreaterThan(0, count($documents));
2716+
2717+
$documents = $database->find('movies', [
2718+
Query::updatedBefore($pastDate),
2719+
Query::limit(1)
2720+
]);
2721+
2722+
$this->assertEquals(0, count($documents));
2723+
}
2724+
2725+
public function testFindUpdatedAfter(): void
2726+
{
2727+
/** @var Database $database */
2728+
$database = static::getDatabase();
2729+
2730+
/**
2731+
* Test Query::updatedAfter wrapper
2732+
*/
2733+
$futureDate = '2050-01-01T00:00:00.000Z';
2734+
$pastDate = '1900-01-01T00:00:00.000Z';
2735+
2736+
$documents = $database->find('movies', [
2737+
Query::updatedAfter($pastDate),
2738+
Query::limit(1)
2739+
]);
2740+
2741+
$this->assertGreaterThan(0, count($documents));
2742+
2743+
$documents = $database->find('movies', [
2744+
Query::updatedAfter($futureDate),
2745+
Query::limit(1)
2746+
]);
2747+
2748+
$this->assertEquals(0, count($documents));
2749+
}
2750+
26472751
public function testFindLimit(): void
26482752
{
26492753
/** @var Database $database */

tests/unit/QueryTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,31 @@ public function testCreate(): void
116116
$this->assertEquals(Query::TYPE_NOT_BETWEEN, $query->getMethod());
117117
$this->assertEquals('score', $query->getAttribute());
118118
$this->assertEquals([10, 20], $query->getValues());
119+
120+
// Test new date query wrapper methods
121+
$query = Query::createdBefore('2023-01-01T00:00:00.000Z');
122+
123+
$this->assertEquals(Query::TYPE_LESSER, $query->getMethod());
124+
$this->assertEquals('$createdAt', $query->getAttribute());
125+
$this->assertEquals(['2023-01-01T00:00:00.000Z'], $query->getValues());
126+
127+
$query = Query::createdAfter('2023-01-01T00:00:00.000Z');
128+
129+
$this->assertEquals(Query::TYPE_GREATER, $query->getMethod());
130+
$this->assertEquals('$createdAt', $query->getAttribute());
131+
$this->assertEquals(['2023-01-01T00:00:00.000Z'], $query->getValues());
132+
133+
$query = Query::updatedBefore('2023-12-31T23:59:59.999Z');
134+
135+
$this->assertEquals(Query::TYPE_LESSER, $query->getMethod());
136+
$this->assertEquals('$updatedAt', $query->getAttribute());
137+
$this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues());
138+
139+
$query = Query::updatedAfter('2023-12-31T23:59:59.999Z');
140+
141+
$this->assertEquals(Query::TYPE_GREATER, $query->getMethod());
142+
$this->assertEquals('$updatedAt', $query->getAttribute());
143+
$this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues());
119144
}
120145

121146
/**
@@ -225,6 +250,27 @@ public function testParse(): void
225250
$this->assertEquals(null, $query->getAttribute());
226251
$this->assertEquals(['title', 'director'], $query->getValues());
227252

253+
// Test new date query wrapper methods parsing
254+
$query = Query::parse(Query::createdBefore('2023-01-01T00:00:00.000Z')->toString());
255+
$this->assertEquals('lessThan', $query->getMethod());
256+
$this->assertEquals('$createdAt', $query->getAttribute());
257+
$this->assertEquals(['2023-01-01T00:00:00.000Z'], $query->getValues());
258+
259+
$query = Query::parse(Query::createdAfter('2023-01-01T00:00:00.000Z')->toString());
260+
$this->assertEquals('greaterThan', $query->getMethod());
261+
$this->assertEquals('$createdAt', $query->getAttribute());
262+
$this->assertEquals(['2023-01-01T00:00:00.000Z'], $query->getValues());
263+
264+
$query = Query::parse(Query::updatedBefore('2023-12-31T23:59:59.999Z')->toString());
265+
$this->assertEquals('lessThan', $query->getMethod());
266+
$this->assertEquals('$updatedAt', $query->getAttribute());
267+
$this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues());
268+
269+
$query = Query::parse(Query::updatedAfter('2023-12-31T23:59:59.999Z')->toString());
270+
$this->assertEquals('greaterThan', $query->getMethod());
271+
$this->assertEquals('$updatedAt', $query->getAttribute());
272+
$this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues());
273+
228274
$query = Query::parse(Query::between('age', 15, 18)->toString());
229275
$this->assertEquals('between', $query->getMethod());
230276
$this->assertEquals('age', $query->getAttribute());

0 commit comments

Comments
 (0)