From 16537f7b322f1ce01261f953a51f5ced3d7ca5df Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 21 May 2019 05:40:11 -0700 Subject: [PATCH] Support filtering feed transactions by object type Summary: Depends on D20533. Allow querying for transactions of a specific object type, so you can run queries like "Show all edits to Herald rules between date X and Y". Test Plan: {F6463478} Reviewers: amckinley Reviewed By: amckinley Differential Revision: https://secure.phabricator.com/D20534 --- src/__phutil_library_map__.php | 2 + .../query/PhabricatorFeedTransactionQuery.php | 24 ++++++- ...PhabricatorFeedTransactionSearchEngine.php | 9 +++ ...icatorTransactionsObjectTypeDatasource.php | 63 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 src/applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index dc331be164..20de984e5a 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -4809,6 +4809,7 @@ phutil_register_library_map(array( 'PhabricatorTransactionsApplication' => 'applications/transactions/application/PhabricatorTransactionsApplication.php', 'PhabricatorTransactionsDestructionEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsDestructionEngineExtension.php', 'PhabricatorTransactionsFulltextEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsFulltextEngineExtension.php', + 'PhabricatorTransactionsObjectTypeDatasource' => 'applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php', 'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php', 'PhabricatorTranslationSetting' => 'applications/settings/setting/PhabricatorTranslationSetting.php', 'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php', @@ -11158,6 +11159,7 @@ phutil_register_library_map(array( 'PhabricatorTransactionsApplication' => 'PhabricatorApplication', 'PhabricatorTransactionsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorTransactionsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorTransactionsObjectTypeDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorTransformedFile' => 'PhabricatorFileDAO', 'PhabricatorTranslationSetting' => 'PhabricatorOptionGroupSetting', 'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', diff --git a/src/applications/feed/query/PhabricatorFeedTransactionQuery.php b/src/applications/feed/query/PhabricatorFeedTransactionQuery.php index e7ab4cc55d..ba25f0842d 100644 --- a/src/applications/feed/query/PhabricatorFeedTransactionQuery.php +++ b/src/applications/feed/query/PhabricatorFeedTransactionQuery.php @@ -5,6 +5,7 @@ final class PhabricatorFeedTransactionQuery private $phids; private $authorPHIDs; + private $objectTypes; private $createdMin; private $createdMax; @@ -18,6 +19,11 @@ final class PhabricatorFeedTransactionQuery return $this; } + public function withObjectTypes(array $types) { + $this->objectTypes = $types; + return $this; + } + public function withDateCreatedBetween($min, $max) { $this->createdMin = $min; $this->createdMax = $max; @@ -158,12 +164,24 @@ final class PhabricatorFeedTransactionQuery } } + $object_types = $this->objectTypes; + if ($object_types) { + $object_types = array_fuse($object_types); + } + $results = array(); foreach ($queries as $query) { + $query_type = $query->getTemplateApplicationTransaction() + ->getApplicationTransactionType(); + if ($type_map) { - $type = $query->getTemplateApplicationTransaction() - ->getApplicationTransactionType(); - if (!isset($type_map[$type])) { + if (!isset($type_map[$query_type])) { + continue; + } + } + + if ($object_types) { + if (!isset($object_types[$query_type])) { continue; } } diff --git a/src/applications/feed/query/PhabricatorFeedTransactionSearchEngine.php b/src/applications/feed/query/PhabricatorFeedTransactionSearchEngine.php index 5c73818e4d..af40b6ff6b 100644 --- a/src/applications/feed/query/PhabricatorFeedTransactionSearchEngine.php +++ b/src/applications/feed/query/PhabricatorFeedTransactionSearchEngine.php @@ -21,6 +21,11 @@ final class PhabricatorFeedTransactionSearchEngine ->setLabel(pht('Authors')) ->setKey('authorPHIDs') ->setAliases(array('author', 'authors')), + id(new PhabricatorSearchDatasourceField()) + ->setLabel(pht('Object Types')) + ->setKey('objectTypes') + ->setAliases(array('objectType')) + ->setDatasource(new PhabricatorTransactionsObjectTypeDatasource()), id(new PhabricatorSearchDateField()) ->setLabel(pht('Created After')) ->setKey('createdStart'), @@ -37,6 +42,10 @@ final class PhabricatorFeedTransactionSearchEngine $query->withAuthorPHIDs($map['authorPHIDs']); } + if ($map['objectTypes']) { + $query->withObjectTypes($map['objectTypes']); + } + $created_min = $map['createdStart']; $created_max = $map['createdEnd']; diff --git a/src/applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php b/src/applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php new file mode 100644 index 0000000000..e7292fc522 --- /dev/null +++ b/src/applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php @@ -0,0 +1,63 @@ +renderTokensFromResults($this->buildResults(), $values); + } + + public function loadResults() { + $results = $this->buildResults(); + return $this->filterResultsAgainstTokens($results); + } + + private function buildResults() { + $queries = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorApplicationTransactionQuery') + ->execute(); + + $phid_types = PhabricatorPHIDType::getAllTypes(); + + $results = array(); + foreach ($queries as $query) { + $query_type = $query->getTemplateApplicationTransaction() + ->getApplicationTransactionType(); + + $phid_type = idx($phid_types, $query_type); + + if ($phid_type) { + $name = $phid_type->getTypeName(); + $icon = $phid_type->getTypeIcon(); + } else { + $name = pht('%s ("%s")', $query_type, get_class($query)); + $icon = null; + } + + $result = id(new PhabricatorTypeaheadResult()) + ->setName($name) + ->setPHID($query_type); + + if ($icon) { + $result->setIcon($icon); + } + + $results[$query_type] = $result; + } + + return $results; + } + +}