2017-11-30 15:07:49 +00:00
|
|
|
<?php
|
|
|
|
|
2018-02-14 15:33:19 -08:00
|
|
|
final class ProjectDatasourceEngineExtension
|
|
|
|
extends PhabricatorDatasourceEngineExtension {
|
2017-11-30 15:07:49 +00:00
|
|
|
|
|
|
|
public function newQuickSearchDatasources() {
|
|
|
|
return array(
|
|
|
|
new PhabricatorProjectDatasource(),
|
|
|
|
);
|
|
|
|
}
|
2018-02-14 15:49:00 -08:00
|
|
|
|
|
|
|
public function newJumpURI($query) {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
|
|
|
// Send "p" to Projects.
|
|
|
|
if (preg_match('/^p\z/i', $query)) {
|
|
|
|
return '/diffusion/';
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send "p <string>" to a search for similar projects.
|
|
|
|
$matches = null;
|
|
|
|
if (preg_match('/^p\s+(.+)\z/i', $query, $matches)) {
|
|
|
|
$raw_query = $matches[1];
|
|
|
|
|
|
|
|
$engine = id(new PhabricatorProject())
|
|
|
|
->newFerretEngine();
|
|
|
|
|
|
|
|
$compiler = id(new PhutilSearchQueryCompiler())
|
|
|
|
->setEnableFunctions(true);
|
|
|
|
|
|
|
|
$raw_tokens = $compiler->newTokens($raw_query);
|
|
|
|
|
|
|
|
$fulltext_tokens = array();
|
|
|
|
foreach ($raw_tokens as $raw_token) {
|
|
|
|
$fulltext_token = id(new PhabricatorFulltextToken())
|
|
|
|
->setToken($raw_token);
|
|
|
|
$fulltext_tokens[] = $fulltext_token;
|
|
|
|
}
|
|
|
|
|
|
|
|
$projects = id(new PhabricatorProjectQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withFerretConstraint($engine, $fulltext_tokens)
|
|
|
|
->execute();
|
|
|
|
if (count($projects) == 1) {
|
|
|
|
// Just one match, jump to project.
|
|
|
|
return head($projects)->getURI();
|
|
|
|
} else {
|
|
|
|
// More than one match, jump to search.
|
|
|
|
return urisprintf(
|
|
|
|
'/project/?order=relevance&query=%s#R',
|
|
|
|
$raw_query);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
2017-11-30 15:07:49 +00:00
|
|
|
}
|