/**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     $actor = $search->getActor();
     // might be better as `id IN (subquery)`?
     $method = $negate ? 'whereNotExists' : 'whereExists';
     $search->getQuery()->{$method}(function ($query) use($actor, $matches) {
         $query->select(app('flarum.db')->raw(1))->from('users_discussions')->where('discussions.id', new Expression('discussion_id'))->where('user_id', $actor->id)->where('subscription', $matches[1] === 'follow' ? 'follow' : 'ignore');
     });
 }
Example #2
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof UserSearch) {
         throw new LogicException('This gambit can only be applied on a UserSearch');
     }
     $email = trim($matches[1], '"');
     $user = $this->users->findByEmail($email);
     $search->getQuery()->where('id', $negate ? '!=' : '=', $user->id);
 }
Example #3
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     $username = trim($matches[1], '"');
     $id = $this->users->getIdForUsername($username);
     $search->getQuery()->where('start_user_id', $negate ? '!=' : '=', $id);
 }
Example #4
0
 /**
  * {@inheritdoc}
  */
 public function apply(AbstractSearch $search, $bit)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     $relevantPostIds = $this->fulltext->match($bit);
     $discussionIds = array_keys($relevantPostIds);
     $search->setRelevantPostIds($relevantPostIds);
     $search->getQuery()->whereIn('id', $discussionIds);
     $search->setDefaultSort(['id' => $discussionIds]);
 }
Example #5
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     $usernames = trim($matches[1], '"');
     $usernames = explode(',', $usernames);
     $ids = [];
     foreach ($usernames as $username) {
         $ids[] = $this->users->getIdForUsername($username);
     }
     $search->getQuery()->whereIn('start_user_id', $ids, 'and', $negate);
 }
Example #6
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     $search->getQuery()->where(function ($query) use($negate) {
         if ($negate) {
             $query->whereNull('hide_time')->where('comments_count', '>', 0);
         } else {
             $query->whereNotNull('hide_time')->orWhere('comments_count', 0);
         }
     });
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     // If we've just been provided with a single YYYY-MM-DD date, then find
     // discussions that were started on that exact date. But if we've been
     // provided with a YYYY-MM-DD..YYYY-MM-DD range, then find discussions
     // that were started during that period.
     if (empty($matches[3])) {
         $search->getQuery()->whereDate('start_time', $negate ? '!=' : '=', $matches[1]);
     } else {
         $search->getQuery()->whereBetween('start_time', [$matches[1], $matches[3]], 'and', $negate);
     }
 }
Example #8
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     if (!$search instanceof DiscussionSearch) {
         throw new LogicException('This gambit can only be applied on a DiscussionSearch');
     }
     $actor = $search->getActor();
     if ($actor->exists) {
         $readIds = $this->discussions->getReadIds($actor);
         $search->getQuery()->where(function ($query) use($readIds, $negate, $actor) {
             if (!$negate) {
                 $query->whereNotIn('id', $readIds)->where('last_time', '>', $actor->read_time ?: 0);
             } else {
                 $query->whereIn('id', $readIds)->orWhere('last_time', '<=', $actor->read_time ?: 0);
             }
         });
     }
 }
Example #9
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     $slugs = explode(',', trim($matches[1], '"'));
     // TODO: implement $negate
     $search->getQuery()->where(function ($query) use($slugs) {
         foreach ($slugs as $slug) {
             if ($slug === 'untagged') {
                 $query->orWhereNotExists(function ($query) {
                     $query->select(new Expression(1))->from('discussions_tags')->where('discussions.id', new Expression('discussion_id'));
                 });
             } else {
                 $id = $this->tags->getIdForSlug($slug);
                 $query->orWhereExists(function ($query) use($id) {
                     $query->select(new Expression(1))->from('discussions_tags')->where('discussions.id', new Expression('discussion_id'))->where('tag_id', $id);
                 });
             }
         }
     });
 }
Example #10
0
 /**
  * {@inheritdoc}
  */
 protected function conditions(AbstractSearch $search, array $matches, $negate)
 {
     $search->getQuery()->where('is_sticky', !$negate);
 }
Example #11
0
 /**
  * @param AbstractSearch $search
  * @param string $query
  */
 protected function applyFulltext(AbstractSearch $search, $query)
 {
     if (!$this->fulltextGambit) {
         return;
     }
     $gambit = $this->container->make($this->fulltextGambit);
     $search->addActiveGambit($gambit);
     $gambit->apply($search, $query);
 }
Example #12
0
 /**
  * {@inheritdoc}
  */
 public function apply(AbstractSearch $search, $bit)
 {
     $users = $this->users->getIdsForUsername($bit, $search->getActor());
     $search->getQuery()->whereIn('id', $users);
     $search->setDefaultSort(['id' => $users]);
 }