From 461fc3dadf78ec2ebdb8324c60d8c01e64bb0cc9 Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 3 Oct 2013 12:39:15 -0700 Subject: [PATCH] Add more application query capabilities Summary: Make the application query a little more flexible, and formalize the PHID type. Test Plan: See next diffs. Reviewers: btrahan Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D7201 --- src/__phutil_library_map__.php | 2 + ...bricatorApplicationPHIDTypeApplication.php | 48 +++++++++++++++++++ .../meta/query/PhabricatorAppSearchEngine.php | 3 +- .../query/PhabricatorApplicationQuery.php | 39 ++++++++++++++- 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 767e09800a..75a8571960 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -840,6 +840,7 @@ phutil_register_library_map(array( 'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php', 'PhabricatorApplicationMetaMTA' => 'applications/metamta/application/PhabricatorApplicationMetaMTA.php', 'PhabricatorApplicationOwners' => 'applications/owners/application/PhabricatorApplicationOwners.php', + 'PhabricatorApplicationPHIDTypeApplication' => 'applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php', 'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php', 'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php', 'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php', @@ -2948,6 +2949,7 @@ phutil_register_library_map(array( 'PhabricatorApplicationManiphest' => 'PhabricatorApplication', 'PhabricatorApplicationMetaMTA' => 'PhabricatorApplication', 'PhabricatorApplicationOwners' => 'PhabricatorApplication', + 'PhabricatorApplicationPHIDTypeApplication' => 'PhabricatorPHIDType', 'PhabricatorApplicationPHPAST' => 'PhabricatorApplication', 'PhabricatorApplicationPaste' => 'PhabricatorApplication', 'PhabricatorApplicationPeople' => 'PhabricatorApplication', diff --git a/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php b/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php new file mode 100644 index 0000000000..6554bd717c --- /dev/null +++ b/src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php @@ -0,0 +1,48 @@ +setViewer($query->getViewer()) + ->setParentQuery($query) + ->withPHIDs($phids) + ->execute(); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + foreach ($handles as $phid => $handle) { + $application = $objects[$phid]; + + $handle->setName($application->getName()); + $handle->setURI($application->getApplicationURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} diff --git a/src/applications/meta/query/PhabricatorAppSearchEngine.php b/src/applications/meta/query/PhabricatorAppSearchEngine.php index edafda93e2..9824664948 100644 --- a/src/applications/meta/query/PhabricatorAppSearchEngine.php +++ b/src/applications/meta/query/PhabricatorAppSearchEngine.php @@ -20,7 +20,8 @@ final class PhabricatorAppSearchEngine } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { - $query = id(new PhabricatorApplicationQuery()); + $query = id(new PhabricatorApplicationQuery()) + ->setOrder(PhabricatorApplicationQuery::ORDER_NAME); $name = $saved->getParameter('name'); if (strlen($name)) { diff --git a/src/applications/meta/query/PhabricatorApplicationQuery.php b/src/applications/meta/query/PhabricatorApplicationQuery.php index bfa0361325..c15ece6eb6 100644 --- a/src/applications/meta/query/PhabricatorApplicationQuery.php +++ b/src/applications/meta/query/PhabricatorApplicationQuery.php @@ -8,6 +8,12 @@ final class PhabricatorApplicationQuery private $firstParty; private $nameContains; private $classes; + private $phids; + + const ORDER_APPLICATION = 'order:application'; + const ORDER_NAME = 'order:name'; + + private $order = self::ORDER_APPLICATION; public function withNameContains($name_contains) { $this->nameContains = $name_contains; @@ -34,6 +40,16 @@ final class PhabricatorApplicationQuery return $this; } + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function setOrder($order) { + $this->order = $order; + return $this; + } + public function loadPage() { $apps = PhabricatorApplication::getAllApplications(); @@ -46,6 +62,15 @@ final class PhabricatorApplicationQuery } } + if ($this->phids) { + $phids = array_fuse($this->phids); + foreach ($apps as $key => $app) { + if (empty($phids[$app->getPHID()])) { + unset($apps[$key]); + } + } + } + if (strlen($this->nameContains)) { foreach ($apps as $key => $app) { if (stripos($app->getName(), $this->nameContains) === false) { @@ -78,7 +103,19 @@ final class PhabricatorApplicationQuery } } - return msort($apps, 'getName'); + switch ($this->order) { + case self::ORDER_NAME: + $apps = msort($apps, 'getName'); + break; + case self::ORDER_APPLICATION: + $apps = $apps; + break; + default: + throw new Exception( + pht('Unknown order "%s"!', $this->order)); + } + + return $apps; } }