Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15403537
D13193.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
26 KB
Referenced Files
None
Subscribers
None
D13193.id.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2520,6 +2520,7 @@
'PhabricatorSearchManagementInitWorkflow' => 'applications/search/management/PhabricatorSearchManagementInitWorkflow.php',
'PhabricatorSearchManagementWorkflow' => 'applications/search/management/PhabricatorSearchManagementWorkflow.php',
'PhabricatorSearchOrderController' => 'applications/search/controller/PhabricatorSearchOrderController.php',
+ 'PhabricatorSearchOrderField' => 'applications/search/field/PhabricatorSearchOrderField.php',
'PhabricatorSearchOwnersField' => 'applications/search/field/PhabricatorSearchOwnersField.php',
'PhabricatorSearchPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorSearchPreferencesSettingsPanel.php',
'PhabricatorSearchProjectsField' => 'applications/search/field/PhabricatorSearchProjectsField.php',
@@ -6024,6 +6025,7 @@
'PhabricatorSearchManagementInitWorkflow' => 'PhabricatorSearchManagementWorkflow',
'PhabricatorSearchManagementWorkflow' => 'PhabricatorManagementWorkflow',
'PhabricatorSearchOrderController' => 'PhabricatorSearchBaseController',
+ 'PhabricatorSearchOrderField' => 'PhabricatorSearchField',
'PhabricatorSearchOwnersField' => 'PhabricatorSearchTokenizerField',
'PhabricatorSearchPreferencesSettingsPanel' => 'PhabricatorSettingsPanel',
'PhabricatorSearchProjectsField' => 'PhabricatorSearchTokenizerField',
diff --git a/src/applications/almanac/query/AlmanacServiceQuery.php b/src/applications/almanac/query/AlmanacServiceQuery.php
--- a/src/applications/almanac/query/AlmanacServiceQuery.php
+++ b/src/applications/almanac/query/AlmanacServiceQuery.php
@@ -60,47 +60,35 @@
}
protected function loadPage() {
- $table = new AlmanacService();
- $conn_r = $table->establishConnection('r');
-
- $data = queryfx_all(
- $conn_r,
- 'SELECT service.* FROM %T service %Q %Q %Q %Q',
- $table->getTableName(),
- $this->buildJoinClause($conn_r),
- $this->buildWhereClause($conn_r),
- $this->buildOrderClause($conn_r),
- $this->buildLimitClause($conn_r));
-
- return $table->loadAllFromArray($data);
+ return $this->loadStandardPage(new AlmanacService());
}
- protected function buildJoinClause(AphrontDatabaseConnection $conn_r) {
- $joins = array();
+ protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) {
+ $joins = parent::buildJoinClauseParts($conn);
if ($this->devicePHIDs !== null) {
$joins[] = qsprintf(
- $conn_r,
+ $conn,
'JOIN %T binding ON service.phid = binding.servicePHID',
id(new AlmanacBinding())->getTableName());
}
- return implode(' ', $joins);
+ return $joins;
}
- protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
- $where = array();
+ protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
+ $where = parent::buildWhereClauseParts($conn);
if ($this->ids !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.id IN (%Ld)',
$this->ids);
}
if ($this->phids !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.phid IN (%Ls)',
$this->phids);
}
@@ -112,49 +100,47 @@
}
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.nameIndex IN (%Ls)',
$hashes);
}
if ($this->serviceClasses !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.serviceClass IN (%Ls)',
$this->serviceClasses);
}
if ($this->devicePHIDs !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'binding.devicePHID IN (%Ls)',
$this->devicePHIDs);
}
if ($this->locked !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.isLocked = %d',
(int)$this->locked);
}
if ($this->namePrefix !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.name LIKE %>',
$this->namePrefix);
}
if ($this->nameSuffix !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'service.name LIKE %<',
$this->nameSuffix);
}
- $where[] = $this->buildPagingClause($conn_r);
-
- return $this->formatWhereClause($where);
+ return $where;
}
protected function willFilterPage(array $services) {
@@ -192,10 +178,14 @@
return parent::didFilterPage($services);
}
+ public function getPrimaryTableAlias() {
+ return 'service';
+ }
+
public function getOrderableColumns() {
return parent::getOrderableColumns() + array(
'name' => array(
- 'table' => 'service',
+ 'table' => $this->getPrimaryTableAlias(),
'column' => 'name',
'type' => 'string',
'unique' => true,
diff --git a/src/applications/almanac/query/AlmanacServiceSearchEngine.php b/src/applications/almanac/query/AlmanacServiceSearchEngine.php
--- a/src/applications/almanac/query/AlmanacServiceSearchEngine.php
+++ b/src/applications/almanac/query/AlmanacServiceSearchEngine.php
@@ -11,30 +11,26 @@
return 'PhabricatorAlmanacApplication';
}
- public function buildSavedQueryFromRequest(AphrontRequest $request) {
- $saved = new PhabricatorSavedQuery();
-
- $this->saveQueryOrder($saved, $request);
-
- return $saved;
+ public function newQuery() {
+ return new AlmanacServiceQuery();
}
- public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
- $query = id(new AlmanacServiceQuery());
+ public function newResultObject() {
+ // NOTE: We need to attach a service type in order to generate custom
+ // field definitions.
+ return AlmanacService::initializeNewService()
+ ->attachServiceType(new AlmanacCustomServiceType());
+ }
- $this->setQueryOrder($query, $saved);
+ protected function buildQueryFromParameters(array $map) {
+ $query = $this->newQuery();
return $query;
}
- public function buildSearchForm(
- AphrontFormView $form,
- PhabricatorSavedQuery $saved) {
- $this->appendOrderFieldsToForm(
- $form,
- $saved,
- new AlmanacServiceQuery());
+ protected function buildCustomSearchFields() {
+ return array();
}
protected function getURI($path) {
@@ -62,12 +58,6 @@
return parent::buildSavedQueryFromBuiltin($query_key);
}
- protected function getRequiredHandlePHIDsForResultList(
- array $services,
- PhabricatorSavedQuery $query) {
- return array();
- }
-
protected function renderResultList(
array $services,
PhabricatorSavedQuery $query,
diff --git a/src/applications/files/query/PhabricatorFileQuery.php b/src/applications/files/query/PhabricatorFileQuery.php
--- a/src/applications/files/query/PhabricatorFileQuery.php
+++ b/src/applications/files/query/PhabricatorFileQuery.php
@@ -117,6 +117,10 @@
return $this;
}
+ public function newResultObject() {
+ return new PhabricatorFile();
+ }
+
protected function loadPage() {
$files = $this->loadStandardPage(new PhabricatorFile());
diff --git a/src/applications/files/query/PhabricatorFileSearchEngine.php b/src/applications/files/query/PhabricatorFileSearchEngine.php
--- a/src/applications/files/query/PhabricatorFileSearchEngine.php
+++ b/src/applications/files/query/PhabricatorFileSearchEngine.php
@@ -11,8 +11,8 @@
return 'PhabricatorFilesApplication';
}
- public function newResultObject() {
- return new PhabricatorFile();
+ public function newQuery() {
+ return new PhabricatorFileQuery();
}
protected function buildCustomSearchFields() {
@@ -46,7 +46,7 @@
}
public function buildQueryFromParameters(array $map) {
- $query = id(new PhabricatorFileQuery());
+ $query = $this->newQuery();
if ($map['authorPHIDs']) {
$query->withAuthorPHIDs($map['authorPHIDs']);
diff --git a/src/applications/maniphest/query/ManiphestTaskQuery.php b/src/applications/maniphest/query/ManiphestTaskQuery.php
--- a/src/applications/maniphest/query/ManiphestTaskQuery.php
+++ b/src/applications/maniphest/query/ManiphestTaskQuery.php
@@ -193,7 +193,7 @@
return $this;
}
- protected function newResultObject() {
+ public function newResultObject() {
return new ManiphestTask();
}
diff --git a/src/applications/paste/query/PhabricatorPasteQuery.php b/src/applications/paste/query/PhabricatorPasteQuery.php
--- a/src/applications/paste/query/PhabricatorPasteQuery.php
+++ b/src/applications/paste/query/PhabricatorPasteQuery.php
@@ -67,7 +67,7 @@
return $this;
}
- protected function newResultObject() {
+ public function newResultObject() {
return new PhabricatorPaste();
}
diff --git a/src/applications/paste/query/PhabricatorPasteSearchEngine.php b/src/applications/paste/query/PhabricatorPasteSearchEngine.php
--- a/src/applications/paste/query/PhabricatorPasteSearchEngine.php
+++ b/src/applications/paste/query/PhabricatorPasteSearchEngine.php
@@ -11,13 +11,13 @@
return 'PhabricatorPasteApplication';
}
- public function newResultObject() {
- return new PhabricatorPaste();
+ public function newQuery() {
+ return id(new PhabricatorPasteQuery())
+ ->needContent(true);
}
protected function buildQueryFromParameters(array $map) {
- $query = id(new PhabricatorPasteQuery())
- ->needContent(true);
+ $query = $this->newQuery();
if ($map['authorPHIDs']) {
$query->withAuthorPHIDs($map['authorPHIDs']);
diff --git a/src/applications/people/query/PhabricatorPeopleQuery.php b/src/applications/people/query/PhabricatorPeopleQuery.php
--- a/src/applications/people/query/PhabricatorPeopleQuery.php
+++ b/src/applications/people/query/PhabricatorPeopleQuery.php
@@ -113,19 +113,13 @@
return $this;
}
+ public function newResultObject() {
+ return new PhabricatorUser();
+ }
+
protected function loadPage() {
- $table = new PhabricatorUser();
- $conn_r = $table->establishConnection('r');
-
- $data = queryfx_all(
- $conn_r,
- 'SELECT * FROM %T user %Q %Q %Q %Q %Q',
- $table->getTableName(),
- $this->buildJoinsClause($conn_r),
- $this->buildWhereClause($conn_r),
- $this->buildGroupClause($conn_r),
- $this->buildOrderClause($conn_r),
- $this->buildLimitClause($conn_r));
+ $table = new PhabricatorUser();
+ $data = $this->loadStandardPageRows($table);
if ($this->needPrimaryEmail) {
$table->putInSet(new LiskDAOSet());
@@ -225,23 +219,21 @@
return $users;
}
- protected function buildGroupClause(AphrontDatabaseConnection $conn) {
+ protected function shouldGroupQueryResultRows() {
if ($this->nameTokens) {
- return qsprintf(
- $conn,
- 'GROUP BY user.id');
- } else {
- return $this->buildApplicationSearchGroupClause($conn);
+ return true;
}
+
+ return parent::shouldGroupQueryResultRows();
}
- private function buildJoinsClause($conn_r) {
- $joins = array();
+ protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) {
+ $joins = parent::buildJoinClauseParts($conn);
if ($this->emails) {
$email_table = new PhabricatorUserEmail();
$joins[] = qsprintf(
- $conn_r,
+ $conn,
'JOIN %T email ON email.userPHID = user.PHID',
$email_table->getTableName());
}
@@ -250,7 +242,7 @@
foreach ($this->nameTokens as $key => $token) {
$token_table = 'token_'.$key;
$joins[] = qsprintf(
- $conn_r,
+ $conn,
'JOIN %T %T ON %T.userID = user.id AND %T.token LIKE %>',
PhabricatorUser::NAMETOKEN_TABLE,
$token_table,
@@ -260,110 +252,105 @@
}
}
- $joins[] = $this->buildApplicationSearchJoinClause($conn_r);
-
- $joins = implode(' ', $joins);
return $joins;
}
- protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
- $where = array();
+ protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
+ $where = parent::buildWhereClauseParts($conn);
if ($this->usernames !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.userName IN (%Ls)',
$this->usernames);
}
if ($this->emails !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'email.address IN (%Ls)',
$this->emails);
}
if ($this->realnames !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.realName IN (%Ls)',
$this->realnames);
}
if ($this->phids !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.phid IN (%Ls)',
$this->phids);
}
if ($this->ids !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.id IN (%Ld)',
$this->ids);
}
if ($this->dateCreatedAfter) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.dateCreated >= %d',
$this->dateCreatedAfter);
}
if ($this->dateCreatedBefore) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.dateCreated <= %d',
$this->dateCreatedBefore);
}
if ($this->isAdmin !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.isAdmin = %d',
(int)$this->isAdmin);
}
if ($this->isDisabled !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.isDisabled = %d',
(int)$this->isDisabled);
}
if ($this->isApproved !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.isApproved = %d',
(int)$this->isApproved);
}
if ($this->isSystemAgent !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.isSystemAgent = %d',
(int)$this->isSystemAgent);
}
if ($this->isMailingList !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.isMailingList = %d',
(int)$this->isMailingList);
}
if (strlen($this->nameLike)) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'user.username LIKE %~ OR user.realname LIKE %~',
$this->nameLike,
$this->nameLike);
}
- $where[] = $this->buildPagingClause($conn_r);
-
- return $this->formatWhereClause($where);
+ return $where;
}
protected function getPrimaryTableAlias() {
diff --git a/src/applications/people/query/PhabricatorPeopleSearchEngine.php b/src/applications/people/query/PhabricatorPeopleSearchEngine.php
--- a/src/applications/people/query/PhabricatorPeopleSearchEngine.php
+++ b/src/applications/people/query/PhabricatorPeopleSearchEngine.php
@@ -11,8 +11,10 @@
return 'PhabricatorPeopleApplication';
}
- public function newResultObject() {
- return new PhabricatorUser();
+ public function newQuery() {
+ return id(new PhabricatorPeopleQuery())
+ ->needPrimaryEmail(true)
+ ->needProfileImage(true);
}
protected function buildCustomSearchFields() {
@@ -77,9 +79,7 @@
}
public function buildQueryFromParameters(array $map) {
- $query = id(new PhabricatorPeopleQuery())
- ->needPrimaryEmail(true)
- ->needProfileImage(true);
+ $query = $this->newQuery();
$viewer = $this->requireViewer();
diff --git a/src/applications/pholio/query/PholioMockQuery.php b/src/applications/pholio/query/PholioMockQuery.php
--- a/src/applications/pholio/query/PholioMockQuery.php
+++ b/src/applications/pholio/query/PholioMockQuery.php
@@ -53,6 +53,10 @@
return $this;
}
+ public function newResultObject() {
+ return new PholioMock();
+ }
+
protected function loadPage() {
$mocks = $this->loadStandardPage(new PholioMock());
diff --git a/src/applications/pholio/query/PholioMockSearchEngine.php b/src/applications/pholio/query/PholioMockSearchEngine.php
--- a/src/applications/pholio/query/PholioMockSearchEngine.php
+++ b/src/applications/pholio/query/PholioMockSearchEngine.php
@@ -10,11 +10,14 @@
return 'PhabricatorPholioApplication';
}
- public function newResultObject() {
- return new PholioMock();
+ public function newQuery() {
+ return id(new PholioMockQuery())
+ ->needCoverFiles(true)
+ ->needImages(true)
+ ->needTokenCounts(true);
}
- public function buildCustomSearchFields() {
+ protected function buildCustomSearchFields() {
return array(
id(new PhabricatorSearchUsersField())
->setKey('authorPHIDs')
@@ -30,10 +33,7 @@
}
public function buildQueryFromParameters(array $map) {
- $query = id(new PholioMockQuery())
- ->needCoverFiles(true)
- ->needImages(true)
- ->needTokenCounts(true);
+ $query = $this->newQuery();
if ($map['authorPHIDs']) {
$query->withAuthorPHIDs($map['authorPHIDs']);
diff --git a/src/applications/project/query/PhabricatorProjectQuery.php b/src/applications/project/query/PhabricatorProjectQuery.php
--- a/src/applications/project/query/PhabricatorProjectQuery.php
+++ b/src/applications/project/query/PhabricatorProjectQuery.php
@@ -95,13 +95,26 @@
return $this;
}
+ public function newResultObject() {
+ return new PhabricatorProject();
+ }
+
protected function getDefaultOrderVector() {
return array('name');
}
- public function getOrderableColumns() {
+ public function getBuiltinOrders() {
return array(
'name' => array(
+ 'vector' => array('name'),
+ 'name' => pht('Name'),
+ ),
+ ) + parent::getBuiltinOrders();
+ }
+
+ public function getOrderableColumns() {
+ return parent::getOrderableColumns() + array(
+ 'name' => array(
'table' => $this->getPrimaryTableAlias(),
'column' => 'name',
'reverse' => true,
diff --git a/src/applications/project/query/PhabricatorProjectSearchEngine.php b/src/applications/project/query/PhabricatorProjectSearchEngine.php
--- a/src/applications/project/query/PhabricatorProjectSearchEngine.php
+++ b/src/applications/project/query/PhabricatorProjectSearchEngine.php
@@ -11,8 +11,9 @@
return 'PhabricatorProjectApplication';
}
- public function newResultObject() {
- return new PhabricatorProject();
+ public function newQuery() {
+ return id(new PhabricatorProjectQuery())
+ ->needImages(true);
}
protected function buildCustomSearchFields() {
@@ -41,8 +42,7 @@
public function buildQueryFromParameters(array $map) {
- $query = id(new PhabricatorProjectQuery())
- ->needImages(true);
+ $query = $this->newQuery();
if (strlen($map['name'])) {
$tokens = PhabricatorTypeaheadDatasource::tokenizeString($map['name']);
diff --git a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
--- a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
+++ b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
@@ -27,6 +27,19 @@
const CONTEXT_PANEL = 'panel';
public function newResultObject() {
+ // We may be able to get this automatically if newQuery() is implemented.
+ $query = $this->newQuery();
+ if ($query) {
+ $object = $query->newResultObject();
+ if ($object) {
+ return $object;
+ }
+ }
+
+ return null;
+ }
+
+ public function newQuery() {
return null;
}
@@ -98,15 +111,15 @@
$fields = $this->buildSearchFields();
$viewer = $this->requireViewer();
- $parameters = array();
+ $map = array();
foreach ($fields as $field) {
$field->setViewer($viewer);
$field->readValueFromSavedQuery($saved);
$value = $field->getValueForQuery($field->getValue());
- $parameters[$field->getKey()] = $value;
+ $map[$field->getKey()] = $value;
}
- $query = $this->buildQueryFromParameters($parameters);
+ $query = $this->buildQueryFromParameters($map);
$object = $this->newResultObject();
if (!$object) {
@@ -114,25 +127,25 @@
}
if ($object instanceof PhabricatorSubscribableInterface) {
- if (!empty($parameters['subscriberPHIDs'])) {
+ if (!empty($map['subscriberPHIDs'])) {
$query->withEdgeLogicPHIDs(
PhabricatorObjectHasSubscriberEdgeType::EDGECONST,
PhabricatorQueryConstraint::OPERATOR_OR,
- $parameters['subscriberPHIDs']);
+ $map['subscriberPHIDs']);
}
}
if ($object instanceof PhabricatorProjectInterface) {
- if (!empty($parameters['projectPHIDs'])) {
+ if (!empty($map['projectPHIDs'])) {
$query->withEdgeLogicConstraints(
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
- $parameters['projectPHIDs']);
+ $map['projectPHIDs']);
}
}
if ($object instanceof PhabricatorSpacesInterface) {
- if (!empty($parameters['spacePHIDs'])) {
- $query->withSpacePHIDs($parameters['spacePHIDs']);
+ if (!empty($map['spacePHIDs'])) {
+ $query->withSpacePHIDs($map['spacePHIDs']);
}
}
@@ -140,6 +153,8 @@
$this->applyCustomFieldsToQuery($query, $saved);
}
+ $this->setQueryOrder($query, $saved);
+
return $query;
}
@@ -185,30 +200,28 @@
}
$object = $this->newResultObject();
- if (!$object) {
- return $fields;
- }
-
- if ($object instanceof PhabricatorSubscribableInterface) {
- $fields[] = id(new PhabricatorSearchSubscribersField())
- ->setLabel(pht('Subscribers'))
- ->setKey('subscriberPHIDs')
- ->setAliases(array('subscriber', 'subscribers'));
- }
+ if ($object) {
+ if ($object instanceof PhabricatorSubscribableInterface) {
+ $fields[] = id(new PhabricatorSearchSubscribersField())
+ ->setLabel(pht('Subscribers'))
+ ->setKey('subscriberPHIDs')
+ ->setAliases(array('subscriber', 'subscribers'));
+ }
- if ($object instanceof PhabricatorProjectInterface) {
- $fields[] = id(new PhabricatorSearchProjectsField())
- ->setKey('projectPHIDs')
- ->setAliases(array('project', 'projects'))
- ->setLabel(pht('Projects'));
- }
+ if ($object instanceof PhabricatorProjectInterface) {
+ $fields[] = id(new PhabricatorSearchProjectsField())
+ ->setKey('projectPHIDs')
+ ->setAliases(array('project', 'projects'))
+ ->setLabel(pht('Projects'));
+ }
- if ($object instanceof PhabricatorSpacesInterface) {
- if (PhabricatorSpacesNamespaceQuery::getSpacesExist()) {
- $fields[] = id(new PhabricatorSearchSpacesField())
- ->setKey('spacePHIDs')
- ->setAliases(array('space', 'spaces'))
- ->setLabel(pht('Spaces'));
+ if ($object instanceof PhabricatorSpacesInterface) {
+ if (PhabricatorSpacesNamespaceQuery::getSpacesExist()) {
+ $fields[] = id(new PhabricatorSearchSpacesField())
+ ->setKey('spacePHIDs')
+ ->setAliases(array('space', 'spaces'))
+ ->setLabel(pht('Spaces'));
+ }
}
}
@@ -216,6 +229,17 @@
$fields[] = $custom_field;
}
+ $query = $this->newQuery();
+ if ($query) {
+ $orders = $query->getBuiltinOrders();
+ $orders = ipull($orders, 'name');
+
+ $fields[] = id(new PhabricatorSearchOrderField())
+ ->setLabel(pht('Order'))
+ ->setKey('order')
+ ->setOptions($orders);
+ }
+
$field_map = array();
foreach ($fields as $field) {
$key = $field->getKey();
@@ -890,6 +914,7 @@
$order = $saved->getParameter('order');
$builtin = $query->getBuiltinOrders();
+
if (strlen($order) && isset($builtin[$order])) {
$query->setOrder($order);
} else {
diff --git a/src/applications/search/field/PhabricatorSearchOrderField.php b/src/applications/search/field/PhabricatorSearchOrderField.php
new file mode 100644
--- /dev/null
+++ b/src/applications/search/field/PhabricatorSearchOrderField.php
@@ -0,0 +1,30 @@
+<?php
+
+final class PhabricatorSearchOrderField
+ extends PhabricatorSearchField {
+
+ private $options;
+
+ public function setOptions(array $options) {
+ $this->options = $options;
+ return $this;
+ }
+
+ public function getOptions() {
+ return $this->options;
+ }
+
+ protected function getDefaultValue() {
+ return null;
+ }
+
+ protected function getValueFromRequest(AphrontRequest $request, $key) {
+ return $request->getStr($key);
+ }
+
+ protected function newControl() {
+ return id(new AphrontFormSelectControl())
+ ->setOptions($this->getOptions());
+ }
+
+}
diff --git a/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php b/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php
--- a/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php
+++ b/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php
@@ -200,7 +200,7 @@
return null;
}
- protected function newResultObject() {
+ public function newResultObject() {
return null;
}
@@ -844,6 +844,9 @@
'column' => 'indexValue',
'type' => $index->getIndexValueType(),
'null' => 'tail',
+ 'customfield' => true,
+ 'customfield.index.table' => $index->getTableName(),
+ 'customfield.index.key' => $digest,
);
}
}
@@ -1229,6 +1232,7 @@
}
}
+ // TODO: Get rid of this.
foreach ($this->applicationSearchOrders as $key => $order) {
$table = $order['table'];
$index = $order['index'];
@@ -1247,6 +1251,32 @@
$index);
}
+ $phid_column = $this->getApplicationSearchObjectPHIDColumn();
+ $orderable = $this->getOrderableColumns();
+
+ $vector = $this->getOrderVector();
+ foreach ($vector as $order) {
+ $spec = $orderable[$order->getOrderKey()];
+ if (empty($spec['customfield'])) {
+ continue;
+ }
+
+ $table = $spec['customfield.index.table'];
+ $alias = $spec['table'];
+ $key = $spec['customfield.index.key'];
+
+ $joins[] = qsprintf(
+ $conn_r,
+ 'LEFT JOIN %T %T ON %T.objectPHID = %Q
+ AND %T.indexKey = %s',
+ $table,
+ $alias,
+ $alias,
+ $phid_column,
+ $alias,
+ $key);
+ }
+
return implode(' ', $joins);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Mar 19, 3:44 AM (1 w, 2 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7705915
Default Alt Text
D13193.id.diff (26 KB)
Attached To
Mode
D13193: Support ordering in SearchField
Attached
Detach File
Event Timeline
Log In to Comment