Skip to content

Commit 669f6f2

Browse files
authored
Account for additional relative time keywords 'now','week' & 'year' (#364)
* Added tests for relative time keywords 'now','week' & 'year' * Updated README
1 parent c5e7428 commit 669f6f2

File tree

2 files changed

+110
-3
lines changed

2 files changed

+110
-3
lines changed

README.md

+23
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ from your PHP app or script. Designed to work with the self-hosted Parse Server
2222
- [Users](#users)
2323
- [ACLs/Security](#acls)
2424
- [Queries](#queries)
25+
- [Relative Time](#relative-time)
2526
- [Cloud Functions](#cloud-functions)
2627
- [Analytics](#analytics)
2728
- [Files](#files)
@@ -280,6 +281,28 @@ $query->each(function($obj) {
280281
});
281282
```
282283

284+
#### Relative Time
285+
286+
Queries can be made using relative time, allowing you to retrieve objects over a varying ranges of relative dates.
287+
Keep in mind that all relative queries are performed using the server's time and timezone.
288+
```php
289+
// greater than 2 weeks ago
290+
$query->greaterThanRelativeTime('createdAt', '2 weeks ago');
291+
292+
// less than 1 day in the future
293+
$query->lessThanRelativeTime('updatedAt', 'in 1 day');
294+
295+
// can make queries to very specific points in time
296+
$query->greaterThanOrEqualToRelativeTime('createdAt', '1 year 2 weeks 30 days 2 hours 5 minutes 10 seconds ago');
297+
298+
// can make queries based on right now
299+
// gets everything updated up to this point in time
300+
$query->lessThanOrEqualToRelativeTime('updatedAt', 'now');
301+
302+
// shorthand keywords work as well
303+
$query->greaterThanRelativeTime('date', '1 yr 2 wks 30 d 2 hrs 5 mins 10 secs ago');
304+
```
305+
283306
### Cloud Functions
284307

285308
Directly call server-side cloud coud functions and get their results.

tests/Parse/ParseQueryRelativeTimeTest.php

+87-3
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ public function tearDown()
2727

2828
public function provideDateTestObjects()
2929
{
30-
// 4 days ago
3130
$obj = new ParseObject('TestObject');
3231
$obj->save();
3332

3433
// use server date
3534
$baselineDate = $obj->getCreatedAt()->format('m/d/Y H:i:s');
3635

36+
// 4 days ago
3737
$date = \DateTime::createFromFormat('m/d/Y H:i:s', $baselineDate);
3838
$date->sub((new \DateInterval('P4D')));
3939
$obj->set('date', $date);
@@ -65,6 +65,46 @@ public function provideDateTestObjects()
6565
$obj->save();
6666
}
6767

68+
public function provideExtendedDateTestObjects()
69+
{
70+
$obj = new ParseObject('TestObject');
71+
$obj->save();
72+
73+
// use server date
74+
$baselineDate = $obj->getCreatedAt()->format('m/d/Y H:i:s');
75+
76+
// 1 year 20 days ago
77+
$date = \DateTime::createFromFormat('m/d/Y H:i:s', $baselineDate);
78+
$date->sub((new \DateInterval('P01Y20D')));
79+
$obj->set('date', $date);
80+
$obj->set('name', 'obj1');
81+
$obj->save();
82+
83+
// 1 year 8 days ago
84+
$obj = new ParseObject('TestObject');
85+
$date = \DateTime::createFromFormat('m/d/Y H:i:s', $baselineDate);
86+
$date->sub((new \DateInterval('P01Y8D')));
87+
$obj->set('date', $date);
88+
$obj->set('name', 'obj2');
89+
$obj->save();
90+
91+
// 1 year 8 days from now
92+
$obj = new ParseObject('TestObject');
93+
$date = \DateTime::createFromFormat('m/d/Y H:i:s', $baselineDate);
94+
$date->add((new \DateInterval('P01Y8D')));
95+
$obj->set('date', $date);
96+
$obj->set('name', 'obj3');
97+
$obj->save();
98+
99+
// 1 year 20 days from now
100+
$obj = new ParseObject('TestObject');
101+
$date = \DateTime::createFromFormat('m/d/Y H:i:s', $baselineDate);
102+
$date->add((new \DateInterval('P01Y20D')));
103+
$obj->set('date', $date);
104+
$obj->set('name', 'obj4');
105+
$obj->save();
106+
}
107+
68108
/**
69109
* @group relative-time-queries
70110
*/
@@ -203,7 +243,7 @@ public function testRelativeTimeUnits()
203243

204244
// shorthand units
205245
$query = new ParseQuery('TestObject');
206-
$query->greaterThanRelativeTime('date', 'in 3 days 2 hrs 15 mins 30 secs');
246+
$query->greaterThanRelativeTime('date', 'in 3 d 2 hrs 15 mins 30 secs');
207247
$this->assertEquals(1, $query->count());
208248

209249
// singular units
@@ -213,10 +253,54 @@ public function testRelativeTimeUnits()
213253

214254
// singular shorthand units
215255
$query = new ParseQuery('TestObject');
216-
$query->greaterThanRelativeTime('date', 'in 3 days 1 hr 1 min 1 sec');
256+
$query->greaterThanRelativeTime('date', 'in 3 d 1 hr 1 min 1 sec');
217257
$this->assertEquals(1, $query->count());
218258
}
219259

260+
/**
261+
* @group relative-time-queries
262+
*/
263+
public function testLongRelativeTime()
264+
{
265+
$this->provideExtendedDateTestObjects();
266+
267+
$query = new ParseQuery('TestObject');
268+
$query->greaterThanRelativeTime('date', 'in 1 year 2 weeks');
269+
$this->assertEquals(1, $query->count());
270+
271+
$query = new ParseQuery('TestObject');
272+
$query->lessThanRelativeTime('date', '1 yr 2 wks ago');
273+
$this->assertEquals(1, $query->count());
274+
275+
$query = new ParseQuery('TestObject');
276+
$query->lessThanRelativeTime('date', '1 year 3 weeks ago');
277+
$this->assertEquals(0, $query->count());
278+
279+
$query = new ParseQuery('TestObject');
280+
$query->greaterThanRelativeTime('date', 'in 1 year 3 weeks');
281+
$this->assertEquals(0, $query->count());
282+
283+
$query = new ParseQuery('TestObject');
284+
$query->greaterThanRelativeTime('date', '1 year 3 weeks ago');
285+
$this->assertEquals(4, $query->count());
286+
}
287+
288+
/**
289+
* @group relative-time-queries
290+
*/
291+
public function testNowRelativeTime()
292+
{
293+
$this->provideDateTestObjects();
294+
295+
$query = new ParseQuery('TestObject');
296+
$query->greaterThanRelativeTime('date', 'now');
297+
$this->assertEquals(2, $query->count());
298+
299+
$query = new ParseQuery('TestObject');
300+
$query->lessThanRelativeTime('date', 'now');
301+
$this->assertEquals(2, $query->count());
302+
}
303+
220304
/**
221305
* @group relative-time-queries
222306
*/

0 commit comments

Comments
 (0)