Skip to content

Commit aad7db5

Browse files
authored
Set fetch order during query (Webklex#41)
* Set fetch order during query * Documents query fetching order * Add back `$message_key` to `Query::get()` Fix bug introduced by cb43ff2
1 parent 230e504 commit aad7db5

File tree

2 files changed

+110
-6
lines changed

2 files changed

+110
-6
lines changed

README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
# IMAP Library for PHP
23

34
[![Latest Version on Packagist][ico-version]][link-packagist]
@@ -503,6 +504,41 @@ $messages = $folder->query()->whereAll()
503504
->get();
504505
```
505506

507+
Change messages fetch order:
508+
```php
509+
/** @var \Webklex\PHPIMAP\Folder $folder */
510+
511+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
512+
$messages = $folder->query()->whereText('Hello world')
513+
->setFetchOrder('asc')
514+
->get();
515+
516+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
517+
$messages = $folder->query()->whereAll()
518+
->setFetchOrderAsc()
519+
->get();
520+
521+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
522+
$messages = $folder->query()->whereAll()
523+
->fetchOrderAsc()
524+
->get();
525+
526+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
527+
$messages = $folder->query()->whereText('Hello world')
528+
->setFetchOrder('desc')
529+
->get();
530+
531+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
532+
$messages = $folder->query()->whereAll()
533+
->setFetchOrderDesc()
534+
->get();
535+
536+
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
537+
$messages = $folder->query()->whereAll()
538+
->fetchOrderDesc()
539+
->get();
540+
```
541+
506542

507543
#### Events
508544
The following events are available:
@@ -774,6 +810,9 @@ if you're just wishing a feature ;)
774810
| setFetchOptions | boolean $fetch_options | WhereQuery | Set the fetch options |
775811
| setFetchBody | boolean $fetch_body | WhereQuery | Set the fetch body option |
776812
| setFetchFlags | boolean $fetch_flags | WhereQuery | Set the fetch flags option |
813+
| setFetchOrder | string $fetch_order | WhereQuery | Change the fetch ordering (`asc` is "oldest first", `desc` is "newest first") |
814+
| setFetchOrderAsc | | WhereQuery | Change the fetch ordering to ascending |
815+
| setFetchOrderDesc | | WhereQuery | Change the fetch ordering to descending |
777816
| leaveUnread | | WhereQuery | Don't mark all messages as "read" while fetching: |
778817
| markAsRead | | WhereQuery | Mark all messages as "read" while fetching |
779818
| paginate | int $perPage = 5, $page = null, $pageName = 'imap_page' | LengthAwarePaginator | Paginate the current query. |

src/Query/Query.php

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ class Query {
6262
/** @var int $fetch_flags */
6363
protected $fetch_flags = true;
6464

65+
/** @var int $fetch_order */
66+
protected $fetch_order;
67+
6568
/** @var string $date_format */
6669
protected $date_format;
6770

@@ -75,6 +78,12 @@ public function __construct(Client $client, $charset = 'UTF-8') {
7578

7679
if(ClientManager::get('options.fetch') === IMAP::FT_PEEK) $this->leaveUnread();
7780

81+
if (ClientManager::get('options.fetch_order') === 'desc') {
82+
$this->fetch_order = 'desc';
83+
} else {
84+
$this->fetch_order = 'asc';
85+
}
86+
7887
$this->date_format = ClientManager::get('date_format', 'd M y');
7988

8089
$this->charset = $charset;
@@ -193,17 +202,16 @@ public function get() {
193202

194203
$messages->total($available_messages_count);
195204

196-
$options = ClientManager::get('options');
197-
198-
if(strtolower($options['fetch_order']) === 'desc'){
205+
if ($this->fetch_order === 'desc') {
199206
$available_messages = $available_messages->reverse();
200207
}
201208

209+
$message_key = ClientManager::get('options.message_key');
202210
$query =& $this;
203211

204-
$available_messages->forPage($this->page, $this->limit)->each(function($msgno, $msglist) use(&$messages, $options, $query) {
212+
$available_messages->forPage($this->page, $this->limit)->each(function($msgno, $msglist) use(&$messages, $message_key, $query) {
205213
$message = $query->getMessage($msgno, $msglist);
206-
switch ($options['message_key']){
214+
switch ($message_key){
207215
case 'number':
208216
$message_key = $message->getMessageNo();
209217
break;
@@ -468,4 +476,61 @@ public function setFetchFlags($fetch_flags) {
468476
$this->fetch_flags = $fetch_flags;
469477
return $this;
470478
}
471-
}
479+
480+
/**
481+
* @param string $fetch_order
482+
* @return Query
483+
*/
484+
public function setFetchOrder($fetch_order) {
485+
$fetch_order = strtolower($fetch_order);
486+
487+
if (in_array($fetch_order, ['asc', 'desc'])) {
488+
$this->fetch_order = $fetch_order;
489+
}
490+
491+
return $this;
492+
}
493+
494+
/**
495+
* @param string $fetch_order
496+
* @return Query
497+
*/
498+
public function fetchOrder($fetch_order) {
499+
return $this->setFetchOrder($fetch_order);
500+
}
501+
502+
/**
503+
* @return string
504+
*/
505+
public function getFetchOrder() {
506+
return $this->fetch_order;
507+
}
508+
509+
/**
510+
* @return Query
511+
*/
512+
public function setFetchOrderAsc() {
513+
return $this->setFetchOrder('asc');
514+
}
515+
516+
/**
517+
* @return Query
518+
*/
519+
public function fetchOrderAsc($fetch_order) {
520+
return $this->setFetchOrderAsc();
521+
}
522+
523+
/**
524+
* @return Query
525+
*/
526+
public function setFetchOrderDesc() {
527+
return $this->setFetchOrder('desc');
528+
}
529+
530+
/**
531+
* @return Query
532+
*/
533+
public function fetchOrderDesc($fetch_order) {
534+
return $this->setFetchOrderDesc();
535+
}
536+
}

0 commit comments

Comments
 (0)