[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |