mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-30 10:42:41 +01:00
Make Diviner's "advanced search" a little less derp
Summary: Ref T988. This layout got mucked up a while ago, restore it to some semblance of sanity and give it a couple of basic search options. Test Plan: Searched for stuff. Woooo~~ Reviewers: btrahan, chad Reviewed By: chad CC: aran Maniphest Tasks: T988 Differential Revision: https://secure.phabricator.com/D8419
This commit is contained in:
parent
81d381f69d
commit
867dae9414
5 changed files with 98 additions and 2 deletions
|
@ -403,6 +403,17 @@ final class DivinerAtom {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getAllTypes() {
|
||||||
|
return array(
|
||||||
|
self::TYPE_FILE,
|
||||||
|
self::TYPE_FUNCTION,
|
||||||
|
self::TYPE_CLASS,
|
||||||
|
self::TYPE_ARTICLE,
|
||||||
|
self::TYPE_METHOD,
|
||||||
|
self::TYPE_INTERFACE,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getAtomTypeNameString($type) {
|
public static function getAtomTypeNameString($type) {
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case self::TYPE_FILE:
|
case self::TYPE_FILE:
|
||||||
|
|
|
@ -199,6 +199,10 @@ final class DivinerAtomRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function normalizeTitleString($str) {
|
public static function normalizeTitleString($str) {
|
||||||
|
// Remove colons from titles. This is mostly to accommodate legacy rules
|
||||||
|
// from the old Diviner, which generated a significant number of article
|
||||||
|
// URIs without colons present in the titles.
|
||||||
|
$str = str_replace(':', '', $str);
|
||||||
$str = self::normalizeString($str);
|
$str = self::normalizeString($str);
|
||||||
return phutil_utf8_strtolower($str);
|
return phutil_utf8_strtolower($str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,29 @@ final class DivinerAtomListController extends DivinerController
|
||||||
public function renderResultsList(
|
public function renderResultsList(
|
||||||
array $symbols,
|
array $symbols,
|
||||||
PhabricatorSavedQuery $query) {
|
PhabricatorSavedQuery $query) {
|
||||||
return $this->renderAtomList($symbols);
|
|
||||||
|
assert_instances_of($symbols, 'DivinerLiveSymbol');
|
||||||
|
|
||||||
|
$request = $this->getRequest();
|
||||||
|
$viewer = $request->getUser();
|
||||||
|
|
||||||
|
$list = id(new PHUIObjectItemListView())
|
||||||
|
->setUser($viewer);
|
||||||
|
|
||||||
|
foreach ($symbols as $symbol) {
|
||||||
|
$type = $symbol->getType();
|
||||||
|
$type_name = DivinerAtom::getAtomTypeNameString($type);
|
||||||
|
|
||||||
|
$item = id(new PHUIObjectItemView())
|
||||||
|
->setHeader($symbol->getTitle())
|
||||||
|
->setHref($symbol->getURI())
|
||||||
|
->addAttribute($symbol->getSummary())
|
||||||
|
->addIcon('none', $type_name);
|
||||||
|
|
||||||
|
$list->addItem($item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $list;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ final class DivinerAtomQuery
|
||||||
private $includeGhosts;
|
private $includeGhosts;
|
||||||
private $nodeHashes;
|
private $nodeHashes;
|
||||||
private $titles;
|
private $titles;
|
||||||
|
private $nameContains;
|
||||||
|
|
||||||
private $needAtoms;
|
private $needAtoms;
|
||||||
private $needExtends;
|
private $needExtends;
|
||||||
|
@ -64,6 +65,11 @@ final class DivinerAtomQuery
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function withNameContains($text) {
|
||||||
|
$this->nameContains = $text;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function needAtoms($need) {
|
public function needAtoms($need) {
|
||||||
$this->needAtoms = $need;
|
$this->needAtoms = $need;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -361,6 +367,17 @@ final class DivinerAtomQuery
|
||||||
$this->nodeHashes);
|
$this->nodeHashes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->nameContains) {
|
||||||
|
// NOTE: This CONVERT() call makes queries case-insensitive, since the
|
||||||
|
// column has binary collation. Eventually, this should move into
|
||||||
|
// fulltext.
|
||||||
|
|
||||||
|
$where[] = qsprintf(
|
||||||
|
$conn_r,
|
||||||
|
'CONVERT(name USING utf8) LIKE %~',
|
||||||
|
$this->nameContains);
|
||||||
|
}
|
||||||
|
|
||||||
$where[] = $this->buildPagingClause($conn_r);
|
$where[] = $this->buildPagingClause($conn_r);
|
||||||
|
|
||||||
return $this->formatWhereClause($where);
|
return $this->formatWhereClause($where);
|
||||||
|
|
|
@ -6,18 +6,60 @@ final class DivinerAtomSearchEngine
|
||||||
public function buildSavedQueryFromRequest(AphrontRequest $request) {
|
public function buildSavedQueryFromRequest(AphrontRequest $request) {
|
||||||
$saved = new PhabricatorSavedQuery();
|
$saved = new PhabricatorSavedQuery();
|
||||||
|
|
||||||
|
$saved->setParameter(
|
||||||
|
'types',
|
||||||
|
$this->readListFromRequest($request, 'types'));
|
||||||
|
|
||||||
|
$saved->setParameter('name', $request->getStr('name'));
|
||||||
|
|
||||||
return $saved;
|
return $saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
|
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
|
||||||
$query = id(new DivinerAtomQuery());
|
$query = id(new DivinerAtomQuery());
|
||||||
|
|
||||||
|
$types = $saved->getParameter('types');
|
||||||
|
if ($types) {
|
||||||
|
$query->withTypes($types);
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $saved->getParameter('name');
|
||||||
|
if ($name) {
|
||||||
|
$query->withNameContains($name);
|
||||||
|
}
|
||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildSearchForm(
|
public function buildSearchForm(
|
||||||
AphrontFormView $form,
|
AphrontFormView $form,
|
||||||
PhabricatorSavedQuery $saved_query) {
|
PhabricatorSavedQuery $saved) {
|
||||||
|
|
||||||
|
$all_types = array();
|
||||||
|
foreach (DivinerAtom::getAllTypes() as $type) {
|
||||||
|
$all_types[$type] = DivinerAtom::getAtomTypeNameString($type);
|
||||||
|
}
|
||||||
|
asort($all_types);
|
||||||
|
|
||||||
|
$types = $saved->getParameter('types', array());
|
||||||
|
$types = array_fuse($types);
|
||||||
|
$type_control = id(new AphrontFormCheckboxControl())
|
||||||
|
->setLabel(pht('Types'));
|
||||||
|
foreach ($all_types as $type => $name) {
|
||||||
|
$type_control->addCheckbox(
|
||||||
|
'types[]',
|
||||||
|
$type,
|
||||||
|
$name,
|
||||||
|
isset($types[$type]));
|
||||||
|
}
|
||||||
|
|
||||||
|
$form
|
||||||
|
->appendChild(
|
||||||
|
id(new AphrontFormTextControl())
|
||||||
|
->setLabel(pht('Name Contains'))
|
||||||
|
->setName('name')
|
||||||
|
->setValue($saved->getParameter('name')))
|
||||||
|
->appendChild($type_control);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue