mirror of
https://we.phorge.it/source/phorge.git
synced 2025-04-09 10:58:34 +02:00
Summary: Ref T8441. Ref T7715. Add a layer of indirection to fields in search engines. This will allow us to: - Simplify SearchEngine code, which has collected a lot of duplication around expressing what is effectively field types. - Automatically add fields like "Spaces" and "Projects" (primary driver for T8441). - Reorder or hide fields (not sure if we really want to do this, but it seems plausible, and this will let us play around with it, at least). - Drive Conduit Query methods via SearchEngines, so the same code specifies both the search UI and the `application.query` endpoint (primary driver in T7715). Test Plan: - Searched for stuff in Paste, everything behaved exaclty like it used to (except that I removed the "no language" checkbox, which seemed like fluff from a bygone era). - Searched for stuff in other applications, saw no changes. - Hit date field errors. - Used query strings to specify values. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7715, T8441 Differential Revision: https://secure.phabricator.com/D13169
150 lines
4 KiB
PHP
150 lines
4 KiB
PHP
<?php
|
|
|
|
final class PhabricatorPasteSearchEngine
|
|
extends PhabricatorApplicationSearchEngine {
|
|
|
|
public function getResultTypeDescription() {
|
|
return pht('Pastes');
|
|
}
|
|
|
|
public function getApplicationClassName() {
|
|
return 'PhabricatorPasteApplication';
|
|
}
|
|
|
|
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
|
|
$query = id(new PhabricatorPasteQuery())
|
|
->needContent(true)
|
|
->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()))
|
|
->withLanguages($saved->getParameter('languages', array()));
|
|
|
|
$start = $this->parseDateTime($saved->getParameter('createdStart'));
|
|
$end = $this->parseDateTime($saved->getParameter('createdEnd'));
|
|
|
|
if ($start) {
|
|
$query->withDateCreatedAfter($start);
|
|
}
|
|
|
|
if ($end) {
|
|
$query->withDateCreatedBefore($end);
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
protected function buildCustomSearchFields() {
|
|
return array(
|
|
id(new PhabricatorSearchUsersField())
|
|
->setAliases(array('authors'))
|
|
->setKey('authorPHIDs')
|
|
->setLabel(pht('Authors')),
|
|
id(new PhabricatorSearchStringListField())
|
|
->setKey('languages')
|
|
->setLabel(pht('Languages')),
|
|
id(new PhabricatorSearchDateField())
|
|
->setKey('createdStart')
|
|
->setLabel(pht('Created After')),
|
|
id(new PhabricatorSearchDateField())
|
|
->setKey('createdEnd')
|
|
->setLabel(pht('Created Before')),
|
|
);
|
|
}
|
|
|
|
protected function getURI($path) {
|
|
return '/paste/'.$path;
|
|
}
|
|
|
|
protected function getBuiltinQueryNames() {
|
|
$names = array(
|
|
'all' => pht('All Pastes'),
|
|
);
|
|
|
|
if ($this->requireViewer()->isLoggedIn()) {
|
|
$names['authored'] = pht('Authored');
|
|
}
|
|
|
|
return $names;
|
|
}
|
|
|
|
public function buildSavedQueryFromBuiltin($query_key) {
|
|
|
|
$query = $this->newSavedQuery();
|
|
$query->setQueryKey($query_key);
|
|
|
|
switch ($query_key) {
|
|
case 'all':
|
|
return $query;
|
|
case 'authored':
|
|
return $query->setParameter(
|
|
'authorPHIDs',
|
|
array($this->requireViewer()->getPHID()));
|
|
}
|
|
|
|
return parent::buildSavedQueryFromBuiltin($query_key);
|
|
}
|
|
|
|
protected function getRequiredHandlePHIDsForResultList(
|
|
array $pastes,
|
|
PhabricatorSavedQuery $query) {
|
|
return mpull($pastes, 'getAuthorPHID');
|
|
}
|
|
|
|
protected function renderResultList(
|
|
array $pastes,
|
|
PhabricatorSavedQuery $query,
|
|
array $handles) {
|
|
assert_instances_of($pastes, 'PhabricatorPaste');
|
|
|
|
$viewer = $this->requireViewer();
|
|
|
|
$lang_map = PhabricatorEnv::getEnvConfig('pygments.dropdown-choices');
|
|
|
|
$list = new PHUIObjectItemListView();
|
|
$list->setUser($viewer);
|
|
foreach ($pastes as $paste) {
|
|
$created = phabricator_date($paste->getDateCreated(), $viewer);
|
|
$author = $handles[$paste->getAuthorPHID()]->renderLink();
|
|
|
|
$lines = phutil_split_lines($paste->getContent());
|
|
|
|
$preview = id(new PhabricatorSourceCodeView())
|
|
->setLimit(5)
|
|
->setLines($lines)
|
|
->setURI(new PhutilURI($paste->getURI()));
|
|
|
|
$source_code = phutil_tag(
|
|
'div',
|
|
array(
|
|
'class' => 'phabricator-source-code-summary',
|
|
),
|
|
$preview);
|
|
|
|
$created = phabricator_datetime($paste->getDateCreated(), $viewer);
|
|
$line_count = count($lines);
|
|
$line_count = pht(
|
|
'%s Line(s)',
|
|
new PhutilNumber($line_count));
|
|
|
|
$title = nonempty($paste->getTitle(), pht('(An Untitled Masterwork)'));
|
|
|
|
$item = id(new PHUIObjectItemView())
|
|
->setObjectName('P'.$paste->getID())
|
|
->setHeader($title)
|
|
->setHref('/P'.$paste->getID())
|
|
->setObject($paste)
|
|
->addByline(pht('Author: %s', $author))
|
|
->addIcon('none', $created)
|
|
->addIcon('none', $line_count)
|
|
->appendChild($source_code);
|
|
|
|
$lang_name = $paste->getLanguage();
|
|
if ($lang_name) {
|
|
$lang_name = idx($lang_map, $lang_name, $lang_name);
|
|
$item->addIcon('none', $lang_name);
|
|
}
|
|
|
|
$list->addItem($item);
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
}
|