Page MenuHomePhabricator

D14764.diff
No OneTemporary

D14764.diff

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
@@ -2836,9 +2836,10 @@
'PhabricatorProjectUserFunctionDatasource' => 'applications/project/typeahead/PhabricatorProjectUserFunctionDatasource.php',
'PhabricatorProjectViewController' => 'applications/project/controller/PhabricatorProjectViewController.php',
'PhabricatorProjectWatchController' => 'applications/project/controller/PhabricatorProjectWatchController.php',
- 'PhabricatorProjectsEditEngineExtension' => 'applications/project/editor/PhabricatorProjectsEditEngineExtension.php',
+ 'PhabricatorProjectsEditEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php',
'PhabricatorProjectsEditField' => 'applications/transactions/editfield/PhabricatorProjectsEditField.php',
'PhabricatorProjectsPolicyRule' => 'applications/project/policyrule/PhabricatorProjectsPolicyRule.php',
+ 'PhabricatorProjectsSearchEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php',
'PhabricatorProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorProtocolAdapter.php',
'PhabricatorPygmentSetupCheck' => 'applications/config/check/PhabricatorPygmentSetupCheck.php',
'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php',
@@ -3132,12 +3133,13 @@
'PhabricatorSubscriptionsAddSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php',
'PhabricatorSubscriptionsApplication' => 'applications/subscriptions/application/PhabricatorSubscriptionsApplication.php',
'PhabricatorSubscriptionsEditController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsEditController.php',
- 'PhabricatorSubscriptionsEditEngineExtension' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditEngineExtension.php',
+ 'PhabricatorSubscriptionsEditEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php',
'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php',
'PhabricatorSubscriptionsHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php',
'PhabricatorSubscriptionsListController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsListController.php',
'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php',
'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php',
+ 'PhabricatorSubscriptionsSearchEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php',
'PhabricatorSubscriptionsSubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsSubscribeEmailCommand.php',
'PhabricatorSubscriptionsSubscribersPolicyRule' => 'applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php',
'PhabricatorSubscriptionsTransactionController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsTransactionController.php',
@@ -7104,6 +7106,7 @@
'PhabricatorProjectsEditEngineExtension' => 'PhabricatorEditEngineExtension',
'PhabricatorProjectsEditField' => 'PhabricatorTokenizerEditField',
'PhabricatorProjectsPolicyRule' => 'PhabricatorPolicyRule',
+ 'PhabricatorProjectsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
'PhabricatorProtocolAdapter' => 'Phobject',
'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck',
'PhabricatorQuery' => 'Phobject',
@@ -7459,6 +7462,7 @@
'PhabricatorSubscriptionsListController' => 'PhabricatorController',
'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'PhabricatorSubscriptionsHeraldAction',
+ 'PhabricatorSubscriptionsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
'PhabricatorSubscriptionsSubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand',
'PhabricatorSubscriptionsSubscribersPolicyRule' => 'PhabricatorPolicyRule',
'PhabricatorSubscriptionsTransactionController' => 'PhabricatorController',
diff --git a/src/applications/project/editor/PhabricatorProjectsEditEngineExtension.php b/src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php
rename from src/applications/project/editor/PhabricatorProjectsEditEngineExtension.php
rename to src/applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php
diff --git a/src/applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php b/src/applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php
@@ -0,0 +1,51 @@
+<?php
+
+final class PhabricatorProjectsSearchEngineExtension
+ extends PhabricatorSearchEngineExtension {
+
+ const EXTENSIONKEY = 'projects';
+
+ public function isExtensionEnabled() {
+ return PhabricatorApplication::isClassInstalled(
+ 'PhabricatorProjectApplication');
+ }
+
+ public function getExtensionName() {
+ return pht('Support for Projects');
+ }
+
+ public function getExtensionOrder() {
+ return 2000;
+ }
+
+ public function supportsObject($object) {
+ return ($object instanceof PhabricatorProjectInterface);
+ }
+
+ public function applyConstraintsToQuery(
+ $object,
+ $query,
+ PhabricatorSavedQuery $saved,
+ array $map) {
+
+ if (!empty($map['projectPHIDs'])) {
+ $query->withEdgeLogicConstraints(
+ PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
+ $map['projectPHIDs']);
+ }
+ }
+
+ public function getSearchFields($object) {
+ $fields = array();
+
+ $fields[] = id(new PhabricatorProjectSearchField())
+ ->setKey('projectPHIDs')
+ ->setConduitKey('projects')
+ ->setAliases(array('project', 'projects'))
+ ->setLabel(pht('Projects'));
+
+ return $fields;
+ }
+
+
+}
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
@@ -19,7 +19,6 @@
private $application;
private $viewer;
private $errors = array();
- private $customFields = false;
private $request;
private $context;
private $controller;
@@ -164,35 +163,9 @@
return $query;
}
- if ($object instanceof PhabricatorSubscribableInterface) {
- if (!empty($map['subscriberPHIDs'])) {
- $query->withEdgeLogicPHIDs(
- PhabricatorObjectHasSubscriberEdgeType::EDGECONST,
- PhabricatorQueryConstraint::OPERATOR_OR,
- $map['subscriberPHIDs']);
- }
- }
-
- if ($object instanceof PhabricatorProjectInterface) {
- if (!empty($map['projectPHIDs'])) {
- $query->withEdgeLogicConstraints(
- PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
- $map['projectPHIDs']);
- }
- }
-
- if ($object instanceof PhabricatorSpacesInterface) {
- if (!empty($map['spacePHIDs'])) {
- $query->withSpacePHIDs($map['spacePHIDs']);
- } else {
- // If the user doesn't search for objects in specific spaces, we
- // default to "all active spaces you have permission to view".
- $query->withSpaceIsArchived(false);
- }
- }
-
- if ($object instanceof PhabricatorCustomFieldInterface) {
- $this->applyCustomFieldsToQuery($query, $saved);
+ $extensions = $this->getEngineExtensions();
+ foreach ($extensions as $extension) {
+ $extension->applyConstraintsToQuery($object, $query, $saved, $map);
}
$order = $saved->getParameter('order');
@@ -272,34 +245,15 @@
$object = $this->newResultObject();
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 PhabricatorProjectSearchField())
- ->setKey('projectPHIDs')
- ->setAliases(array('project', 'projects'))
- ->setLabel(pht('Projects'));
- }
-
- if ($object instanceof PhabricatorSpacesInterface) {
- if (PhabricatorSpacesNamespaceQuery::getSpacesExist()) {
- $fields[] = id(new PhabricatorSpacesSearchField())
- ->setKey('spacePHIDs')
- ->setAliases(array('space', 'spaces'))
- ->setLabel(pht('Spaces'));
+ $extensions = $this->getEngineExtensions();
+ foreach ($extensions as $extension) {
+ $extension_fields = $extension->getSearchFields($object);
+ foreach ($extension_fields as $extension_field) {
+ $fields[] = $extension_field;
}
}
}
- foreach ($this->buildCustomFieldSearchFields() as $custom_field) {
- $fields[] = $custom_field;
- }
-
$query = $this->newQuery();
if ($query && $this->shouldShowOrderField()) {
$orders = $query->getBuiltinOrders();
@@ -1089,89 +1043,6 @@
/* -( Application Search )------------------------------------------------- */
- /**
- * Retrieve an object to use to define custom fields for this search.
- *
- * To integrate with custom fields, subclasses should override this method
- * and return an instance of the application object which implements
- * @{interface:PhabricatorCustomFieldInterface}.
- *
- * @return PhabricatorCustomFieldInterface|null Object with custom fields.
- * @task appsearch
- */
- public function getCustomFieldObject() {
- $object = $this->newResultObject();
- if ($object instanceof PhabricatorCustomFieldInterface) {
- return $object;
- }
- return null;
- }
-
-
- /**
- * Get the custom fields for this search.
- *
- * @return PhabricatorCustomFieldList|null Custom fields, if this search
- * supports custom fields.
- * @task appsearch
- */
- public function getCustomFieldList() {
- if ($this->customFields === false) {
- $object = $this->getCustomFieldObject();
- if ($object) {
- $fields = PhabricatorCustomField::getObjectFields(
- $object,
- PhabricatorCustomField::ROLE_APPLICATIONSEARCH);
- $fields->setViewer($this->requireViewer());
- } else {
- $fields = null;
- }
- $this->customFields = $fields;
- }
- return $this->customFields;
- }
-
-
- /**
- * Applies data from a saved query to an executable query.
- *
- * @param PhabricatorCursorPagedPolicyAwareQuery Query to constrain.
- * @param PhabricatorSavedQuery Saved query to read.
- * @return void
- */
- protected function applyCustomFieldsToQuery(
- PhabricatorCursorPagedPolicyAwareQuery $query,
- PhabricatorSavedQuery $saved) {
-
- $list = $this->getCustomFieldList();
- if (!$list) {
- return;
- }
-
- foreach ($list->getFields() as $field) {
- $value = $field->applyApplicationSearchConstraintToQuery(
- $this,
- $query,
- $saved->getParameter('custom:'.$field->getFieldIndex()));
- }
- }
-
- private function buildCustomFieldSearchFields() {
- $list = $this->getCustomFieldList();
- if (!$list) {
- return array();
- }
-
- $fields = array();
- foreach ($list->getFields() as $field) {
- $fields[] = id(new PhabricatorSearchCustomFieldProxyField())
- ->setSearchEngine($this)
- ->setCustomField($field);
- }
-
- return $fields;
- }
-
public function getSearchFieldsForConduit() {
$standard_fields = $this->buildSearchFields();
@@ -1302,24 +1173,37 @@
return $specifications;
}
- private function getConduitFieldExtensions() {
+ private function getEngineExtensions() {
$extensions = PhabricatorSearchEngineExtension::getAllEnabledExtensions();
- $object = $this->newQuery()->newResultObject();
- $field_extensions = array();
foreach ($extensions as $key => $extension) {
- $extension->setViewer($this->requireViewer());
+ $extension
+ ->setViewer($this->requireViewer())
+ ->setSearchEngine($this);
+ }
+ $object = $this->newResultObject();
+ foreach ($extensions as $key => $extension) {
if (!$extension->supportsObject($object)) {
- continue;
+ unset($extensions[$key]);
}
+ }
+
+ return $extensions;
+ }
+
- if ($extension->getFieldSpecificationsForConduit($object)) {
- $field_extensions[$key] = $extension;
+ private function getConduitFieldExtensions() {
+ $extensions = $this->getEngineExtensions();
+ $object = $this->newResultObject();
+
+ foreach ($extensions as $key => $extension) {
+ if (!$extension->getFieldSpecificationsForConduit($object)) {
+ unset($extensions[$key]);
}
}
- return $field_extensions;
+ return $extensions;
}
private function setAutomaticConstraintsForConduit(
diff --git a/src/applications/search/engineextension/PhabricatorSearchEngineExtension.php b/src/applications/search/engineextension/PhabricatorSearchEngineExtension.php
--- a/src/applications/search/engineextension/PhabricatorSearchEngineExtension.php
+++ b/src/applications/search/engineextension/PhabricatorSearchEngineExtension.php
@@ -3,6 +3,7 @@
abstract class PhabricatorSearchEngineExtension extends Phobject {
private $viewer;
+ private $searchEngine;
final public function getExtensionKey() {
return $this->getPhobjectClassConstant('EXTENSIONKEY');
@@ -17,10 +18,36 @@
return $this->viewer;
}
+ final public function setSearchEngine(
+ PhabricatorApplicationSearchEngine $engine) {
+ $this->searchEngine = $engine;
+ return $this;
+ }
+
+ final public function getSearchEngine() {
+ return $this->searchEngine;
+ }
+
abstract public function isExtensionEnabled();
abstract public function getExtensionName();
abstract public function supportsObject($object);
+ public function getExtensionOrder() {
+ return 5000;
+ }
+
+ public function getSearchFields($object) {
+ return array();
+ }
+
+ public function applyConstraintsToQuery(
+ $object,
+ $query,
+ PhabricatorSavedQuery $saved,
+ array $map) {
+ return;
+ }
+
public function getFieldSpecificationsForConduit($object) {
return array();
}
@@ -33,6 +60,7 @@
return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__)
->setUniqueMethod('getExtensionKey')
+ ->setSortMethod('getExtensionOrder')
->execute();
}
diff --git a/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php b/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php
--- a/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php
+++ b/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php
@@ -19,6 +19,7 @@
$rows = array();
foreach ($extensions as $extension) {
$rows[] = array(
+ $extension->getExtensionOrder(),
$extension->getExtensionKey(),
get_class($extension),
$extension->getExtensionName(),
@@ -31,6 +32,7 @@
$table = id(new AphrontTableView($rows))
->setHeaders(
array(
+ pht('Order'),
pht('Key'),
pht('Class'),
pht('Name'),
@@ -40,6 +42,7 @@
array(
null,
null,
+ null,
'wide pri',
null,
));
diff --git a/src/applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php b/src/applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php
--- a/src/applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php
+++ b/src/applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php
@@ -14,10 +14,43 @@
return pht('Support for Spaces');
}
+ public function getExtensionOrder() {
+ return 3000;
+ }
+
public function supportsObject($object) {
return ($object instanceof PhabricatorSpacesInterface);
}
+ public function getSearchFields($object) {
+ $fields = array();
+
+ if (PhabricatorSpacesNamespaceQuery::getSpacesExist()) {
+ $fields[] = id(new PhabricatorSpacesSearchField())
+ ->setKey('spacePHIDs')
+ ->setConduitKey('spaces')
+ ->setAliases(array('space', 'spaces'))
+ ->setLabel(pht('Spaces'));
+ }
+
+ return $fields;
+ }
+
+ public function applyConstraintsToQuery(
+ $object,
+ $query,
+ PhabricatorSavedQuery $saved,
+ array $map) {
+
+ if (!empty($map['spacePHIDs'])) {
+ $query->withSpacePHIDs($map['spacePHIDs']);
+ } else {
+ // If the user doesn't search for objects in specific spaces, we
+ // default to "all active spaces you have permission to view".
+ $query->withSpaceIsArchived(false);
+ }
+ }
+
public function getFieldSpecificationsForConduit($object) {
return array(
'spacePHID' => array(
diff --git a/src/applications/subscriptions/editor/PhabricatorSubscriptionsEditEngineExtension.php b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php
rename from src/applications/subscriptions/editor/PhabricatorSubscriptionsEditEngineExtension.php
rename to src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php
--- a/src/applications/subscriptions/editor/PhabricatorSubscriptionsEditEngineExtension.php
+++ b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php
@@ -34,8 +34,6 @@
$sub_phids = PhabricatorSubscribersQuery::loadSubscribersForPHID(
$object_phid);
} else {
- // TODO: Allow applications to provide default subscribers? Maniphest
- // does this at a minimum.
$sub_phids = array();
}
diff --git a/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php
@@ -0,0 +1,52 @@
+<?php
+
+final class PhabricatorSubscriptionsSearchEngineExtension
+ extends PhabricatorSearchEngineExtension {
+
+ const EXTENSIONKEY = 'subscriptions';
+
+ public function isExtensionEnabled() {
+ return PhabricatorApplication::isClassInstalled(
+ 'PhabricatorSubscriptionsApplication');
+ }
+
+ public function getExtensionName() {
+ return pht('Support for Subscriptions');
+ }
+
+ public function getExtensionOrder() {
+ return 1000;
+ }
+
+ public function supportsObject($object) {
+ return ($object instanceof PhabricatorSubscribableInterface);
+ }
+
+ public function applyConstraintsToQuery(
+ $object,
+ $query,
+ PhabricatorSavedQuery $saved,
+ array $map) {
+
+ if (!empty($map['subscriberPHIDs'])) {
+ $query->withEdgeLogicPHIDs(
+ PhabricatorObjectHasSubscriberEdgeType::EDGECONST,
+ PhabricatorQueryConstraint::OPERATOR_OR,
+ $map['subscriberPHIDs']);
+ }
+ }
+
+ public function getSearchFields($object) {
+ $fields = array();
+
+ $fields[] = id(new PhabricatorSearchSubscribersField())
+ ->setLabel(pht('Subscribers'))
+ ->setKey('subscriberPHIDs')
+ ->setConduitKey('subscribers')
+ ->setAliases(array('subscriber', 'subscribers'));
+
+ return $fields;
+ }
+
+
+}
diff --git a/src/infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php b/src/infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php
--- a/src/infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php
+++ b/src/infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php
@@ -17,6 +17,50 @@
return ($object instanceof PhabricatorCustomFieldInterface);
}
+ public function getExtensionOrder() {
+ return 9000;
+ }
+
+ public function getSearchFields($object) {
+ $engine = $this->getSearchEngine();
+ $custom_fields = $this->getCustomFields($object);
+
+ $fields = array();
+ foreach ($custom_fields as $field) {
+ $fields[] = id(new PhabricatorSearchCustomFieldProxyField())
+ ->setSearchEngine($engine)
+ ->setCustomField($field);
+ }
+
+ return $fields;
+ }
+
+ public function applyConstraintsToQuery(
+ $object,
+ $query,
+ PhabricatorSavedQuery $saved,
+ array $map) {
+
+ $engine = $this->getSearchEngine();
+ $fields = $this->getCustomFields($object);
+
+ foreach ($fields as $field) {
+ $field->applyApplicationSearchConstraintToQuery(
+ $engine,
+ $query,
+ $saved->getParameter('custom:'.$field->getFieldIndex()));
+ }
+ }
+
+ private function getCustomFields($object) {
+ $fields = PhabricatorCustomField::getObjectFields(
+ $object,
+ PhabricatorCustomField::ROLE_APPLICATIONSEARCH);
+ $fields->setViewer($this->getViewer());
+
+ return $fields->getFields();
+ }
+
public function getFieldSpecificationsForConduit($object) {
$fields = PhabricatorCustomField::getObjectFields(
$object,

File Metadata

Mime Type
text/plain
Expires
Sun, May 12, 3:09 AM (4 w, 3 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6287706
Default Alt Text
D14764.diff (21 KB)

Event Timeline