From c8dc11d81a7577ee0eb707f32867e99086c4617e Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 15 Apr 2015 11:49:07 -0700 Subject: [PATCH] Improve browsability of Projects query Summary: Ref T5750. Same deal as D12427, but for projects. (As before, mostly making the empty/browse view work instead of return nothing.) Test Plan: {F372353} Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T5750 Differential Revision: https://secure.phabricator.com/D12428 --- .../project/query/PhabricatorProjectQuery.php | 35 ++++++++----------- .../query/PhabricatorProjectSearchEngine.php | 3 +- .../PhabricatorProjectDatasource.php | 17 ++++----- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/applications/project/query/PhabricatorProjectQuery.php b/src/applications/project/query/PhabricatorProjectQuery.php index 1dfc466712..4b6ad566a7 100644 --- a/src/applications/project/query/PhabricatorProjectQuery.php +++ b/src/applications/project/query/PhabricatorProjectQuery.php @@ -9,7 +9,7 @@ final class PhabricatorProjectQuery private $slugs; private $phrictionSlugs; private $names; - private $datasourceQuery; + private $nameTokens; private $icons; private $colors; @@ -60,8 +60,8 @@ final class PhabricatorProjectQuery return $this; } - public function withDatasourceQuery($string) { - $this->datasourceQuery = $string; + public function withNameTokens(array $tokens) { + $this->nameTokens = array_values($tokens); return $this; } @@ -329,7 +329,7 @@ final class PhabricatorProjectQuery } private function buildGroupClause($conn_r) { - if ($this->memberPHIDs || $this->datasourceQuery) { + if ($this->memberPHIDs || $this->nameTokens) { return 'GROUP BY p.id'; } else { return $this->buildApplicationSearchGroupClause($conn_r); @@ -363,23 +363,18 @@ final class PhabricatorProjectQuery id(new PhabricatorProjectSlug())->getTableName()); } - if ($this->datasourceQuery !== null) { - $tokens = PhabricatorTypeaheadDatasource::tokenizeString( - $this->datasourceQuery); - if (!$tokens) { - throw new PhabricatorEmptyQueryException(); + if ($this->nameTokens !== null) { + foreach ($this->nameTokens as $key => $token) { + $token_table = 'token_'.$key; + $joins[] = qsprintf( + $conn_r, + 'JOIN %T %T ON %T.projectID = p.id AND %T.token LIKE %>', + PhabricatorProject::TABLE_DATASOURCE_TOKEN, + $token_table, + $token_table, + $token_table, + $token); } - - $likes = array(); - foreach ($tokens as $token) { - $likes[] = qsprintf($conn_r, 'token.token LIKE %>', $token); - } - - $joins[] = qsprintf( - $conn_r, - 'JOIN %T token ON token.projectID = p.id AND (%Q)', - PhabricatorProject::TABLE_DATASOURCE_TOKEN, - '('.implode(') OR (', $likes).')'); } $joins[] = $this->buildApplicationSearchJoinClause($conn_r); diff --git a/src/applications/project/query/PhabricatorProjectSearchEngine.php b/src/applications/project/query/PhabricatorProjectSearchEngine.php index ff2b1c790f..66462d5ecc 100644 --- a/src/applications/project/query/PhabricatorProjectSearchEngine.php +++ b/src/applications/project/query/PhabricatorProjectSearchEngine.php @@ -55,7 +55,8 @@ final class PhabricatorProjectSearchEngine $name = $saved->getParameter('name'); if (strlen($name)) { - $query->withDatasourceQuery($name); + $tokens = PhabricatorTypeaheadDatasource::tokenizeString($name); + $query->withNameTokens($tokens); } $icons = $saved->getParameter('icons'); diff --git a/src/applications/project/typeahead/PhabricatorProjectDatasource.php b/src/applications/project/typeahead/PhabricatorProjectDatasource.php index 4b31e4bc80..9b92c66620 100644 --- a/src/applications/project/typeahead/PhabricatorProjectDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectDatasource.php @@ -18,17 +18,18 @@ final class PhabricatorProjectDatasource // Allow users to type "#qa" or "qa" to find "Quality Assurance". $raw_query = ltrim($raw_query, '#'); + $tokens = self::tokenizeString($raw_query); - if (!strlen($raw_query)) { - return array(); + $query = id(new PhabricatorProjectQuery()) + ->needImages(true) + ->needSlugs(true); + + if ($tokens) { + $query->withNameTokens($tokens); } - $projs = id(new PhabricatorProjectQuery()) - ->setViewer($viewer) - ->needImages(true) - ->needSlugs(true) - ->withDatasourceQuery($raw_query) - ->execute(); + $projs = $this->executeQuery($query); + $projs = mpull($projs, null, 'getPHID'); $must_have_cols = $this->getParameter('mustHaveColumns', false);