@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Reduce the amount of boilerplate that implementing FerretInterface requires

Summary:
See brief discussion in D18554. All the index tables are the same for every application (and, at this point, seem unlikely to change) and we never actually pass these objects around (they're only used internally).

In some other cases (like Transactions) not every application has the same tables (for example, Differential has extra field for inline comments), and/or we pass the objects around (lots of stuff uses `$xactions` directly).

However, in this case, and in Edges, we don't interact with any representation of the database state directly in much of the code, and it doesn't change from application to application.

Just automatically define document, field, and ngram tables for anything which implements `FerretInterface`. This makes the query and index logic a tiny bit messier but lets us delete a ton of boilerplate classes.

Test Plan: Indexed objects, searched for objects. Same results as before with much less code. Ran `bin/storage upgrade`, got a clean bill of health.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12819

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

+207 -455
-36
src/__phutil_library_map__.php
··· 532 532 'DifferentialRevisionEditConduitAPIMethod' => 'applications/differential/conduit/DifferentialRevisionEditConduitAPIMethod.php', 533 533 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', 534 534 'DifferentialRevisionEditEngine' => 'applications/differential/editor/DifferentialRevisionEditEngine.php', 535 - 'DifferentialRevisionFerretDocument' => 'applications/differential/storage/DifferentialRevisionFerretDocument.php', 536 535 'DifferentialRevisionFerretEngine' => 'applications/differential/search/DifferentialRevisionFerretEngine.php', 537 - 'DifferentialRevisionFerretField' => 'applications/differential/storage/DifferentialRevisionFerretField.php', 538 - 'DifferentialRevisionFerretNgrams' => 'applications/differential/storage/DifferentialRevisionFerretNgrams.php', 539 536 'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php', 540 537 'DifferentialRevisionGraph' => 'infrastructure/graph/DifferentialRevisionGraph.php', 541 538 'DifferentialRevisionHasChildRelationship' => 'applications/differential/relationships/DifferentialRevisionHasChildRelationship.php', ··· 1153 1150 'FundInitiativeEditController' => 'applications/fund/controller/FundInitiativeEditController.php', 1154 1151 'FundInitiativeEditEngine' => 'applications/fund/editor/FundInitiativeEditEngine.php', 1155 1152 'FundInitiativeEditor' => 'applications/fund/editor/FundInitiativeEditor.php', 1156 - 'FundInitiativeFerretDocument' => 'applications/fund/storage/FundInitiativeFerretDocument.php', 1157 1153 'FundInitiativeFerretEngine' => 'applications/fund/search/FundInitiativeFerretEngine.php', 1158 - 'FundInitiativeFerretField' => 'applications/fund/storage/FundInitiativeFerretField.php', 1159 - 'FundInitiativeFerretNgrams' => 'applications/fund/storage/FundInitiativeFerretNgrams.php', 1160 1154 'FundInitiativeFulltextEngine' => 'applications/fund/search/FundInitiativeFulltextEngine.php', 1161 1155 'FundInitiativeListController' => 'applications/fund/controller/FundInitiativeListController.php', 1162 1156 'FundInitiativeMerchantTransaction' => 'applications/fund/xaction/FundInitiativeMerchantTransaction.php', ··· 1539 1533 'ManiphestTaskEditBulkJobType' => 'applications/maniphest/bulk/ManiphestTaskEditBulkJobType.php', 1540 1534 'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php', 1541 1535 'ManiphestTaskEditEngineLock' => 'applications/maniphest/editor/ManiphestTaskEditEngineLock.php', 1542 - 'ManiphestTaskFerretDocument' => 'applications/maniphest/storage/ManiphestTaskFerretDocument.php', 1543 1536 'ManiphestTaskFerretEngine' => 'applications/maniphest/search/ManiphestTaskFerretEngine.php', 1544 - 'ManiphestTaskFerretField' => 'applications/maniphest/storage/ManiphestTaskFerretField.php', 1545 - 'ManiphestTaskFerretNgrams' => 'applications/maniphest/storage/ManiphestTaskFerretNgrams.php', 1546 1537 'ManiphestTaskFulltextEngine' => 'applications/maniphest/search/ManiphestTaskFulltextEngine.php', 1547 1538 'ManiphestTaskGraph' => 'infrastructure/graph/ManiphestTaskGraph.php', 1548 1539 'ManiphestTaskHasCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasCommitEdgeType.php', ··· 1840 1831 'PassphraseCredentialDestroyController' => 'applications/passphrase/controller/PassphraseCredentialDestroyController.php', 1841 1832 'PassphraseCredentialDestroyTransaction' => 'applications/passphrase/xaction/PassphraseCredentialDestroyTransaction.php', 1842 1833 'PassphraseCredentialEditController' => 'applications/passphrase/controller/PassphraseCredentialEditController.php', 1843 - 'PassphraseCredentialFerretDocument' => 'applications/passphrase/storage/PassphraseCredentialFerretDocument.php', 1844 1834 'PassphraseCredentialFerretEngine' => 'applications/passphrase/search/PassphraseCredentialFerretEngine.php', 1845 - 'PassphraseCredentialFerretField' => 'applications/passphrase/storage/PassphraseCredentialFerretField.php', 1846 - 'PassphraseCredentialFerretNgrams' => 'applications/passphrase/storage/PassphraseCredentialFerretNgrams.php', 1847 1835 'PassphraseCredentialFulltextEngine' => 'applications/passphrase/search/PassphraseCredentialFulltextEngine.php', 1848 1836 'PassphraseCredentialListController' => 'applications/passphrase/controller/PassphraseCredentialListController.php', 1849 1837 'PassphraseCredentialLockController' => 'applications/passphrase/controller/PassphraseCredentialLockController.php', ··· 2841 2829 'PhabricatorFeedStoryNotification' => 'applications/notification/storage/PhabricatorFeedStoryNotification.php', 2842 2830 'PhabricatorFeedStoryPublisher' => 'applications/feed/PhabricatorFeedStoryPublisher.php', 2843 2831 'PhabricatorFeedStoryReference' => 'applications/feed/storage/PhabricatorFeedStoryReference.php', 2844 - 'PhabricatorFerretDocument' => 'applications/search/ferret/PhabricatorFerretDocument.php', 2845 2832 'PhabricatorFerretEngine' => 'applications/search/ferret/PhabricatorFerretEngine.php', 2846 2833 'PhabricatorFerretEngineTestCase' => 'applications/search/ferret/__tests__/PhabricatorFerretEngineTestCase.php', 2847 - 'PhabricatorFerretField' => 'applications/search/ferret/PhabricatorFerretField.php', 2848 2834 'PhabricatorFerretFulltextEngineExtension' => 'applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php', 2849 2835 'PhabricatorFerretFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorFerretFulltextStorageEngine.php', 2850 2836 'PhabricatorFerretInterface' => 'applications/search/ferret/PhabricatorFerretInterface.php', 2851 2837 'PhabricatorFerretMetadata' => 'applications/search/ferret/PhabricatorFerretMetadata.php', 2852 - 'PhabricatorFerretNgrams' => 'applications/search/ferret/PhabricatorFerretNgrams.php', 2853 2838 'PhabricatorFerretSearchEngineExtension' => 'applications/search/engineextension/PhabricatorFerretSearchEngineExtension.php', 2854 2839 'PhabricatorFile' => 'applications/files/storage/PhabricatorFile.php', 2855 2840 'PhabricatorFileAES256StorageFormat' => 'applications/files/format/PhabricatorFileAES256StorageFormat.php', ··· 4265 4250 'PhabricatorUserEditorTestCase' => 'applications/people/editor/__tests__/PhabricatorUserEditorTestCase.php', 4266 4251 'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php', 4267 4252 'PhabricatorUserEmailTestCase' => 'applications/people/storage/__tests__/PhabricatorUserEmailTestCase.php', 4268 - 'PhabricatorUserFerretDocument' => 'applications/people/storage/PhabricatorUserFerretDocument.php', 4269 4253 'PhabricatorUserFerretEngine' => 'applications/people/search/PhabricatorUserFerretEngine.php', 4270 - 'PhabricatorUserFerretField' => 'applications/people/storage/PhabricatorUserFerretField.php', 4271 - 'PhabricatorUserFerretNgrams' => 'applications/people/storage/PhabricatorUserFerretNgrams.php', 4272 4254 'PhabricatorUserFulltextEngine' => 'applications/people/search/PhabricatorUserFulltextEngine.php', 4273 4255 'PhabricatorUserIconField' => 'applications/people/customfield/PhabricatorUserIconField.php', 4274 4256 'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.php', ··· 5564 5546 'DifferentialRevisionEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 5565 5547 'DifferentialRevisionEditController' => 'DifferentialController', 5566 5548 'DifferentialRevisionEditEngine' => 'PhabricatorEditEngine', 5567 - 'DifferentialRevisionFerretDocument' => 'PhabricatorFerretDocument', 5568 5549 'DifferentialRevisionFerretEngine' => 'PhabricatorFerretEngine', 5569 - 'DifferentialRevisionFerretField' => 'PhabricatorFerretField', 5570 - 'DifferentialRevisionFerretNgrams' => 'PhabricatorFerretNgrams', 5571 5550 'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine', 5572 5551 'DifferentialRevisionGraph' => 'PhabricatorObjectGraph', 5573 5552 'DifferentialRevisionHasChildRelationship' => 'DifferentialRevisionRelationship', ··· 6248 6227 'FundInitiativeEditController' => 'FundController', 6249 6228 'FundInitiativeEditEngine' => 'PhabricatorEditEngine', 6250 6229 'FundInitiativeEditor' => 'PhabricatorApplicationTransactionEditor', 6251 - 'FundInitiativeFerretDocument' => 'PhabricatorFerretDocument', 6252 6230 'FundInitiativeFerretEngine' => 'PhabricatorFerretEngine', 6253 - 'FundInitiativeFerretField' => 'PhabricatorFerretField', 6254 - 'FundInitiativeFerretNgrams' => 'PhabricatorFerretNgrams', 6255 6231 'FundInitiativeFulltextEngine' => 'PhabricatorFulltextEngine', 6256 6232 'FundInitiativeListController' => 'FundController', 6257 6233 'FundInitiativeMerchantTransaction' => 'FundInitiativeTransactionType', ··· 6719 6695 'ManiphestTaskEditBulkJobType' => 'PhabricatorWorkerBulkJobType', 6720 6696 'ManiphestTaskEditController' => 'ManiphestController', 6721 6697 'ManiphestTaskEditEngineLock' => 'PhabricatorEditEngineLock', 6722 - 'ManiphestTaskFerretDocument' => 'PhabricatorFerretDocument', 6723 6698 'ManiphestTaskFerretEngine' => 'PhabricatorFerretEngine', 6724 - 'ManiphestTaskFerretField' => 'PhabricatorFerretField', 6725 - 'ManiphestTaskFerretNgrams' => 'PhabricatorFerretNgrams', 6726 6699 'ManiphestTaskFulltextEngine' => 'PhabricatorFulltextEngine', 6727 6700 'ManiphestTaskGraph' => 'PhabricatorObjectGraph', 6728 6701 'ManiphestTaskHasCommitEdgeType' => 'PhabricatorEdgeType', ··· 7049 7022 'PassphraseCredentialDestroyController' => 'PassphraseController', 7050 7023 'PassphraseCredentialDestroyTransaction' => 'PassphraseCredentialTransactionType', 7051 7024 'PassphraseCredentialEditController' => 'PassphraseController', 7052 - 'PassphraseCredentialFerretDocument' => 'PhabricatorFerretDocument', 7053 7025 'PassphraseCredentialFerretEngine' => 'PhabricatorFerretEngine', 7054 - 'PassphraseCredentialFerretField' => 'PhabricatorFerretField', 7055 - 'PassphraseCredentialFerretNgrams' => 'PhabricatorFerretNgrams', 7056 7026 'PassphraseCredentialFulltextEngine' => 'PhabricatorFulltextEngine', 7057 7027 'PassphraseCredentialListController' => 'PassphraseController', 7058 7028 'PassphraseCredentialLockController' => 'PassphraseController', ··· 8192 8162 'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO', 8193 8163 'PhabricatorFeedStoryPublisher' => 'Phobject', 8194 8164 'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO', 8195 - 'PhabricatorFerretDocument' => 'PhabricatorSearchDAO', 8196 8165 'PhabricatorFerretEngine' => 'Phobject', 8197 8166 'PhabricatorFerretEngineTestCase' => 'PhabricatorTestCase', 8198 - 'PhabricatorFerretField' => 'PhabricatorSearchDAO', 8199 8167 'PhabricatorFerretFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', 8200 8168 'PhabricatorFerretFulltextStorageEngine' => 'PhabricatorFulltextStorageEngine', 8201 8169 'PhabricatorFerretMetadata' => 'Phobject', 8202 - 'PhabricatorFerretNgrams' => 'PhabricatorSearchDAO', 8203 8170 'PhabricatorFerretSearchEngineExtension' => 'PhabricatorSearchEngineExtension', 8204 8171 'PhabricatorFile' => array( 8205 8172 'PhabricatorFileDAO', ··· 9885 9852 'PhabricatorUserEditorTestCase' => 'PhabricatorTestCase', 9886 9853 'PhabricatorUserEmail' => 'PhabricatorUserDAO', 9887 9854 'PhabricatorUserEmailTestCase' => 'PhabricatorTestCase', 9888 - 'PhabricatorUserFerretDocument' => 'PhabricatorFerretDocument', 9889 9855 'PhabricatorUserFerretEngine' => 'PhabricatorFerretEngine', 9890 - 'PhabricatorUserFerretField' => 'PhabricatorFerretField', 9891 - 'PhabricatorUserFerretNgrams' => 'PhabricatorFerretNgrams', 9892 9856 'PhabricatorUserFulltextEngine' => 'PhabricatorFulltextEngine', 9893 9857 'PhabricatorUserIconField' => 'PhabricatorUserCustomField', 9894 9858 'PhabricatorUserLog' => array(
+8
src/applications/config/schema/PhabricatorConfigCoreSchemaSpec.php
··· 42 42 )); 43 43 } 44 44 45 + $ferret_objects = id(new PhutilClassMapQuery()) 46 + ->setAncestorClass('PhabricatorFerretInterface') 47 + ->execute(); 48 + 49 + foreach ($ferret_objects as $ferret_object) { 50 + $engine = $ferret_object->newFerretEngine(); 51 + $this->buildFerretIndexSchema($engine); 52 + } 45 53 } 46 54 }
+20
src/applications/config/schema/PhabricatorConfigSchemaSpec.php
··· 55 55 $object->getSchemaKeys()); 56 56 } 57 57 58 + protected function buildFerretIndexSchema(PhabricatorFerretEngine $engine) { 59 + $this->buildRawSchema( 60 + $engine->getApplicationName(), 61 + $engine->getDocumentTableName(), 62 + $engine->getDocumentSchemaColumns(), 63 + $engine->getDocumentSchemaKeys()); 64 + 65 + $this->buildRawSchema( 66 + $engine->getApplicationName(), 67 + $engine->getFieldTableName(), 68 + $engine->getFieldSchemaColumns(), 69 + $engine->getFieldSchemaKeys()); 70 + 71 + $this->buildRawSchema( 72 + $engine->getApplicationName(), 73 + $engine->getNgramsTableName(), 74 + $engine->getNgramsSchemaColumns(), 75 + $engine->getNgramsSchemaKeys()); 76 + } 77 + 58 78 protected function buildRawSchema( 59 79 $database_name, 60 80 $table_name,
+4 -8
src/applications/differential/search/DifferentialRevisionFerretEngine.php
··· 3 3 final class DifferentialRevisionFerretEngine 4 4 extends PhabricatorFerretEngine { 5 5 6 - public function newNgramsObject() { 7 - return new DifferentialRevisionFerretNgrams(); 8 - } 9 - 10 - public function newDocumentObject() { 11 - return new DifferentialRevisionFerretDocument(); 6 + public function getApplicationName() { 7 + return 'differential'; 12 8 } 13 9 14 - public function newFieldObject() { 15 - return new DifferentialRevisionFerretField(); 10 + public function getScopeName() { 11 + return 'revision'; 16 12 } 17 13 18 14 public function newSearchEngine() {
-14
src/applications/differential/storage/DifferentialRevisionFerretDocument.php
··· 1 - <?php 2 - 3 - final class DifferentialRevisionFerretDocument 4 - extends PhabricatorFerretDocument { 5 - 6 - public function getApplicationName() { 7 - return 'differential'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'revision'; 12 - } 13 - 14 - }
-14
src/applications/differential/storage/DifferentialRevisionFerretField.php
··· 1 - <?php 2 - 3 - final class DifferentialRevisionFerretField 4 - extends PhabricatorFerretField { 5 - 6 - public function getApplicationName() { 7 - return 'differential'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'revision'; 12 - } 13 - 14 - }
-14
src/applications/differential/storage/DifferentialRevisionFerretNgrams.php
··· 1 - <?php 2 - 3 - final class DifferentialRevisionFerretNgrams 4 - extends PhabricatorFerretNgrams { 5 - 6 - public function getApplicationName() { 7 - return 'differential'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'revision'; 12 - } 13 - 14 - }
+4 -8
src/applications/fund/search/FundInitiativeFerretEngine.php
··· 3 3 final class FundInitiativeFerretEngine 4 4 extends PhabricatorFerretEngine { 5 5 6 - public function newNgramsObject() { 7 - return new FundInitiativeFerretNgrams(); 8 - } 9 - 10 - public function newDocumentObject() { 11 - return new FundInitiativeFerretDocument(); 6 + public function getApplicationName() { 7 + return 'fund'; 12 8 } 13 9 14 - public function newFieldObject() { 15 - return new FundInitiativeFerretField(); 10 + public function getScopeName() { 11 + return 'initiative'; 16 12 } 17 13 18 14 public function newSearchEngine() {
-14
src/applications/fund/storage/FundInitiativeFerretDocument.php
··· 1 - <?php 2 - 3 - final class FundInitiativeFerretDocument 4 - extends PhabricatorFerretDocument { 5 - 6 - public function getApplicationName() { 7 - return 'fund'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'initiative'; 12 - } 13 - 14 - }
-14
src/applications/fund/storage/FundInitiativeFerretField.php
··· 1 - <?php 2 - 3 - final class FundInitiativeFerretField 4 - extends PhabricatorFerretField { 5 - 6 - public function getApplicationName() { 7 - return 'fund'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'initiative'; 12 - } 13 - 14 - }
-14
src/applications/fund/storage/FundInitiativeFerretNgrams.php
··· 1 - <?php 2 - 3 - final class FundInitiativeFerretNgrams 4 - extends PhabricatorFerretNgrams { 5 - 6 - public function getApplicationName() { 7 - return 'fund'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'initiative'; 12 - } 13 - 14 - }
+4 -8
src/applications/maniphest/search/ManiphestTaskFerretEngine.php
··· 3 3 final class ManiphestTaskFerretEngine 4 4 extends PhabricatorFerretEngine { 5 5 6 - public function newNgramsObject() { 7 - return new ManiphestTaskFerretNgrams(); 8 - } 9 - 10 - public function newDocumentObject() { 11 - return new ManiphestTaskFerretDocument(); 6 + public function getApplicationName() { 7 + return 'maniphest'; 12 8 } 13 9 14 - public function newFieldObject() { 15 - return new ManiphestTaskFerretField(); 10 + public function getScopeName() { 11 + return 'task'; 16 12 } 17 13 18 14 public function newSearchEngine() {
-14
src/applications/maniphest/storage/ManiphestTaskFerretDocument.php
··· 1 - <?php 2 - 3 - final class ManiphestTaskFerretDocument 4 - extends PhabricatorFerretDocument { 5 - 6 - public function getApplicationName() { 7 - return 'maniphest'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'task'; 12 - } 13 - 14 - }
-14
src/applications/maniphest/storage/ManiphestTaskFerretField.php
··· 1 - <?php 2 - 3 - final class ManiphestTaskFerretField 4 - extends PhabricatorFerretField { 5 - 6 - public function getApplicationName() { 7 - return 'maniphest'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'task'; 12 - } 13 - 14 - }
-14
src/applications/maniphest/storage/ManiphestTaskFerretNgrams.php
··· 1 - <?php 2 - 3 - final class ManiphestTaskFerretNgrams 4 - extends PhabricatorFerretNgrams { 5 - 6 - public function getApplicationName() { 7 - return 'maniphest'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'task'; 12 - } 13 - 14 - }
+4 -8
src/applications/passphrase/search/PassphraseCredentialFerretEngine.php
··· 3 3 final class PassphraseCredentialFerretEngine 4 4 extends PhabricatorFerretEngine { 5 5 6 - public function newNgramsObject() { 7 - return new PassphraseCredentialFerretNgrams(); 8 - } 9 - 10 - public function newDocumentObject() { 11 - return new PassphraseCredentialFerretDocument(); 6 + public function getApplicationName() { 7 + return 'passphrase'; 12 8 } 13 9 14 - public function newFieldObject() { 15 - return new PassphraseCredentialFerretField(); 10 + public function getScopeName() { 11 + return 'credential'; 16 12 } 17 13 18 14 public function newSearchEngine() {
-14
src/applications/passphrase/storage/PassphraseCredentialFerretDocument.php
··· 1 - <?php 2 - 3 - final class PassphraseCredentialFerretDocument 4 - extends PhabricatorFerretDocument { 5 - 6 - public function getApplicationName() { 7 - return 'passphrase'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'credential'; 12 - } 13 - 14 - }
-14
src/applications/passphrase/storage/PassphraseCredentialFerretField.php
··· 1 - <?php 2 - 3 - final class PassphraseCredentialFerretField 4 - extends PhabricatorFerretField { 5 - 6 - public function getApplicationName() { 7 - return 'passphrase'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'credential'; 12 - } 13 - 14 - }
-14
src/applications/passphrase/storage/PassphraseCredentialFerretNgrams.php
··· 1 - <?php 2 - 3 - final class PassphraseCredentialFerretNgrams 4 - extends PhabricatorFerretNgrams { 5 - 6 - public function getApplicationName() { 7 - return 'passphrase'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'credential'; 12 - } 13 - 14 - }
+4 -8
src/applications/people/search/PhabricatorUserFerretEngine.php
··· 3 3 final class PhabricatorUserFerretEngine 4 4 extends PhabricatorFerretEngine { 5 5 6 - public function newNgramsObject() { 7 - return new PhabricatorUserFerretNgrams(); 8 - } 9 - 10 - public function newDocumentObject() { 11 - return new PhabricatorUserFerretDocument(); 6 + public function getApplicationName() { 7 + return 'user'; 12 8 } 13 9 14 - public function newFieldObject() { 15 - return new PhabricatorUserFerretField(); 10 + public function getScopeName() { 11 + return 'user'; 16 12 } 17 13 18 14 public function newSearchEngine() {
-14
src/applications/people/storage/PhabricatorUserFerretDocument.php
··· 1 - <?php 2 - 3 - final class PhabricatorUserFerretDocument 4 - extends PhabricatorFerretDocument { 5 - 6 - public function getApplicationName() { 7 - return 'user'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'user'; 12 - } 13 - 14 - }
-14
src/applications/people/storage/PhabricatorUserFerretField.php
··· 1 - <?php 2 - 3 - final class PhabricatorUserFerretField 4 - extends PhabricatorFerretField { 5 - 6 - public function getApplicationName() { 7 - return 'user'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'user'; 12 - } 13 - 14 - }
-14
src/applications/people/storage/PhabricatorUserFerretNgrams.php
··· 1 - <?php 2 - 3 - final class PhabricatorUserFerretNgrams 4 - extends PhabricatorFerretNgrams { 5 - 6 - public function getApplicationName() { 7 - return 'user'; 8 - } 9 - 10 - public function getIndexKey() { 11 - return 'user'; 12 - } 13 - 14 - }
+44 -33
src/applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php
··· 47 47 } 48 48 } 49 49 50 - $ferret_document = $engine->newDocumentObject() 51 - ->setObjectPHID($phid) 52 - ->setIsClosed($is_closed) 53 - ->setEpochCreated($document->getDocumentCreated()) 54 - ->setEpochModified($document->getDocumentModified()) 55 - ->setAuthorPHID($author_phid) 56 - ->setOwnerPHID($owner_phid); 57 - 58 50 $stemmer = $engine->newStemmer(); 59 51 60 52 // Copy all of the "title" and "body" fields to create new "core" fields. ··· 133 125 $ngrams_source[] = $term_corpus; 134 126 } 135 127 136 - $ferret_fields[] = $engine->newFieldObject() 137 - ->setFieldKey($key) 138 - ->setRawCorpus($raw_corpus) 139 - ->setTermCorpus($term_corpus) 140 - ->setNormalCorpus($normal_corpus); 128 + $ferret_fields[] = array( 129 + 'fieldKey' => $key, 130 + 'rawCorpus' => $raw_corpus, 131 + 'termCorpus' => $term_corpus, 132 + 'normalCorpus' => $normal_corpus, 133 + ); 141 134 } 142 135 $ngrams_source = implode("\n", $ngrams_source); 143 136 144 137 $ngrams = $engine->getTermNgramsFromString($ngrams_source); 145 138 146 - $ferret_document->openTransaction(); 139 + $object->openTransaction(); 147 140 148 141 try { 142 + $conn = $object->establishConnection('w'); 149 143 $this->deleteOldDocument($engine, $object, $document); 150 144 151 - $ferret_document->save(); 145 + queryfx( 146 + $conn, 147 + 'INSERT INTO %T (objectPHID, isClosed, epochCreated, epochModified, 148 + authorPHID, ownerPHID) VALUES (%s, %d, %d, %d, %ns, %ns)', 149 + $engine->getDocumentTableName(), 150 + $object->getPHID(), 151 + $is_closed, 152 + $document->getDocumentCreated(), 153 + $document->getDocumentModified(), 154 + $author_phid, 155 + $owner_phid); 152 156 153 - $document_id = $ferret_document->getID(); 157 + $document_id = $conn->getInsertID(); 154 158 foreach ($ferret_fields as $ferret_field) { 155 - $ferret_field 156 - ->setDocumentID($document_id) 157 - ->save(); 159 + queryfx( 160 + $conn, 161 + 'INSERT INTO %T (documentID, fieldKey, rawCorpus, termCorpus, 162 + normalCorpus) VALUES (%d, %s, %s, %s, %s)', 163 + $engine->getFieldTableName(), 164 + $document_id, 165 + $ferret_field['fieldKey'], 166 + $ferret_field['rawCorpus'], 167 + $ferret_field['termCorpus'], 168 + $ferret_field['normalCorpus']); 158 169 } 159 170 160 - $ferret_ngrams = $engine->newNgramsObject(); 161 - $conn = $ferret_ngrams->establishConnection('w'); 162 - 163 171 $sql = array(); 164 172 foreach ($ngrams as $ngram) { 165 173 $sql[] = qsprintf( ··· 173 181 queryfx( 174 182 $conn, 175 183 'INSERT INTO %T (documentID, ngram) VALUES %Q', 176 - $ferret_ngrams->getTableName(), 184 + $engine->getNgramsTableName(), 177 185 $chunk); 178 186 } 179 187 } catch (Exception $ex) { 180 - $ferret_document->killTransaction(); 188 + $object->killTransaction(); 181 189 throw $ex; 182 190 } 183 191 184 - $ferret_document->saveTransaction(); 192 + $object->saveTransaction(); 185 193 } 186 194 187 195 ··· 190 198 $object, 191 199 PhabricatorSearchAbstractDocument $document) { 192 200 193 - $old_document = $engine->newDocumentObject()->loadOneWhere( 194 - 'objectPHID = %s', 195 - $document->getPHID()); 201 + $conn = $object->establishConnection('w'); 202 + 203 + $old_document = queryfx_one( 204 + $conn, 205 + 'SELECT * FROM %T WHERE objectPHID = %s', 206 + $engine->getDocumentTableName(), 207 + $object->getPHID()); 196 208 if (!$old_document) { 197 209 return; 198 210 } 199 211 200 - $conn = $old_document->establishConnection('w'); 201 - $old_id = $old_document->getID(); 212 + $old_id = $old_document['id']; 202 213 203 214 queryfx( 204 215 $conn, 205 216 'DELETE FROM %T WHERE id = %d', 206 - $engine->newDocumentObject()->getTableName(), 217 + $engine->getDocumentTableName(), 207 218 $old_id); 208 219 209 220 queryfx( 210 221 $conn, 211 222 'DELETE FROM %T WHERE documentID = %d', 212 - $engine->newFieldObject()->getTableName(), 223 + $engine->getFieldTableName(), 213 224 $old_id); 214 225 215 226 queryfx( 216 227 $conn, 217 228 'DELETE FROM %T WHERE documentID = %d', 218 - $engine->newNgramsObject()->getTableName(), 229 + $engine->getNgramsTableName(), 219 230 $old_id); 220 231 } 221 232
-52
src/applications/search/ferret/PhabricatorFerretDocument.php
··· 1 - <?php 2 - 3 - abstract class PhabricatorFerretDocument 4 - extends PhabricatorSearchDAO { 5 - 6 - protected $objectPHID; 7 - protected $isClosed; 8 - protected $authorPHID; 9 - protected $ownerPHID; 10 - protected $epochCreated; 11 - protected $epochModified; 12 - 13 - abstract public function getIndexKey(); 14 - 15 - protected function getConfiguration() { 16 - return array( 17 - self::CONFIG_TIMESTAMPS => false, 18 - self::CONFIG_COLUMN_SCHEMA => array( 19 - 'isClosed' => 'bool', 20 - 'authorPHID' => 'phid?', 21 - 'ownerPHID' => 'phid?', 22 - 'epochCreated' => 'epoch', 23 - 'epochModified' => 'epoch', 24 - ), 25 - self::CONFIG_KEY_SCHEMA => array( 26 - 'key_object' => array( 27 - 'columns' => array('objectPHID'), 28 - 'unique' => true, 29 - ), 30 - 'key_author' => array( 31 - 'columns' => array('authorPHID'), 32 - ), 33 - 'key_owner' => array( 34 - 'columns' => array('ownerPHID'), 35 - ), 36 - 'key_created' => array( 37 - 'columns' => array('epochCreated'), 38 - ), 39 - 'key_modified' => array( 40 - 'columns' => array('epochModified'), 41 - ), 42 - ), 43 - ) + parent::getConfiguration(); 44 - } 45 - 46 - public function getTableName() { 47 - $application = $this->getApplicationName(); 48 - $key = $this->getIndexKey(); 49 - return "{$application}_{$key}_fdocument"; 50 - } 51 - 52 - }
+109 -3
src/applications/search/ferret/PhabricatorFerretEngine.php
··· 2 2 3 3 abstract class PhabricatorFerretEngine extends Phobject { 4 4 5 - abstract public function newNgramsObject(); 6 - abstract public function newDocumentObject(); 7 - abstract public function newFieldObject(); 5 + abstract public function getApplicationName(); 6 + abstract public function getScopeName(); 8 7 abstract public function newSearchEngine(); 9 8 10 9 public function getDefaultFunctionKey() { ··· 166 165 } 167 166 168 167 return $term_corpus; 168 + } 169 + 170 + /* -( Schema )------------------------------------------------------------- */ 171 + 172 + public function getDocumentTableName() { 173 + $application = $this->getApplicationName(); 174 + $scope = $this->getScopeName(); 175 + 176 + return "{$application}_{$scope}_fdocument"; 177 + } 178 + 179 + public function getDocumentSchemaColumns() { 180 + return array( 181 + 'id' => 'auto', 182 + 'objectPHID' => 'phid', 183 + 'isClosed' => 'bool', 184 + 'authorPHID' => 'phid?', 185 + 'ownerPHID' => 'phid?', 186 + 'epochCreated' => 'epoch', 187 + 'epochModified' => 'epoch', 188 + ); 189 + } 190 + 191 + public function getDocumentSchemaKeys() { 192 + return array( 193 + 'PRIMARY' => array( 194 + 'columns' => array('id'), 195 + 'unique' => true, 196 + ), 197 + 'key_object' => array( 198 + 'columns' => array('objectPHID'), 199 + 'unique' => true, 200 + ), 201 + 'key_author' => array( 202 + 'columns' => array('authorPHID'), 203 + ), 204 + 'key_owner' => array( 205 + 'columns' => array('ownerPHID'), 206 + ), 207 + 'key_created' => array( 208 + 'columns' => array('epochCreated'), 209 + ), 210 + 'key_modified' => array( 211 + 'columns' => array('epochModified'), 212 + ), 213 + ); 214 + } 215 + 216 + public function getFieldTableName() { 217 + $application = $this->getApplicationName(); 218 + $scope = $this->getScopeName(); 219 + 220 + return "{$application}_{$scope}_ffield"; 221 + } 222 + 223 + public function getFieldSchemaColumns() { 224 + return array( 225 + 'id' => 'auto', 226 + 'documentID' => 'uint32', 227 + 'fieldKey' => 'text4', 228 + 'rawCorpus' => 'sort', 229 + 'termCorpus' => 'sort', 230 + 'normalCorpus' => 'sort', 231 + ); 232 + } 233 + 234 + public function getFieldSchemaKeys() { 235 + return array( 236 + 'PRIMARY' => array( 237 + 'columns' => array('id'), 238 + 'unique' => true, 239 + ), 240 + 'key_documentfield' => array( 241 + 'columns' => array('documentID', 'fieldKey'), 242 + 'unique' => true, 243 + ), 244 + ); 245 + } 246 + 247 + public function getNgramsTableName() { 248 + $application = $this->getApplicationName(); 249 + $scope = $this->getScopeName(); 250 + 251 + return "{$application}_{$scope}_fngrams"; 252 + } 253 + 254 + public function getNgramsSchemaColumns() { 255 + return array( 256 + 'id' => 'auto', 257 + 'documentID' => 'uint32', 258 + 'ngram' => 'char3', 259 + ); 260 + } 261 + 262 + public function getNgramsSchemaKeys() { 263 + return array( 264 + 'PRIMARY' => array( 265 + 'columns' => array('id'), 266 + 'unique' => true, 267 + ), 268 + 'key_ngram' => array( 269 + 'columns' => array('ngram', 'documentID'), 270 + ), 271 + 'key_object' => array( 272 + 'columns' => array('documentID'), 273 + ), 274 + ); 169 275 } 170 276 171 277 }
-39
src/applications/search/ferret/PhabricatorFerretField.php
··· 1 - <?php 2 - 3 - abstract class PhabricatorFerretField 4 - extends PhabricatorSearchDAO { 5 - 6 - protected $documentID; 7 - protected $fieldKey; 8 - protected $rawCorpus; 9 - protected $termCorpus; 10 - protected $normalCorpus; 11 - 12 - abstract public function getIndexKey(); 13 - 14 - protected function getConfiguration() { 15 - return array( 16 - self::CONFIG_TIMESTAMPS => false, 17 - self::CONFIG_COLUMN_SCHEMA => array( 18 - 'documentID' => 'uint32', 19 - 'fieldKey' => 'text4', 20 - 'rawCorpus' => 'sort', 21 - 'termCorpus' => 'sort', 22 - 'normalCorpus' => 'sort', 23 - ), 24 - self::CONFIG_KEY_SCHEMA => array( 25 - 'key_documentfield' => array( 26 - 'columns' => array('documentID', 'fieldKey'), 27 - 'unique' => true, 28 - ), 29 - ), 30 - ) + parent::getConfiguration(); 31 - } 32 - 33 - public function getTableName() { 34 - $application = $this->getApplicationName(); 35 - $key = $this->getIndexKey(); 36 - return "{$application}_{$key}_ffield"; 37 - } 38 - 39 - }
-35
src/applications/search/ferret/PhabricatorFerretNgrams.php
··· 1 - <?php 2 - 3 - abstract class PhabricatorFerretNgrams 4 - extends PhabricatorSearchDAO { 5 - 6 - protected $documentID; 7 - protected $ngram; 8 - 9 - abstract public function getIndexKey(); 10 - 11 - protected function getConfiguration() { 12 - return array( 13 - self::CONFIG_TIMESTAMPS => false, 14 - self::CONFIG_COLUMN_SCHEMA => array( 15 - 'documentID' => 'uint32', 16 - 'ngram' => 'char3', 17 - ), 18 - self::CONFIG_KEY_SCHEMA => array( 19 - 'key_ngram' => array( 20 - 'columns' => array('ngram', 'documentID'), 21 - ), 22 - 'key_object' => array( 23 - 'columns' => array('documentID'), 24 - ), 25 - ), 26 - ) + parent::getConfiguration(); 27 - } 28 - 29 - public function getTableName() { 30 - $application = $this->getApplicationName(); 31 - $key = $this->getIndexKey(); 32 - return "{$application}_{$key}_fngrams"; 33 - } 34 - 35 - }
+6 -7
src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php
··· 1623 1623 $engine = $this->ferretEngine; 1624 1624 $stemmer = $engine->newStemmer(); 1625 1625 1626 - $ngram_table = $engine->newNgramsObject(); 1627 - $ngram_table_name = $ngram_table->getTableName(); 1626 + $ngram_table = $engine->getNgramsTableName(); 1628 1627 1629 1628 $flat = array(); 1630 1629 foreach ($this->ferretTokens as $fulltext_token) { ··· 1680 1679 1681 1680 foreach ($ngrams as $ngram) { 1682 1681 $flat[] = array( 1683 - 'table' => $ngram_table_name, 1682 + 'table' => $ngram_table, 1684 1683 'ngram' => $ngram, 1685 1684 ); 1686 1685 } ··· 1702 1701 $phid_column = qsprintf($conn, '%T', 'phid'); 1703 1702 } 1704 1703 1705 - $document_table = $engine->newDocumentObject(); 1706 - $field_table = $engine->newFieldObject(); 1704 + $document_table = $engine->getDocumentTableName(); 1705 + $field_table = $engine->getFieldTableName(); 1707 1706 1708 1707 $joins = array(); 1709 1708 $joins[] = qsprintf( 1710 1709 $conn, 1711 1710 'JOIN %T ft_doc ON ft_doc.objectPHID = %Q', 1712 - $document_table->getTableName(), 1711 + $document_table, 1713 1712 $phid_column); 1714 1713 1715 1714 $idx = 1; ··· 1736 1735 $conn, 1737 1736 'JOIN %T %T ON ft_doc.id = %T.documentID 1738 1737 AND %T.fieldKey = %s', 1739 - $field_table->getTableName(), 1738 + $field_table, 1740 1739 $alias, 1741 1740 $alias, 1742 1741 $alias,