@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.

Add basic search capabilities to Packages

Summary: Ref T8116. Add search-by-name and per-package / per-publisher search to Packages.

Test Plan: Searched publishers, packages, versions by name. Searched packages by publisher. Searched versions by package.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T8116

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

+212 -32
+7
resources/sql/autopatches/20160722.pack.01.pubngrams.sql
··· 1 + CREATE TABLE {$NAMESPACE}_packages.packages_publishername_ngrams ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + objectID INT UNSIGNED NOT NULL, 4 + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, 5 + KEY `key_object` (objectID), 6 + KEY `key_ngram` (ngram, objectID) 7 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+7
resources/sql/autopatches/20160722.pack.02.pkgngrams.sql
··· 1 + CREATE TABLE {$NAMESPACE}_packages.packages_packagename_ngrams ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + objectID INT UNSIGNED NOT NULL, 4 + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, 5 + KEY `key_object` (objectID), 6 + KEY `key_ngram` (ngram, objectID) 7 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+7
resources/sql/autopatches/20160722.pack.03.versionngrams.sql
··· 1 + CREATE TABLE {$NAMESPACE}_packages.packages_versionname_ngrams ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + objectID INT UNSIGNED NOT NULL, 4 + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, 5 + KEY `key_object` (objectID), 6 + KEY `key_ngram` (ngram, objectID) 7 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+11
src/__phutil_library_map__.php
··· 2978 2978 'PhabricatorPackagesDAO' => 'applications/packages/storage/PhabricatorPackagesDAO.php', 2979 2979 'PhabricatorPackagesEditEngine' => 'applications/packages/editor/PhabricatorPackagesEditEngine.php', 2980 2980 'PhabricatorPackagesEditor' => 'applications/packages/editor/PhabricatorPackagesEditor.php', 2981 + 'PhabricatorPackagesNgrams' => 'applications/packages/storage/PhabricatorPackagesNgrams.php', 2981 2982 'PhabricatorPackagesPackage' => 'applications/packages/storage/PhabricatorPackagesPackage.php', 2982 2983 'PhabricatorPackagesPackageController' => 'applications/packages/controller/PhabricatorPackagesPackageController.php', 2983 2984 'PhabricatorPackagesPackageDatasource' => 'applications/packages/typeahead/PhabricatorPackagesPackageDatasource.php', ··· 2989 2990 'PhabricatorPackagesPackageEditor' => 'applications/packages/editor/PhabricatorPackagesPackageEditor.php', 2990 2991 'PhabricatorPackagesPackageKeyTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackageKeyTransaction.php', 2991 2992 'PhabricatorPackagesPackageListController' => 'applications/packages/controller/PhabricatorPackagesPackageListController.php', 2993 + 'PhabricatorPackagesPackageNameNgrams' => 'applications/packages/storage/PhabricatorPackagesPackageNameNgrams.php', 2992 2994 'PhabricatorPackagesPackageNameTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackageNameTransaction.php', 2993 2995 'PhabricatorPackagesPackagePHIDType' => 'applications/packages/phid/PhabricatorPackagesPackagePHIDType.php', 2994 2996 'PhabricatorPackagesPackagePublisherTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackagePublisherTransaction.php', ··· 3009 3011 'PhabricatorPackagesPublisherEditor' => 'applications/packages/editor/PhabricatorPackagesPublisherEditor.php', 3010 3012 'PhabricatorPackagesPublisherKeyTransaction' => 'applications/packages/xaction/publisher/PhabricatorPackagesPublisherKeyTransaction.php', 3011 3013 'PhabricatorPackagesPublisherListController' => 'applications/packages/controller/PhabricatorPackagesPublisherListController.php', 3014 + 'PhabricatorPackagesPublisherNameNgrams' => 'applications/packages/storage/PhabricatorPackagesPublisherNameNgrams.php', 3012 3015 'PhabricatorPackagesPublisherNameTransaction' => 'applications/packages/xaction/publisher/PhabricatorPackagesPublisherNameTransaction.php', 3013 3016 'PhabricatorPackagesPublisherPHIDType' => 'applications/packages/phid/PhabricatorPackagesPublisherPHIDType.php', 3014 3017 'PhabricatorPackagesPublisherQuery' => 'applications/packages/query/PhabricatorPackagesPublisherQuery.php', ··· 3028 3031 'PhabricatorPackagesVersionEditEngine' => 'applications/packages/editor/PhabricatorPackagesVersionEditEngine.php', 3029 3032 'PhabricatorPackagesVersionEditor' => 'applications/packages/editor/PhabricatorPackagesVersionEditor.php', 3030 3033 'PhabricatorPackagesVersionListController' => 'applications/packages/controller/PhabricatorPackagesVersionListController.php', 3034 + 'PhabricatorPackagesVersionNameNgrams' => 'applications/packages/storage/PhabricatorPackagesVersionNameNgrams.php', 3031 3035 'PhabricatorPackagesVersionNameTransaction' => 'applications/packages/xaction/version/PhabricatorPackagesVersionNameTransaction.php', 3032 3036 'PhabricatorPackagesVersionPHIDType' => 'applications/packages/phid/PhabricatorPackagesVersionPHIDType.php', 3033 3037 'PhabricatorPackagesVersionPackageTransaction' => 'applications/packages/xaction/version/PhabricatorPackagesVersionPackageTransaction.php', ··· 7797 7801 'PhabricatorPackagesDAO' => 'PhabricatorLiskDAO', 7798 7802 'PhabricatorPackagesEditEngine' => 'PhabricatorEditEngine', 7799 7803 'PhabricatorPackagesEditor' => 'PhabricatorApplicationTransactionEditor', 7804 + 'PhabricatorPackagesNgrams' => 'PhabricatorSearchNgrams', 7800 7805 'PhabricatorPackagesPackage' => array( 7801 7806 'PhabricatorPackagesDAO', 7802 7807 'PhabricatorPolicyInterface', ··· 7805 7810 'PhabricatorSubscribableInterface', 7806 7811 'PhabricatorProjectInterface', 7807 7812 'PhabricatorConduitResultInterface', 7813 + 'PhabricatorNgramsInterface', 7808 7814 ), 7809 7815 'PhabricatorPackagesPackageController' => 'PhabricatorPackagesController', 7810 7816 'PhabricatorPackagesPackageDatasource' => 'PhabricatorTypeaheadDatasource', ··· 7816 7822 'PhabricatorPackagesPackageEditor' => 'PhabricatorPackagesEditor', 7817 7823 'PhabricatorPackagesPackageKeyTransaction' => 'PhabricatorPackagesPackageTransactionType', 7818 7824 'PhabricatorPackagesPackageListController' => 'PhabricatorPackagesPackageController', 7825 + 'PhabricatorPackagesPackageNameNgrams' => 'PhabricatorPackagesNgrams', 7819 7826 'PhabricatorPackagesPackageNameTransaction' => 'PhabricatorPackagesPackageTransactionType', 7820 7827 'PhabricatorPackagesPackagePHIDType' => 'PhabricatorPHIDType', 7821 7828 'PhabricatorPackagesPackagePublisherTransaction' => 'PhabricatorPackagesPackageTransactionType', ··· 7834 7841 'PhabricatorSubscribableInterface', 7835 7842 'PhabricatorProjectInterface', 7836 7843 'PhabricatorConduitResultInterface', 7844 + 'PhabricatorNgramsInterface', 7837 7845 ), 7838 7846 'PhabricatorPackagesPublisherController' => 'PhabricatorPackagesController', 7839 7847 'PhabricatorPackagesPublisherDatasource' => 'PhabricatorTypeaheadDatasource', ··· 7844 7852 'PhabricatorPackagesPublisherEditor' => 'PhabricatorPackagesEditor', 7845 7853 'PhabricatorPackagesPublisherKeyTransaction' => 'PhabricatorPackagesPublisherTransactionType', 7846 7854 'PhabricatorPackagesPublisherListController' => 'PhabricatorPackagesPublisherController', 7855 + 'PhabricatorPackagesPublisherNameNgrams' => 'PhabricatorPackagesNgrams', 7847 7856 'PhabricatorPackagesPublisherNameTransaction' => 'PhabricatorPackagesPublisherTransactionType', 7848 7857 'PhabricatorPackagesPublisherPHIDType' => 'PhabricatorPHIDType', 7849 7858 'PhabricatorPackagesPublisherQuery' => 'PhabricatorPackagesQuery', ··· 7865 7874 'PhabricatorSubscribableInterface', 7866 7875 'PhabricatorProjectInterface', 7867 7876 'PhabricatorConduitResultInterface', 7877 + 'PhabricatorNgramsInterface', 7868 7878 ), 7869 7879 'PhabricatorPackagesVersionController' => 'PhabricatorPackagesController', 7870 7880 'PhabricatorPackagesVersionEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', ··· 7872 7882 'PhabricatorPackagesVersionEditEngine' => 'PhabricatorPackagesEditEngine', 7873 7883 'PhabricatorPackagesVersionEditor' => 'PhabricatorPackagesEditor', 7874 7884 'PhabricatorPackagesVersionListController' => 'PhabricatorPackagesVersionController', 7885 + 'PhabricatorPackagesVersionNameNgrams' => 'PhabricatorPackagesNgrams', 7875 7886 'PhabricatorPackagesVersionNameTransaction' => 'PhabricatorPackagesVersionTransactionType', 7876 7887 'PhabricatorPackagesVersionPHIDType' => 'PhabricatorPHIDType', 7877 7888 'PhabricatorPackagesVersionPackageTransaction' => 'PhabricatorPackagesVersionTransactionType',
+10
src/applications/packages/editor/PhabricatorPackagesEditor.php
··· 7 7 return 'PhabricatorPasteApplication'; 8 8 } 9 9 10 + protected function supportsSearch() { 11 + return true; 12 + } 13 + 14 + protected function shouldPublishFeedStory( 15 + PhabricatorLiskDAO $object, 16 + array $xactions) { 17 + return true; 18 + } 19 + 10 20 }
-6
src/applications/packages/editor/PhabricatorPackagesPackageEditor.php
··· 24 24 return $types; 25 25 } 26 26 27 - protected function shouldPublishFeedStory( 28 - PhabricatorLiskDAO $object, 29 - array $xactions) { 30 - return true; 31 - } 32 - 33 27 protected function getMailTo(PhabricatorLiskDAO $object) { 34 28 return array(); 35 29 }
-6
src/applications/packages/editor/PhabricatorPackagesPublisherEditor.php
··· 21 21 return $types; 22 22 } 23 23 24 - protected function shouldPublishFeedStory( 25 - PhabricatorLiskDAO $object, 26 - array $xactions) { 27 - return true; 28 - } 29 - 30 24 protected function getMailTo(PhabricatorLiskDAO $object) { 31 25 return array(); 32 26 }
-6
src/applications/packages/editor/PhabricatorPackagesVersionEditor.php
··· 15 15 return pht('%s created %s.', $author, $object); 16 16 } 17 17 18 - protected function shouldPublishFeedStory( 19 - PhabricatorLiskDAO $object, 20 - array $xactions) { 21 - return true; 22 - } 23 - 24 18 protected function getMailTo(PhabricatorLiskDAO $object) { 25 19 return array(); 26 20 }
+7 -1
src/applications/packages/query/PhabricatorPackagesPackageQuery.php
··· 34 34 return $this; 35 35 } 36 36 37 + public function withNameNgrams($ngrams) { 38 + return $this->withNgramsConstraint( 39 + new PhabricatorPackagesPackageNameNgrams(), 40 + $ngrams); 41 + } 42 + 37 43 public function newResultObject() { 38 44 return new PhabricatorPackagesPackage(); 39 45 } ··· 62 68 if ($this->publisherPHIDs !== null) { 63 69 $where[] = qsprintf( 64 70 $conn, 65 - 'p.phid IN (%Ls)', 71 + 'p.publisherPHID IN (%Ls)', 66 72 $this->publisherPHIDs); 67 73 } 68 74
+20 -1
src/applications/packages/query/PhabricatorPackagesPackageSearchEngine.php
··· 18 18 protected function buildQueryFromParameters(array $map) { 19 19 $query = $this->newQuery(); 20 20 21 + if ($map['match'] !== null) { 22 + $query->withNameNgrams($map['match']); 23 + } 24 + 25 + if ($map['publisherPHIDs']) { 26 + $query->withPublisherPHIDs($map['publisherPHIDs']); 27 + } 28 + 21 29 return $query; 22 30 } 23 31 24 32 protected function buildCustomSearchFields() { 25 - return array(); 33 + return array( 34 + id(new PhabricatorSearchTextField()) 35 + ->setLabel(pht('Name Contains')) 36 + ->setKey('match') 37 + ->setDescription(pht('Search for packages by name substring.')), 38 + id(new PhabricatorSearchDatasourceField()) 39 + ->setLabel(pht('Publishers')) 40 + ->setKey('publisherPHIDs') 41 + ->setAliases(array('publisherPHID', 'publisher', 'publishers')) 42 + ->setDatasource(new PhabricatorPackagesPublisherDatasource()) 43 + ->setDescription(pht('Search for packages by publisher.')), 44 + ); 26 45 } 27 46 28 47 protected function getURI($path) {
+13 -3
src/applications/packages/query/PhabricatorPackagesPublisherQuery.php
··· 22 22 return $this; 23 23 } 24 24 25 + public function withNameNgrams($ngrams) { 26 + return $this->withNgramsConstraint( 27 + new PhabricatorPackagesPublisherNameNgrams(), 28 + $ngrams); 29 + } 30 + 25 31 public function newResultObject() { 26 32 return new PhabricatorPackagesPublisher(); 27 33 } ··· 36 42 if ($this->ids !== null) { 37 43 $where[] = qsprintf( 38 44 $conn, 39 - 'id IN (%Ld)', 45 + 'u.id IN (%Ld)', 40 46 $this->ids); 41 47 } 42 48 43 49 if ($this->phids !== null) { 44 50 $where[] = qsprintf( 45 51 $conn, 46 - 'phid IN (%Ls)', 52 + 'u.phid IN (%Ls)', 47 53 $this->phids); 48 54 } 49 55 50 56 if ($this->publisherKeys !== null) { 51 57 $where[] = qsprintf( 52 58 $conn, 53 - 'publisherKey IN (%Ls)', 59 + 'u.publisherKey IN (%Ls)', 54 60 $this->publisherKeys); 55 61 } 56 62 57 63 return $where; 64 + } 65 + 66 + protected function getPrimaryTableAlias() { 67 + return 'u'; 58 68 } 59 69 60 70 }
+10 -1
src/applications/packages/query/PhabricatorPackagesPublisherSearchEngine.php
··· 18 18 protected function buildQueryFromParameters(array $map) { 19 19 $query = $this->newQuery(); 20 20 21 + if ($map['match'] !== null) { 22 + $query->withNameNgrams($map['match']); 23 + } 24 + 21 25 return $query; 22 26 } 23 27 24 28 protected function buildCustomSearchFields() { 25 - return array(); 29 + return array( 30 + id(new PhabricatorSearchTextField()) 31 + ->setLabel(pht('Name Contains')) 32 + ->setKey('match') 33 + ->setDescription(pht('Search for publishers by name substring.')), 34 + ); 26 35 } 27 36 28 37 protected function getURI($path) {
+6
src/applications/packages/query/PhabricatorPackagesVersionQuery.php
··· 34 34 return $this; 35 35 } 36 36 37 + public function withNameNgrams($ngrams) { 38 + return $this->withNgramsConstraint( 39 + new PhabricatorPackagesVersionNameNgrams(), 40 + $ngrams); 41 + } 42 + 37 43 public function newResultObject() { 38 44 return new PhabricatorPackagesVersion(); 39 45 }
+20 -2
src/applications/packages/query/PhabricatorPackagesVersionSearchEngine.php
··· 18 18 protected function buildQueryFromParameters(array $map) { 19 19 $query = $this->newQuery(); 20 20 21 + if ($map['match'] !== null) { 22 + $query->withNameNgrams($map['match']); 23 + } 24 + 25 + if ($map['packagePHIDs']) { 26 + $query->withPackagePHIDs($map['packagePHIDs']); 27 + } 28 + 21 29 return $query; 22 30 } 23 31 24 32 protected function buildCustomSearchFields() { 25 - return array(); 33 + return array( 34 + id(new PhabricatorSearchTextField()) 35 + ->setLabel(pht('Name Contains')) 36 + ->setKey('match') 37 + ->setDescription(pht('Search for versions by name substring.')), 38 + id(new PhabricatorSearchDatasourceField()) 39 + ->setLabel(pht('Packages')) 40 + ->setKey('packagePHIDs') 41 + ->setAliases(array('packagePHID', 'package', 'packages')) 42 + ->setDatasource(new PhabricatorPackagesPackageDatasource()) 43 + ->setDescription(pht('Search for versions by package.')), 44 + ); 26 45 } 27 - 28 46 protected function getURI($path) { 29 47 return '/packages/version/'.$path; 30 48 }
+10
src/applications/packages/storage/PhabricatorPackagesNgrams.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorPackagesNgrams 4 + extends PhabricatorSearchNgrams { 5 + 6 + public function getApplicationName() { 7 + return 'packages'; 8 + } 9 + 10 + }
+14 -2
src/applications/packages/storage/PhabricatorPackagesPackage.php
··· 8 8 PhabricatorDestructibleInterface, 9 9 PhabricatorSubscribableInterface, 10 10 PhabricatorProjectInterface, 11 - PhabricatorConduitResultInterface { 11 + PhabricatorConduitResultInterface, 12 + PhabricatorNgramsInterface { 12 13 13 14 protected $name; 14 15 protected $publisherPHID; ··· 39 40 return array( 40 41 self::CONFIG_AUX_PHID => true, 41 42 self::CONFIG_COLUMN_SCHEMA => array( 42 - 'name' => 'text64', 43 + 'name' => 'sort64', 43 44 'packageKey' => 'sort64', 44 45 ), 45 46 self::CONFIG_KEY_SCHEMA => array( ··· 204 205 PhabricatorApplicationTransactionView $timeline, 205 206 AphrontRequest $request) { 206 207 return $timeline; 208 + } 209 + 210 + 211 + /* -( PhabricatorNgramsInterface )----------------------------------------- */ 212 + 213 + 214 + public function newNgrams() { 215 + return array( 216 + id(new PhabricatorPackagesPackageNameNgrams()) 217 + ->setValue($this->getName()), 218 + ); 207 219 } 208 220 209 221
+14
src/applications/packages/storage/PhabricatorPackagesPackageNameNgrams.php
··· 1 + <?php 2 + 3 + final class PhabricatorPackagesPackageNameNgrams 4 + extends PhabricatorPackagesNgrams { 5 + 6 + public function getNgramKey() { 7 + return 'packagename'; 8 + } 9 + 10 + public function getColumnName() { 11 + return 'name'; 12 + } 13 + 14 + }
+14 -2
src/applications/packages/storage/PhabricatorPackagesPublisher.php
··· 8 8 PhabricatorDestructibleInterface, 9 9 PhabricatorSubscribableInterface, 10 10 PhabricatorProjectInterface, 11 - PhabricatorConduitResultInterface { 11 + PhabricatorConduitResultInterface, 12 + PhabricatorNgramsInterface { 12 13 13 14 protected $name; 14 15 protected $publisherKey; ··· 31 32 return array( 32 33 self::CONFIG_AUX_PHID => true, 33 34 self::CONFIG_COLUMN_SCHEMA => array( 34 - 'name' => 'text64', 35 + 'name' => 'sort64', 35 36 'publisherKey' => 'sort64', 36 37 ), 37 38 self::CONFIG_KEY_SCHEMA => array( ··· 180 181 PhabricatorApplicationTransactionView $timeline, 181 182 AphrontRequest $request) { 182 183 return $timeline; 184 + } 185 + 186 + 187 + /* -( PhabricatorNgramsInterface )----------------------------------------- */ 188 + 189 + 190 + public function newNgrams() { 191 + return array( 192 + id(new PhabricatorPackagesPublisherNameNgrams()) 193 + ->setValue($this->getName()), 194 + ); 183 195 } 184 196 185 197
+14
src/applications/packages/storage/PhabricatorPackagesPublisherNameNgrams.php
··· 1 + <?php 2 + 3 + final class PhabricatorPackagesPublisherNameNgrams 4 + extends PhabricatorPackagesNgrams { 5 + 6 + public function getNgramKey() { 7 + return 'publishername'; 8 + } 9 + 10 + public function getColumnName() { 11 + return 'name'; 12 + } 13 + 14 + }
+13 -1
src/applications/packages/storage/PhabricatorPackagesVersion.php
··· 9 9 PhabricatorDestructibleInterface, 10 10 PhabricatorSubscribableInterface, 11 11 PhabricatorProjectInterface, 12 - PhabricatorConduitResultInterface { 12 + PhabricatorConduitResultInterface, 13 + PhabricatorNgramsInterface { 13 14 14 15 protected $name; 15 16 protected $packagePHID; ··· 171 172 PhabricatorApplicationTransactionView $timeline, 172 173 AphrontRequest $request) { 173 174 return $timeline; 175 + } 176 + 177 + 178 + /* -( PhabricatorNgramsInterface )----------------------------------------- */ 179 + 180 + 181 + public function newNgrams() { 182 + return array( 183 + id(new PhabricatorPackagesVersionNameNgrams()) 184 + ->setValue($this->getName()), 185 + ); 174 186 } 175 187 176 188
+14
src/applications/packages/storage/PhabricatorPackagesVersionNameNgrams.php
··· 1 + <?php 2 + 3 + final class PhabricatorPackagesVersionNameNgrams 4 + extends PhabricatorPackagesNgrams { 5 + 6 + public function getNgramKey() { 7 + return 'versionname'; 8 + } 9 + 10 + public function getColumnName() { 11 + return 'name'; 12 + } 13 + 14 + }
+1 -1
src/applications/packages/typeahead/PhabricatorPackagesPackageDatasource.php
··· 4 4 extends PhabricatorTypeaheadDatasource { 5 5 6 6 public function getBrowseTitle() { 7 - return pht('Browse Packagess'); 7 + return pht('Browse Packages'); 8 8 } 9 9 10 10 public function getPlaceholderText() {