diff --git a/src/Core/Repositories/EloquentPostRepository.php b/src/Core/Repositories/EloquentPostRepository.php index 493c04796..886e0a415 100644 --- a/src/Core/Repositories/EloquentPostRepository.php +++ b/src/Core/Repositories/EloquentPostRepository.php @@ -29,19 +29,21 @@ class EloquentPostRepository implements PostRepositoryInterface * * @param array $where * @param \Flarum\Core\Models\User|null $user - * @param string $sort - * @param string $order + * @param array $sort * @param integer $count * @param integer $start * @return \Illuminate\Database\Eloquent\Collection */ - public function findWhere($where = [], User $user = null, $sort = 'time', $order = 'asc', $count = null, $start = 0) + public function findWhere($where = [], User $user = null, $sort = [], $count = null, $start = 0) { $query = Post::where($where) - ->orderBy($sort, $order) ->skip($start) ->take($count); + foreach ((array) $sort as $field => $order) { + $query->orderBy($field, $order); + } + return $this->scopeVisibleForUser($query, $user)->get(); } diff --git a/src/Core/Repositories/PostRepositoryInterface.php b/src/Core/Repositories/PostRepositoryInterface.php index c37b68a49..3e0f47f53 100644 --- a/src/Core/Repositories/PostRepositoryInterface.php +++ b/src/Core/Repositories/PostRepositoryInterface.php @@ -22,13 +22,12 @@ interface PostRepositoryInterface * * @param array $where * @param \Flarum\Core\Models\User|null $user - * @param string $sort - * @param string $order + * @param array $sort * @param integer $count * @param integer $start * @return \Illuminate\Database\Eloquent\Collection */ - public function findWhere($where = [], User $user = null, $sort = 'time', $order = 'asc', $count = null, $start = 0); + public function findWhere($where = [], User $user = null, $sort = [], $count = null, $start = 0); /** * Find posts by their IDs, optionally making sure they are visible to a diff --git a/src/Core/Search/Discussions/DiscussionSearchCriteria.php b/src/Core/Search/Discussions/DiscussionSearchCriteria.php index 6b7d47c84..e2b971926 100644 --- a/src/Core/Search/Discussions/DiscussionSearchCriteria.php +++ b/src/Core/Search/Discussions/DiscussionSearchCriteria.php @@ -8,13 +8,10 @@ class DiscussionSearchCriteria public $sort; - public $order; - - public function __construct($user, $query, $sort, $order) + public function __construct($user, $query, $sort) { $this->user = $user; $this->query = $query; $this->sort = $sort; - $this->order = $order; } } diff --git a/src/Core/Search/Discussions/DiscussionSearcher.php b/src/Core/Search/Discussions/DiscussionSearcher.php index 0f607c7d0..c5e5633ec 100644 --- a/src/Core/Search/Discussions/DiscussionSearcher.php +++ b/src/Core/Search/Discussions/DiscussionSearcher.php @@ -11,20 +11,14 @@ class DiscussionSearcher implements SearcherInterface { public $query; - protected $sortMap = [ - 'lastPost' => ['last_time', 'desc'], - 'replies' => ['comments_count', 'desc'], - 'created' => ['start_time', 'asc'] - ]; - - protected $defaultSort = 'lastPost'; - protected $relevantPosts = []; protected $gambits; protected $discussions; + protected $defaultSort = ['lastTime' => 'desc']; + public function __construct(GambitManager $gambits, DiscussionRepositoryInterface $discussions, PostRepositoryInterface $posts) { $this->gambits = $gambits; @@ -50,7 +44,7 @@ class DiscussionSearcher implements SearcherInterface return $this->query->getQuery(); } - public function search(DiscussionSearchCriteria $criteria, $count = null, $start = 0, $load = []) + public function search(DiscussionSearchCriteria $criteria, $limit = null, $offset = 0, $load = []) { $this->user = $criteria->user; $this->query = $this->discussions->query()->whereCan($criteria->user, 'view'); @@ -59,31 +53,30 @@ class DiscussionSearcher implements SearcherInterface $total = $this->query->count(); - if (empty($criteria->sort)) { - $criteria->sort = $this->defaultSort; - } - $sort = $criteria->sort; - if (is_array($sort)) { - foreach ($sort as $id) { - $this->query->orderByRaw('id != '.(int) $id); + $sort = $criteria->sort ?: $this->defaultSort; + + foreach ($sort as $field => $order) { + if (is_array($order)) { + foreach ($order as $value) { + $this->query->orderByRaw(snake_case($field).' != ?', [$value]); + } + } else { + $this->query->orderBy(snake_case($field), $order); } - } else { - list($column, $order) = $this->sortMap[$sort]; - $this->query->orderBy($column, $criteria->order ?: $order); } - if ($start > 0) { - $this->query->skip($start); + if ($offset > 0) { + $this->query->skip($offset); } - if ($count > 0) { - $this->query->take($count + 1); + if ($limit > 0) { + $this->query->take($limit + 1); } event(new SearchWillBePerformed($this, $criteria)); $discussions = $this->query->get(); - if ($count > 0 && $areMoreResults = $discussions->count() > $count) { + if ($limit > 0 && $areMoreResults = $discussions->count() > $limit) { $discussions->pop(); } @@ -109,6 +102,7 @@ class DiscussionSearcher implements SearcherInterface } } + // @todo make instance rather than static and set on all discussions Discussion::setStateUser($this->user); $discussions->load($load); diff --git a/src/Core/Search/Discussions/Gambits/FulltextGambit.php b/src/Core/Search/Discussions/Gambits/FulltextGambit.php index 8aca89890..a476edde6 100644 --- a/src/Core/Search/Discussions/Gambits/FulltextGambit.php +++ b/src/Core/Search/Discussions/Gambits/FulltextGambit.php @@ -26,6 +26,6 @@ class FulltextGambit extends GambitAbstract $searcher->query()->whereIn('id', $discussions); - $searcher->setDefaultSort($discussions); + $searcher->setDefaultSort(['id' => $discussions]); } }