@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator

Allow `*.search` Conduit API methods to have data bulk-loaded by extensions

Summary:
Ref T11404. Currently, SearchEngineAttachments can bulk-load data but SearchEngineExtensions can not.

This leads to poor performance of custom fields. See T11404 for discussion.

This changes the API to support a bulk load + format pattern like the one Attachments use. The next change will use it to bulk-load custom field data.

Test Plan:

- Ran `differential.query`, `differential.revision.search` as a sanity check.
- No behavioral changes are expected
- See next revision.

Reviewers: yelirekim, chad

Reviewed By: chad

Maniphest Tasks: T11404

Differential Revision: https://secure.phabricator.com/D16350

+22 -10
+1 -1
src/applications/conduit/query/ConduitResultSearchEngineExtension.php
··· 25 25 return $object->getFieldSpecificationsForConduit(); 26 26 } 27 27 28 - public function getFieldValuesForConduit($object) { 28 + public function getFieldValuesForConduit($object, $data) { 29 29 return $object->getFieldValuesForConduit(); 30 30 } 31 31
+1 -1
src/applications/policy/engineextension/PhabricatorPolicySearchEngineExtension.php
··· 30 30 ); 31 31 } 32 32 33 - public function getFieldValuesForConduit($object) { 33 + public function getFieldValuesForConduit($object, $data) { 34 34 $capabilities = $object->getCapabilities(); 35 35 36 36 $map = array();
+12 -4
src/applications/search/engine/PhabricatorApplicationSearchEngine.php
··· 1138 1138 if ($objects) { 1139 1139 $field_extensions = $this->getConduitFieldExtensions(); 1140 1140 1141 + $extension_data = array(); 1142 + foreach ($field_extensions as $key => $extension) { 1143 + $extension_data[$key] = $extension->loadExtensionConduitData($objects); 1144 + } 1145 + 1141 1146 $attachment_data = array(); 1142 1147 foreach ($attachments as $key => $attachment) { 1143 1148 $attachment_data[$key] = $attachment->loadAttachmentData( ··· 1148 1153 foreach ($objects as $object) { 1149 1154 $field_map = $this->getObjectWireFieldsForConduit( 1150 1155 $object, 1151 - $field_extensions); 1156 + $field_extensions, 1157 + $extension_data); 1152 1158 1153 1159 $attachment_map = array(); 1154 1160 foreach ($attachments as $key => $attachment) { ··· 1312 1318 1313 1319 protected function getObjectWireFieldsForConduit( 1314 1320 $object, 1315 - array $field_extensions) { 1321 + array $field_extensions, 1322 + array $extension_data) { 1316 1323 1317 1324 $fields = array(); 1318 - foreach ($field_extensions as $extension) { 1319 - $fields += $extension->getFieldValuesForConduit($object); 1325 + foreach ($field_extensions as $key => $extension) { 1326 + $data = idx($extension_data, $key, array()); 1327 + $fields += $extension->getFieldValuesForConduit($object, $data); 1320 1328 } 1321 1329 1322 1330 return $fields;
+1 -1
src/applications/search/engineextension/PhabricatorLiskSearchEngineExtension.php
··· 44 44 ); 45 45 } 46 46 47 - public function getFieldValuesForConduit($object) { 47 + public function getFieldValuesForConduit($object, $data) { 48 48 return array( 49 49 'dateCreated' => (int)$object->getDateCreated(), 50 50 'dateModified' => (int)$object->getDateModified(),
+5 -1
src/applications/search/engineextension/PhabricatorSearchEngineExtension.php
··· 56 56 return array(); 57 57 } 58 58 59 - public function getFieldValuesForConduit($object) { 59 + public function loadExtensionConduitData(array $objects) { 60 + return null; 61 + } 62 + 63 + public function getFieldValuesForConduit($object, $data) { 60 64 return array(); 61 65 } 62 66
+1 -1
src/applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php
··· 63 63 ); 64 64 } 65 65 66 - public function getFieldValuesForConduit($object) { 66 + public function getFieldValuesForConduit($object, $data) { 67 67 return array( 68 68 'spacePHID' => $object->getSpacePHID(), 69 69 );
+1 -1
src/infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php
··· 80 80 return $map; 81 81 } 82 82 83 - public function getFieldValuesForConduit($object) { 83 + public function getFieldValuesForConduit($object, $data) { 84 84 // TODO: This is currently very inefficient. We should bulk-load these 85 85 // field values instead. 86 86