diff --git a/src/Database/Query.php b/src/Database/Query.php index 8740820dd..5df9d6585 100644 --- a/src/Database/Query.php +++ b/src/Database/Query.php @@ -730,6 +730,30 @@ public static function updatedAfter(string $value): self return self::greaterThan('$updatedAt', $value); } + /** + * Helper method to create Query for documents created between two dates + * + * @param string $start + * @param string $end + * @return Query + */ + public static function createdBetween(string $start, string $end): self + { + return self::between('$createdAt', $start, $end); + } + + /** + * Helper method to create Query for documents updated between two dates + * + * @param string $start + * @param string $end + * @return Query + */ + public static function updatedBetween(string $start, string $end): self + { + return self::between('$updatedAt', $start, $end); + } + /** * @param array $queries * @return Query diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index bf7f2a905..79e2d8299 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -2745,6 +2745,98 @@ public function testFindUpdatedAfter(): void $this->assertEquals(0, count($documents)); } + public function testFindCreatedBetween(): void + { + /** @var Database $database */ + $database = static::getDatabase(); + + /** + * Test Query::createdBetween wrapper + */ + $pastDate = '1900-01-01T00:00:00.000Z'; + $futureDate = '2050-01-01T00:00:00.000Z'; + $recentPastDate = '2020-01-01T00:00:00.000Z'; + $nearFutureDate = '2025-01-01T00:00:00.000Z'; + + // All documents should be between past and future + $documents = $database->find('movies', [ + Query::createdBetween($pastDate, $futureDate), + Query::limit(25) + ]); + + $this->assertGreaterThan(0, count($documents)); + + // No documents should exist in this range + $documents = $database->find('movies', [ + Query::createdBetween($pastDate, $pastDate), + Query::limit(25) + ]); + + $this->assertEquals(0, count($documents)); + + // Documents created between recent past and near future + $documents = $database->find('movies', [ + Query::createdBetween($recentPastDate, $nearFutureDate), + Query::limit(25) + ]); + + $count = count($documents); + + // Same count should be returned with expanded range + $documents = $database->find('movies', [ + Query::createdBetween($pastDate, $nearFutureDate), + Query::limit(25) + ]); + + $this->assertGreaterThanOrEqual($count, count($documents)); + } + + public function testFindUpdatedBetween(): void + { + /** @var Database $database */ + $database = static::getDatabase(); + + /** + * Test Query::updatedBetween wrapper + */ + $pastDate = '1900-01-01T00:00:00.000Z'; + $futureDate = '2050-01-01T00:00:00.000Z'; + $recentPastDate = '2020-01-01T00:00:00.000Z'; + $nearFutureDate = '2025-01-01T00:00:00.000Z'; + + // All documents should be between past and future + $documents = $database->find('movies', [ + Query::updatedBetween($pastDate, $futureDate), + Query::limit(25) + ]); + + $this->assertGreaterThan(0, count($documents)); + + // No documents should exist in this range + $documents = $database->find('movies', [ + Query::updatedBetween($pastDate, $pastDate), + Query::limit(25) + ]); + + $this->assertEquals(0, count($documents)); + + // Documents updated between recent past and near future + $documents = $database->find('movies', [ + Query::updatedBetween($recentPastDate, $nearFutureDate), + Query::limit(25) + ]); + + $count = count($documents); + + // Same count should be returned with expanded range + $documents = $database->find('movies', [ + Query::updatedBetween($pastDate, $nearFutureDate), + Query::limit(25) + ]); + + $this->assertGreaterThanOrEqual($count, count($documents)); + } + public function testFindLimit(): void { /** @var Database $database */ diff --git a/tests/unit/QueryTest.php b/tests/unit/QueryTest.php index 3084abaa0..c48755cb2 100644 --- a/tests/unit/QueryTest.php +++ b/tests/unit/QueryTest.php @@ -141,6 +141,18 @@ public function testCreate(): void $this->assertEquals(Query::TYPE_GREATER, $query->getMethod()); $this->assertEquals('$updatedAt', $query->getAttribute()); $this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues()); + + $query = Query::createdBetween('2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'); + + $this->assertEquals(Query::TYPE_BETWEEN, $query->getMethod()); + $this->assertEquals('$createdAt', $query->getAttribute()); + $this->assertEquals(['2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'], $query->getValues()); + + $query = Query::updatedBetween('2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'); + + $this->assertEquals(Query::TYPE_BETWEEN, $query->getMethod()); + $this->assertEquals('$updatedAt', $query->getAttribute()); + $this->assertEquals(['2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'], $query->getValues()); } /** @@ -271,6 +283,16 @@ public function testParse(): void $this->assertEquals('$updatedAt', $query->getAttribute()); $this->assertEquals(['2023-12-31T23:59:59.999Z'], $query->getValues()); + $query = Query::parse(Query::createdBetween('2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z')->toString()); + $this->assertEquals('between', $query->getMethod()); + $this->assertEquals('$createdAt', $query->getAttribute()); + $this->assertEquals(['2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'], $query->getValues()); + + $query = Query::parse(Query::updatedBetween('2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z')->toString()); + $this->assertEquals('between', $query->getMethod()); + $this->assertEquals('$updatedAt', $query->getAttribute()); + $this->assertEquals(['2023-01-01T00:00:00.000Z', '2023-12-31T23:59:59.999Z'], $query->getValues()); + $query = Query::parse(Query::between('age', 15, 18)->toString()); $this->assertEquals('between', $query->getMethod()); $this->assertEquals('age', $query->getAttribute());