Path: blob/master/src/applications/feed/query/PhabricatorFeedSearchEngine.php
12242 views
<?php12final class PhabricatorFeedSearchEngine3extends PhabricatorApplicationSearchEngine {45public function getResultTypeDescription() {6return pht('Feed Stories');7}89public function getApplicationClassName() {10return 'PhabricatorFeedApplication';11}1213public function newQuery() {14return new PhabricatorFeedQuery();15}1617protected function shouldShowOrderField() {18return false;19}2021protected function buildCustomSearchFields() {22return array(23id(new PhabricatorUsersSearchField())24->setLabel(pht('Include Users'))25->setKey('userPHIDs'),26// NOTE: This query is not executed with EdgeLogic, so we can't use27// a fancy logical datasource.28id(new PhabricatorSearchDatasourceField())29->setDatasource(new PhabricatorProjectDatasource())30->setLabel(pht('Include Projects'))31->setKey('projectPHIDs'),32id(new PhabricatorSearchDateControlField())33->setLabel(pht('Occurs After'))34->setKey('rangeStart'),35id(new PhabricatorSearchDateControlField())36->setLabel(pht('Occurs Before'))37->setKey('rangeEnd'),3839// NOTE: This is a legacy field retained only for backward40// compatibility. If the projects field used EdgeLogic, we could use41// `viewerprojects()` to execute an equivalent query.42id(new PhabricatorSearchCheckboxesField())43->setKey('viewerProjects')44->setOptions(45array(46'self' => pht('Include stories about projects I am a member of.'),47)),48);49}5051protected function buildQueryFromParameters(array $map) {52$query = $this->newQuery();5354$phids = array();55if ($map['userPHIDs']) {56$phids += array_fuse($map['userPHIDs']);57}5859if ($map['projectPHIDs']) {60$phids += array_fuse($map['projectPHIDs']);61}6263// NOTE: This value may be `true` for older saved queries, or64// `array('self')` for newer ones.65$viewer_projects = $map['viewerProjects'];66if ($viewer_projects) {67$viewer = $this->requireViewer();68$projects = id(new PhabricatorProjectQuery())69->setViewer($viewer)70->withMemberPHIDs(array($viewer->getPHID()))71->execute();72$phids += array_fuse(mpull($projects, 'getPHID'));73}7475if ($phids) {76$query->withFilterPHIDs($phids);77}7879$range_min = $map['rangeStart'];80if ($range_min) {81$range_min = $range_min->getEpoch();82}8384$range_max = $map['rangeEnd'];85if ($range_max) {86$range_max = $range_max->getEpoch();87}8889if ($range_min && $range_max) {90if ($range_min > $range_max) {91throw new PhabricatorSearchConstraintException(92pht(93'The specified "Occurs Before" date is earlier in time than the '.94'specified "Occurs After" date, so this query can never match '.95'any results.'));96}97}9899if ($range_min || $range_max) {100$query->withEpochInRange($range_min, $range_max);101}102103return $query;104}105106protected function getURI($path) {107return '/feed/'.$path;108}109110protected function getBuiltinQueryNames() {111$names = array(112'all' => pht('All Stories'),113);114115if ($this->requireViewer()->isLoggedIn()) {116$names['projects'] = pht('Tags');117}118119return $names;120}121122public function buildSavedQueryFromBuiltin($query_key) {123124$query = $this->newSavedQuery();125$query->setQueryKey($query_key);126127switch ($query_key) {128case 'all':129return $query;130case 'projects':131return $query->setParameter('viewerProjects', array('self'));132}133134return parent::buildSavedQueryFromBuiltin($query_key);135}136137protected function renderResultList(138array $objects,139PhabricatorSavedQuery $query,140array $handles) {141142$builder = new PhabricatorFeedBuilder($objects);143144if ($this->isPanelContext()) {145$builder->setShowHovercards(false);146} else {147$builder->setShowHovercards(true);148}149150$builder->setUser($this->requireViewer());151$view = $builder->buildView();152153$list = phutil_tag_div('phabricator-feed-frame', $view);154155$result = new PhabricatorApplicationSearchResultView();156$result->setContent($list);157158return $result;159}160161}162163164