mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 13:22:42 +01:00
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
This commit is contained in:
parent
fd60a739c1
commit
c8dc11d81a
3 changed files with 26 additions and 29 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
$likes = array();
|
||||
foreach ($tokens as $token) {
|
||||
$likes[] = qsprintf($conn_r, 'token.token LIKE %>', $token);
|
||||
}
|
||||
|
||||
if ($this->nameTokens !== null) {
|
||||
foreach ($this->nameTokens as $key => $token) {
|
||||
$token_table = 'token_'.$key;
|
||||
$joins[] = qsprintf(
|
||||
$conn_r,
|
||||
'JOIN %T token ON token.projectID = p.id AND (%Q)',
|
||||
'JOIN %T %T ON %T.projectID = p.id AND %T.token LIKE %>',
|
||||
PhabricatorProject::TABLE_DATASOURCE_TOKEN,
|
||||
'('.implode(') OR (', $likes).')');
|
||||
$token_table,
|
||||
$token_table,
|
||||
$token_table,
|
||||
$token);
|
||||
}
|
||||
}
|
||||
|
||||
$joins[] = $this->buildApplicationSearchJoinClause($conn_r);
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue