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

Allow Almanac namespaces to be searched by ngram index

Summary: Ref T6741. Ref T10246. This is largely modernization, but will partially support namespace locking in Almanac.

Test Plan:
Searched for Almanac networks by name substring.

{F1121740}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T6741, T10246

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

+92 -35
+7
resources/sql/autopatches/20160221.almanac.5.networkn.sql
··· 1 + CREATE TABLE {$NAMESPACE}_almanac.almanac_networkname_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
resources/sql/autopatches/20160221.almanac.6.networki.php
··· 1 + <?php 2 + 3 + $table = new AlmanacNetwork(); 4 + 5 + foreach (new LiskMigrationIterator($table) as $network) { 6 + PhabricatorSearchWorker::queueDocumentForIndexing( 7 + $network->getPHID(), 8 + array( 9 + 'force' => true, 10 + )); 11 + }
+3
src/__phutil_library_map__.php
··· 66 66 'AlmanacNetworkEditController' => 'applications/almanac/controller/AlmanacNetworkEditController.php', 67 67 'AlmanacNetworkEditor' => 'applications/almanac/editor/AlmanacNetworkEditor.php', 68 68 'AlmanacNetworkListController' => 'applications/almanac/controller/AlmanacNetworkListController.php', 69 + 'AlmanacNetworkNameNgrams' => 'applications/almanac/storage/AlmanacNetworkNameNgrams.php', 69 70 'AlmanacNetworkPHIDType' => 'applications/almanac/phid/AlmanacNetworkPHIDType.php', 70 71 'AlmanacNetworkQuery' => 'applications/almanac/query/AlmanacNetworkQuery.php', 71 72 'AlmanacNetworkSearchEngine' => 'applications/almanac/query/AlmanacNetworkSearchEngine.php', ··· 4051 4052 'PhabricatorApplicationTransactionInterface', 4052 4053 'PhabricatorPolicyInterface', 4053 4054 'PhabricatorDestructibleInterface', 4055 + 'PhabricatorNgramsInterface', 4054 4056 ), 4055 4057 'AlmanacNetworkController' => 'AlmanacController', 4056 4058 'AlmanacNetworkEditController' => 'AlmanacNetworkController', 4057 4059 'AlmanacNetworkEditor' => 'PhabricatorApplicationTransactionEditor', 4058 4060 'AlmanacNetworkListController' => 'AlmanacNetworkController', 4061 + 'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams', 4059 4062 'AlmanacNetworkPHIDType' => 'PhabricatorPHIDType', 4060 4063 'AlmanacNetworkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4061 4064 'AlmanacNetworkSearchEngine' => 'PhabricatorApplicationSearchEngine',
+4
src/applications/almanac/editor/AlmanacNetworkEditor.php
··· 11 11 return pht('Almanac Network'); 12 12 } 13 13 14 + protected function supportsSearch() { 15 + return true; 16 + } 17 + 14 18 public function getTransactionTypes() { 15 19 $types = parent::getTransactionTypes(); 16 20
+20 -19
src/applications/almanac/query/AlmanacNetworkQuery.php
··· 16 16 return $this; 17 17 } 18 18 19 - protected function loadPage() { 20 - $table = new AlmanacNetwork(); 21 - $conn_r = $table->establishConnection('r'); 19 + public function newResultObject() { 20 + return new AlmanacNetwork(); 21 + } 22 22 23 - $data = queryfx_all( 24 - $conn_r, 25 - 'SELECT * FROM %T %Q %Q %Q', 26 - $table->getTableName(), 27 - $this->buildWhereClause($conn_r), 28 - $this->buildOrderClause($conn_r), 29 - $this->buildLimitClause($conn_r)); 23 + public function withNameNgrams($ngrams) { 24 + return $this->withNgramsConstraint( 25 + new AlmanacNetworkNameNgrams(), 26 + $ngrams); 27 + } 30 28 31 - return $table->loadAllFromArray($data); 29 + protected function loadPage() { 30 + return $this->loadStandardPage($this->newResultObject()); 32 31 } 33 32 34 - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { 35 - $where = array(); 33 + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { 34 + $where = parent::buildWhereClauseParts($conn); 36 35 37 36 if ($this->ids !== null) { 38 37 $where[] = qsprintf( 39 - $conn_r, 40 - 'id IN (%Ld)', 38 + $conn, 39 + 'network.id IN (%Ld)', 41 40 $this->ids); 42 41 } 43 42 44 43 if ($this->phids !== null) { 45 44 $where[] = qsprintf( 46 - $conn_r, 47 - 'phid IN (%Ls)', 45 + $conn, 46 + 'network.phid IN (%Ls)', 48 47 $this->phids); 49 48 } 50 49 51 - $where[] = $this->buildPagingClause($conn_r); 50 + return $where; 51 + } 52 52 53 - return $this->formatWhereClause($where); 53 + protected function getPrimaryTableAlias() { 54 + return 'network'; 54 55 } 55 56 56 57 public function getQueryApplicationClass() {
+16 -15
src/applications/almanac/query/AlmanacNetworkSearchEngine.php
··· 11 11 return 'PhabricatorAlmanacApplication'; 12 12 } 13 13 14 - public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 - $saved = new PhabricatorSavedQuery(); 14 + public function newQuery() { 15 + return new AlmanacNetworkQuery(); 16 + } 16 17 17 - return $saved; 18 + protected function buildCustomSearchFields() { 19 + return array( 20 + id(new PhabricatorSearchTextField()) 21 + ->setLabel(pht('Name Contains')) 22 + ->setKey('match') 23 + ->setDescription(pht('Search for devices by name substring.')), 24 + ); 18 25 } 19 26 20 - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 21 - $query = id(new AlmanacNetworkQuery()); 27 + protected function buildQueryFromParameters(array $map) { 28 + $query = $this->newQuery(); 29 + 30 + if ($map['match'] !== null) { 31 + $query->withNameNgrams($map['match']); 32 + } 22 33 23 34 return $query; 24 35 } 25 - 26 - public function buildSearchForm( 27 - AphrontFormView $form, 28 - PhabricatorSavedQuery $saved_query) {} 29 36 30 37 protected function getURI($path) { 31 38 return '/almanac/network/'.$path; ··· 50 57 } 51 58 52 59 return parent::buildSavedQueryFromBuiltin($query_key); 53 - } 54 - 55 - protected function getRequiredHandlePHIDsForResultList( 56 - array $networks, 57 - PhabricatorSavedQuery $query) { 58 - return array(); 59 60 } 60 61 61 62 protected function renderResultList(
+13 -1
src/applications/almanac/storage/AlmanacNetwork.php
··· 5 5 implements 6 6 PhabricatorApplicationTransactionInterface, 7 7 PhabricatorPolicyInterface, 8 - PhabricatorDestructibleInterface { 8 + PhabricatorDestructibleInterface, 9 + PhabricatorNgramsInterface { 9 10 10 11 protected $name; 11 12 protected $mailKey; ··· 112 113 } 113 114 114 115 $this->delete(); 116 + } 117 + 118 + 119 + /* -( PhabricatorNgramInterface )------------------------------------------ */ 120 + 121 + 122 + public function newNgrams() { 123 + return array( 124 + id(new AlmanacNetworkNameNgrams()) 125 + ->setValue($this->getName()), 126 + ); 115 127 } 116 128 117 129 }
+18
src/applications/almanac/storage/AlmanacNetworkNameNgrams.php
··· 1 + <?php 2 + 3 + final class AlmanacNetworkNameNgrams 4 + extends PhabricatorSearchNgrams { 5 + 6 + public function getNgramKey() { 7 + return 'networkname'; 8 + } 9 + 10 + public function getColumnName() { 11 + return 'name'; 12 + } 13 + 14 + public function getApplicationName() { 15 + return 'almanac'; 16 + } 17 + 18 + }