mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-27 01:02:42 +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) {
|
||||
switch ($type) {
|
||||
case self::TYPE_FILE:
|
||||
|
|
|
@ -199,6 +199,10 @@ final class DivinerAtomRef {
|
|||
}
|
||||
|
||||
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);
|
||||
return phutil_utf8_strtolower($str);
|
||||
}
|
||||
|
|
|
@ -26,7 +26,29 @@ final class DivinerAtomListController extends DivinerController
|
|||
public function renderResultsList(
|
||||
array $symbols,
|
||||
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 $nodeHashes;
|
||||
private $titles;
|
||||
private $nameContains;
|
||||
|
||||
private $needAtoms;
|
||||
private $needExtends;
|
||||
|
@ -64,6 +65,11 @@ final class DivinerAtomQuery
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function withNameContains($text) {
|
||||
$this->nameContains = $text;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function needAtoms($need) {
|
||||
$this->needAtoms = $need;
|
||||
return $this;
|
||||
|
@ -361,6 +367,17 @@ final class DivinerAtomQuery
|
|||
$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);
|
||||
|
||||
return $this->formatWhereClause($where);
|
||||
|
|
|
@ -6,18 +6,60 @@ final class DivinerAtomSearchEngine
|
|||
public function buildSavedQueryFromRequest(AphrontRequest $request) {
|
||||
$saved = new PhabricatorSavedQuery();
|
||||
|
||||
$saved->setParameter(
|
||||
'types',
|
||||
$this->readListFromRequest($request, 'types'));
|
||||
|
||||
$saved->setParameter('name', $request->getStr('name'));
|
||||
|
||||
return $saved;
|
||||
}
|
||||
|
||||
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
|
||||
$query = id(new DivinerAtomQuery());
|
||||
|
||||
$types = $saved->getParameter('types');
|
||||
if ($types) {
|
||||
$query->withTypes($types);
|
||||
}
|
||||
|
||||
$name = $saved->getParameter('name');
|
||||
if ($name) {
|
||||
$query->withNameContains($name);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function buildSearchForm(
|
||||
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