@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add an anyone() typeahead function for matching any document owner

Summary: Fixes T5733.

Test Plan: Ran search and Maniphest queries.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T5733

Differential Revision: https://secure.phabricator.com/D12535

+119 -24
+2
src/__phutil_library_map__.php
··· 2188 2188 'PhabricatorPasteTransactionQuery' => 'applications/paste/query/PhabricatorPasteTransactionQuery.php', 2189 2189 'PhabricatorPasteViewController' => 'applications/paste/controller/PhabricatorPasteViewController.php', 2190 2190 'PhabricatorPathSetupCheck' => 'applications/config/check/PhabricatorPathSetupCheck.php', 2191 + 'PhabricatorPeopleAnyOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php', 2191 2192 'PhabricatorPeopleApplication' => 'applications/people/application/PhabricatorPeopleApplication.php', 2192 2193 'PhabricatorPeopleApproveController' => 'applications/people/controller/PhabricatorPeopleApproveController.php', 2193 2194 'PhabricatorPeopleCalendarController' => 'applications/people/controller/PhabricatorPeopleCalendarController.php', ··· 5560 5561 'PhabricatorPasteTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5561 5562 'PhabricatorPasteViewController' => 'PhabricatorPasteController', 5562 5563 'PhabricatorPathSetupCheck' => 'PhabricatorSetupCheck', 5564 + 'PhabricatorPeopleAnyOwnerDatasource' => 'PhabricatorTypeaheadDatasource', 5563 5565 'PhabricatorPeopleApplication' => 'PhabricatorApplication', 5564 5566 'PhabricatorPeopleApproveController' => 'PhabricatorPeopleController', 5565 5567 'PhabricatorPeopleCalendarController' => 'PhabricatorPeopleController',
+28 -21
src/applications/maniphest/query/ManiphestTaskQuery.php
··· 10 10 private $taskPHIDs = array(); 11 11 private $authorPHIDs = array(); 12 12 private $ownerPHIDs = array(); 13 - private $includeUnowned = null; 13 + private $noOwner; 14 + private $anyOwner; 14 15 private $subscriberPHIDs = array(); 15 16 private $dateCreatedAfter; 16 17 private $dateCreatedBefore; ··· 70 71 71 72 public function withOwners(array $owners) { 72 73 $no_owner = PhabricatorPeopleNoOwnerDatasource::FUNCTION_TOKEN; 74 + $any_owner = PhabricatorPeopleAnyOwnerDatasource::FUNCTION_TOKEN; 73 75 74 - $this->includeUnowned = false; 75 76 foreach ($owners as $k => $phid) { 76 77 if ($phid === $no_owner || $phid === null) { 77 - $this->includeUnowned = true; 78 + $this->noOwner = true; 79 + unset($owners[$k]); 80 + break; 81 + } 82 + if ($phid === $any_owner) { 83 + $this->anyOwner = true; 78 84 unset($owners[$k]); 79 85 break; 80 86 } ··· 512 518 } 513 519 514 520 private function buildOwnerWhereClause(AphrontDatabaseConnection $conn) { 515 - if (!$this->ownerPHIDs) { 516 - if ($this->includeUnowned === null) { 517 - return null; 518 - } else if ($this->includeUnowned) { 519 - return qsprintf( 520 - $conn, 521 - 'task.ownerPHID IS NULL'); 522 - } else { 523 - return qsprintf( 524 - $conn, 525 - 'task.ownerPHID IS NOT NULL'); 526 - } 521 + $subclause = array(); 522 + 523 + if ($this->noOwner) { 524 + $subclause[] = qsprintf( 525 + $conn, 526 + 'task.ownerPHID IS NULL'); 527 527 } 528 528 529 - if ($this->includeUnowned) { 530 - return qsprintf( 529 + if ($this->anyOwner) { 530 + $subclause[] = qsprintf( 531 531 $conn, 532 - 'task.ownerPHID IN (%Ls) OR task.ownerPHID IS NULL', 533 - $this->ownerPHIDs); 534 - } else { 535 - return qsprintf( 532 + 'task.ownerPHID IS NOT NULL'); 533 + } 534 + 535 + if ($this->ownerPHIDs) { 536 + $subclause[] = qsprintf( 536 537 $conn, 537 538 'task.ownerPHID IN (%Ls)', 538 539 $this->ownerPHIDs); 539 540 } 541 + 542 + if (!$subclause) { 543 + return ''; 544 + } 545 + 546 + return '('.implode(') OR (', $subclause).')'; 540 547 } 541 548 542 549 private function buildFullTextWhereClause(AphrontDatabaseConnection $conn) {
+68
src/applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php
··· 1 + <?php 2 + 3 + final class PhabricatorPeopleAnyOwnerDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + const FUNCTION_TOKEN = 'anyone()'; 7 + 8 + public function getBrowseTitle() { 9 + return pht('Browse Any Owner'); 10 + } 11 + 12 + public function getPlaceholderText() { 13 + return pht('Type "anyone()"...'); 14 + } 15 + 16 + public function getDatasourceApplicationClass() { 17 + return 'PhabricatorPeopleApplication'; 18 + } 19 + 20 + public function getDatasourceFunctions() { 21 + return array( 22 + 'anyone' => array( 23 + 'name' => pht('Anyone'), 24 + 'summary' => pht('Find results which are assigned to anyone.'), 25 + 'description' => pht( 26 + 'This function includes results which have any owner. It excludes '. 27 + 'unassigned or unowned results.'), 28 + ), 29 + ); 30 + } 31 + 32 + public function loadResults() { 33 + $results = array( 34 + $this->buildAnyoneResult(), 35 + ); 36 + return $this->filterResultsAgainstTokens($results); 37 + } 38 + 39 + protected function evaluateFunction($function, array $argv_list) { 40 + $results = array(); 41 + 42 + foreach ($argv_list as $argv) { 43 + $results[] = self::FUNCTION_TOKEN; 44 + } 45 + 46 + return $results; 47 + } 48 + 49 + public function renderFunctionTokens($function, array $argv_list) { 50 + $results = array(); 51 + foreach ($argv_list as $argv) { 52 + $results[] = PhabricatorTypeaheadTokenView::newFromTypeaheadResult( 53 + $this->buildAnyoneResult()); 54 + } 55 + return $results; 56 + } 57 + 58 + private function buildAnyoneResult() { 59 + $name = pht('Any Owner'); 60 + return $this->newFunctionResult() 61 + ->setName($name.' anyone') 62 + ->setDisplayName($name) 63 + ->setIcon('fa-certificate') 64 + ->setPHID(self::FUNCTION_TOKEN) 65 + ->setUnique(true); 66 + } 67 + 68 + }
+1
src/applications/people/typeahead/PhabricatorPeopleOwnerDatasource.php
··· 15 15 return array( 16 16 new PhabricatorViewerDatasource(), 17 17 new PhabricatorPeopleNoOwnerDatasource(), 18 + new PhabricatorPeopleAnyOwnerDatasource(), 18 19 new PhabricatorPeopleDatasource(), 19 20 new PhabricatorProjectMembersDatasource(), 20 21 );
+8 -2
src/applications/search/engine/PhabricatorSearchEngineElastic.php
··· 125 125 $relationship_map = array( 126 126 PhabricatorSearchRelationship::RELATIONSHIP_AUTHOR => 127 127 $query->getParameter('authorPHIDs', array()), 128 - PhabricatorSearchRelationship::RELATIONSHIP_OWNER => 129 - $query->getParameter('ownerPHIDs', array()), 130 128 PhabricatorSearchRelationship::RELATIONSHIP_SUBSCRIBER => 131 129 $query->getParameter('subscriberPHIDs', array()), 132 130 PhabricatorSearchRelationship::RELATIONSHIP_PROJECT => ··· 153 151 154 152 if ($query->getParameter('withUnowned')) { 155 153 $relationship_map[$rel_unowned] = true; 154 + } 155 + 156 + $rel_owner = PhabricatorSearchRelationship::RELATIONSHIP_OWNER; 157 + if ($query->getParameter('withAnyOwner')) { 158 + $relationship_map[$rel_owner] = true; 159 + } else { 160 + $owner_phids = $query->getParameter('ownerPHIDs', array()); 161 + $relationship_map[$rel_owner] = $owner_phids; 156 162 } 157 163 158 164 foreach ($relationship_map as $field => $param) {
+8 -1
src/applications/search/engine/PhabricatorSearchEngineMySQL.php
··· 231 231 true); 232 232 } 233 233 234 - if ($query->getParameter('withUnowned')) { 234 + if ($query->getParameter('withAnyOwner')) { 235 + $join[] = $this->joinRelationship( 236 + $conn_r, 237 + $query, 238 + 'withAnyOwner', 239 + PhabricatorSearchRelationship::RELATIONSHIP_OWNER, 240 + true); 241 + } else if ($query->getParameter('withUnowned')) { 235 242 $join[] = $this->joinRelationship( 236 243 $conn_r, 237 244 $query,
+4
src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php
··· 58 58 $config->setParameter('withUnowned', true); 59 59 unset($owner_phids[$key]); 60 60 } 61 + if ($phid == PhabricatorPeopleAnyOwnerDatasource::FUNCTION_TOKEN) { 62 + $config->setParameter('withAnyOwner', true); 63 + unset($owner_phids[$key]); 64 + } 61 65 } 62 66 $config->setParameter('ownerPHIDs', $owner_phids); 63 67