diff --git a/composer.json b/composer.json index ac8af42..755ccf6 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ "symfony/process": "~2.3", "jms/serializer": "0.16.*", "symfony/filesystem": "~2.3", - "nesbot/carbon": "~1.14" + "nesbot/carbon": "~1.14", + "doctrine/collections": "~1.3" }, "require-dev": { "phpunit/phpunit": "~4.0" diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php index b1b356b..3944571 100644 --- a/src/QueryBuilder.php +++ b/src/QueryBuilder.php @@ -2,16 +2,23 @@ namespace DavidBadura\Taskwarrior; -use DavidBadura\Taskwarrior\Exception\TaskwarriorException; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Criteria; /** * @author David Badura */ class QueryBuilder { - const SORT_URGENCY = 'urgency'; - const SORT_DESCRIPTION = 'description'; - const SORT_ENTRY = 'entry'; + /** + * @var string + */ + const ASC = Criteria::ASC; + + /** + * @var string + */ + const DESC = Criteria::DESC; /** * @var TaskManager @@ -24,9 +31,9 @@ class QueryBuilder protected $filter = []; /** - * @var string + * @var Criteria */ - protected $sortBy = self::SORT_URGENCY; + protected $criteria; /** * @param TaskManager $taskManager @@ -34,6 +41,7 @@ class QueryBuilder public function __construct(TaskManager $taskManager) { $this->taskManager = $taskManager; + $this->criteria = new Criteria(); } /** @@ -148,12 +156,34 @@ class QueryBuilder } /** - * @param string $by + * @param array $orderings * @return $this */ - public function sortBy($by = self::SORT_URGENCY) + public function orderBy(array $orderings) { - $this->sortBy = $by; + $this->criteria->orderBy($orderings); + + return $this; + } + + /** + * @param int $firstResult + * @return $this + */ + public function setFirstResult($firstResult) + { + $this->criteria->setFirstResult($firstResult); + + return $this; + } + + /** + * @param int $maxResults + * @return $this + */ + public function setMaxResults($maxResults) + { + $this->criteria->setMaxResults($maxResults); return $this; } @@ -167,58 +197,12 @@ class QueryBuilder } /** - * @return Task[] + * @return Task[]|ArrayCollection */ public function getResult() { $result = $this->taskManager->filter($this->getFilter()); - return $this->sort($result, $this->sortBy); - } - - /** - * @param Task[] $tasks - * @param string $by - * @return Task[] - * @throws TaskwarriorException - */ - protected function sort(array $tasks, $by) - { - switch ($by) { - case self::SORT_ENTRY: - - $callback = function (Task $a, Task $b) { - return $a->getEntry() >= $b->getEntry() ? 1 : -1; - }; - - break; - - case self::SORT_DESCRIPTION: - - $callback = function (Task $a, Task $b) { - return strcmp($b->getDescription(), $a->getDescription()); - }; - - break; - - case self::SORT_URGENCY: - - $callback = function (Task $a, Task $b) { - if (0 != $diff = $b->getUrgency() - $a->getUrgency()) { - return $diff; - } - - return $a->getEntry() >= $b->getEntry() ? 1 : -1; - }; - - break; - - default: - throw new TaskwarriorException('sorting by "%s" is not supported', $by); - } - - usort($tasks, $callback); - - return $tasks; + return $result->matching($this->criteria); } } \ No newline at end of file diff --git a/src/TaskManager.php b/src/TaskManager.php index 802dc00..316e1bd 100644 --- a/src/TaskManager.php +++ b/src/TaskManager.php @@ -5,6 +5,7 @@ namespace DavidBadura\Taskwarrior; use DavidBadura\Taskwarrior\Exception\TaskwarriorException; use DavidBadura\Taskwarrior\Serializer\Handler\CarbonHandler; use DavidBadura\Taskwarrior\Serializer\Handler\RecurringHandler; +use Doctrine\Common\Collections\ArrayCollection; use JMS\Serializer\Handler\HandlerRegistryInterface; use JMS\Serializer\JsonSerializationVisitor; use JMS\Serializer\Naming\CamelCaseNamingStrategy; @@ -90,7 +91,7 @@ class TaskManager /** * @param string|array $filter - * @return Task[] + * @return Task[]|ArrayCollection */ public function filterAll($filter = null) { @@ -112,12 +113,12 @@ class TaskManager $this->tasks[$task->getUuid()] = $task; } - return $result; + return new ArrayCollection($result); } /** * @param string|array $filter - * @return Task[] + * @return Task[]|ArrayCollection */ public function filter($filter = null) { diff --git a/tests/TaskManagerTest.php b/tests/TaskManagerTest.php index 0dbcf66..f01cc1e 100644 --- a/tests/TaskManagerTest.php +++ b/tests/TaskManagerTest.php @@ -158,7 +158,10 @@ class TaskManagerTest extends \PHPUnit_Framework_TestCase $this->taskManager->save($task1); $this->taskManager->save($task2); - $this->assertCount(2, $this->taskManager->filter()); + $result = $this->taskManager->filter(); + + $this->assertInstanceOf('Doctrine\Common\Collections\ArrayCollection', $result); + $this->assertCount(2, $result); } public function testMultiFilter()