[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/search/query/ -> PhabricatorSearchApplicationSearchEngine.php (source)

   1  <?php
   2  
   3  final class PhabricatorSearchApplicationSearchEngine
   4    extends PhabricatorApplicationSearchEngine {
   5  
   6    public function getResultTypeDescription() {
   7      return pht('Fulltext Results');
   8    }
   9  
  10    public function getApplicationClassName() {
  11      return 'PhabricatorSearchApplication';
  12    }
  13  
  14    public function buildSavedQueryFromRequest(AphrontRequest $request) {
  15      $saved = new PhabricatorSavedQuery();
  16  
  17      $saved->setParameter('query', $request->getStr('query'));
  18      $saved->setParameter(
  19        'statuses',
  20        $this->readListFromRequest($request, 'statuses'));
  21      $saved->setParameter(
  22        'types',
  23        $this->readListFromRequest($request, 'types'));
  24  
  25      $saved->setParameter(
  26        'authorPHIDs',
  27        $this->readUsersFromRequest($request, 'authorPHIDs'));
  28  
  29      $saved->setParameter(
  30        'ownerPHIDs',
  31        $this->readUsersFromRequest($request, 'ownerPHIDs'));
  32  
  33      $saved->setParameter(
  34        'withUnowned',
  35        $this->readBoolFromRequest($request, 'withUnowned'));
  36  
  37      $saved->setParameter(
  38        'subscriberPHIDs',
  39        $this->readPHIDsFromRequest($request, 'subscriberPHIDs'));
  40  
  41      $saved->setParameter(
  42        'projectPHIDs',
  43        $this->readPHIDsFromRequest($request, 'projectPHIDs'));
  44  
  45      return $saved;
  46    }
  47  
  48    public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
  49      $query = id(new PhabricatorSearchDocumentQuery())
  50        ->withSavedQuery($saved);
  51      return $query;
  52    }
  53  
  54    public function buildSearchForm(
  55      AphrontFormView $form,
  56      PhabricatorSavedQuery $saved) {
  57  
  58      $options = array();
  59      $author_value = null;
  60      $owner_value = null;
  61      $subscribers_value = null;
  62      $project_value = null;
  63  
  64      $author_phids = $saved->getParameter('authorPHIDs', array());
  65      $owner_phids = $saved->getParameter('ownerPHIDs', array());
  66      $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
  67      $project_phids = $saved->getParameter('projectPHIDs', array());
  68  
  69      $all_phids = array_merge(
  70        $author_phids,
  71        $owner_phids,
  72        $subscriber_phids,
  73        $project_phids);
  74  
  75      $all_handles = id(new PhabricatorHandleQuery())
  76        ->setViewer($this->requireViewer())
  77        ->withPHIDs($all_phids)
  78        ->execute();
  79  
  80      $author_handles = array_select_keys($all_handles, $author_phids);
  81      $owner_handles = array_select_keys($all_handles, $owner_phids);
  82      $subscriber_handles = array_select_keys($all_handles, $subscriber_phids);
  83      $project_handles = array_select_keys($all_handles, $project_phids);
  84  
  85      $with_unowned = $saved->getParameter('withUnowned', array());
  86  
  87      $status_values = $saved->getParameter('statuses', array());
  88      $status_values = array_fuse($status_values);
  89  
  90      $statuses = array(
  91        PhabricatorSearchRelationship::RELATIONSHIP_OPEN => pht('Open'),
  92        PhabricatorSearchRelationship::RELATIONSHIP_CLOSED => pht('Closed'),
  93      );
  94      $status_control = id(new AphrontFormCheckboxControl())
  95        ->setLabel(pht('Document Status'));
  96      foreach ($statuses as $status => $name) {
  97        $status_control->addCheckbox(
  98          'statuses[]',
  99          $status,
 100          $name,
 101          isset($status_values[$status]));
 102      }
 103  
 104      $type_values = $saved->getParameter('types', array());
 105      $type_values = array_fuse($type_values);
 106  
 107      $types = self::getIndexableDocumentTypes($this->requireViewer());
 108  
 109      $types_control = id(new AphrontFormCheckboxControl())
 110        ->setLabel(pht('Document Types'));
 111      foreach ($types as $type => $name) {
 112        $types_control->addCheckbox(
 113          'types[]',
 114          $type,
 115          $name,
 116          isset($type_values[$type]));
 117      }
 118  
 119      $form
 120        ->appendChild(
 121          phutil_tag(
 122            'input',
 123            array(
 124              'type' => 'hidden',
 125              'name' => 'jump',
 126              'value' => 'no',
 127            )))
 128        ->appendChild(
 129          id(new AphrontFormTextControl())
 130            ->setLabel('Query')
 131            ->setName('query')
 132            ->setValue($saved->getParameter('query')))
 133        ->appendChild($status_control)
 134        ->appendChild($types_control)
 135        ->appendChild(
 136          id(new AphrontFormTokenizerControl())
 137            ->setName('authorPHIDs')
 138            ->setLabel('Authors')
 139            ->setDatasource(new PhabricatorPeopleDatasource())
 140            ->setValue($author_handles))
 141        ->appendChild(
 142          id(new AphrontFormTokenizerControl())
 143            ->setName('ownerPHIDs')
 144            ->setLabel('Owners')
 145            ->setDatasource(new PhabricatorTypeaheadOwnerDatasource())
 146            ->setValue($owner_handles))
 147        ->appendChild(
 148          id(new AphrontFormCheckboxControl())
 149            ->addCheckbox(
 150              'withUnowned',
 151              1,
 152              pht('Show only unowned documents.'),
 153              $with_unowned))
 154        ->appendChild(
 155          id(new AphrontFormTokenizerControl())
 156            ->setName('subscriberPHIDs')
 157            ->setLabel('Subscribers')
 158            ->setDatasource(new PhabricatorPeopleDatasource())
 159            ->setValue($subscriber_handles))
 160        ->appendChild(
 161          id(new AphrontFormTokenizerControl())
 162            ->setName('projectPHIDs')
 163            ->setLabel('In Any Project')
 164            ->setDatasource(new PhabricatorProjectDatasource())
 165            ->setValue($project_handles));
 166    }
 167  
 168    protected function getURI($path) {
 169      return '/search/'.$path;
 170    }
 171  
 172    public function getBuiltinQueryNames() {
 173      return array(
 174        'all' => pht('All Documents'),
 175        'open' => pht('Open Documents'),
 176        'open-tasks' => pht('Open Tasks'),
 177      );
 178    }
 179  
 180    public function buildSavedQueryFromBuiltin($query_key) {
 181      $query = $this->newSavedQuery();
 182      $query->setQueryKey($query_key);
 183  
 184      switch ($query_key) {
 185        case 'all':
 186          return $query;
 187        case 'open':
 188          return $query->setParameter('statuses', array('open'));
 189        case 'open-tasks':
 190          return $query
 191            ->setParameter('statuses', array('open'))
 192            ->setParameter('types', array(ManiphestTaskPHIDType::TYPECONST));
 193      }
 194  
 195      return parent::buildSavedQueryFromBuiltin($query_key);
 196    }
 197  
 198    public static function getIndexableDocumentTypes(
 199      PhabricatorUser $viewer = null) {
 200  
 201      // TODO: This is inelegant and not very efficient, but gets us reasonable
 202      // results. It would be nice to do this more elegantly.
 203  
 204      $indexers = id(new PhutilSymbolLoader())
 205        ->setAncestorClass('PhabricatorSearchDocumentIndexer')
 206        ->loadObjects();
 207  
 208      if ($viewer) {
 209        $types = PhabricatorPHIDType::getAllInstalledTypes($viewer);
 210      } else {
 211        $types = PhabricatorPHIDType::getAllTypes();
 212      }
 213  
 214      $results = array();
 215      foreach ($types as $type) {
 216        $typeconst = $type->getTypeConstant();
 217        foreach ($indexers as $indexer) {
 218          $fake_phid = 'PHID-'.$typeconst.'-fake';
 219          if ($indexer->shouldIndexDocumentByPHID($fake_phid)) {
 220            $results[$typeconst] = $type->getTypeName();
 221          }
 222        }
 223      }
 224  
 225      asort($results);
 226  
 227      // Put tasks first, see T4606.
 228      $results = array_select_keys(
 229        $results,
 230        array(
 231          ManiphestTaskPHIDType::TYPECONST,
 232        )) + $results;
 233  
 234      return $results;
 235    }
 236  
 237    public function shouldUseOffsetPaging() {
 238      return true;
 239    }
 240  
 241    protected function renderResultList(
 242      array $results,
 243      PhabricatorSavedQuery $query,
 244      array $handles) {
 245  
 246      $viewer = $this->requireViewer();
 247  
 248      if ($results) {
 249        $objects = id(new PhabricatorObjectQuery())
 250          ->setViewer($viewer)
 251          ->withPHIDs(mpull($results, 'getPHID'))
 252          ->execute();
 253  
 254        $output = array();
 255        foreach ($results as $phid => $handle) {
 256          $view = id(new PhabricatorSearchResultView())
 257            ->setHandle($handle)
 258            ->setQuery($query)
 259            ->setObject(idx($objects, $phid));
 260          $output[] = $view->render();
 261        }
 262  
 263        $results = phutil_tag_div(
 264          'phabricator-search-result-list',
 265          $output);
 266      } else {
 267        $results = phutil_tag_div(
 268          'phabricator-search-result-list',
 269          phutil_tag(
 270            'p',
 271            array('class' => 'phabricator-search-no-results'),
 272            pht('No search results.')));
 273      }
 274  
 275      return id(new PHUIBoxView())
 276        ->addMargin(PHUI::MARGIN_LARGE)
 277        ->addPadding(PHUI::PADDING_LARGE)
 278        ->setBorder(true)
 279        ->appendChild($results)
 280        ->addClass('phabricator-search-result-box');
 281    }
 282  
 283  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1