diff --git a/resources/sql/autopatches/20161011.conpherence.ngrams.php b/resources/sql/autopatches/20161011.conpherence.ngrams.php new file mode 100644 index 0000000000..457143f6c7 --- /dev/null +++ b/resources/sql/autopatches/20161011.conpherence.ngrams.php @@ -0,0 +1,11 @@ +getPHID(), + array( + 'force' => true, + )); +} diff --git a/resources/sql/autopatches/20161011.conpherence.ngrams.sql b/resources/sql/autopatches/20161011.conpherence.ngrams.sql new file mode 100644 index 0000000000..e06c1489f7 --- /dev/null +++ b/resources/sql/autopatches/20161011.conpherence.ngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_conpherence.conpherence_threadtitle_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 05142f0e9e..fb6cbb32ae 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -313,6 +313,7 @@ phutil_register_library_map(array( 'ConpherenceSchemaSpec' => 'applications/conpherence/storage/ConpherenceSchemaSpec.php', 'ConpherenceTestCase' => 'applications/conpherence/__tests__/ConpherenceTestCase.php', 'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php', + 'ConpherenceThreadDatasource' => 'applications/conpherence/typeahead/ConpherenceThreadDatasource.php', 'ConpherenceThreadIndexEngineExtension' => 'applications/conpherence/engineextension/ConpherenceThreadIndexEngineExtension.php', 'ConpherenceThreadListView' => 'applications/conpherence/view/ConpherenceThreadListView.php', 'ConpherenceThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceThreadMailReceiver.php', @@ -320,6 +321,7 @@ phutil_register_library_map(array( 'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', 'ConpherenceThreadRemarkupRule' => 'applications/conpherence/remarkup/ConpherenceThreadRemarkupRule.php', 'ConpherenceThreadSearchEngine' => 'applications/conpherence/query/ConpherenceThreadSearchEngine.php', + 'ConpherenceThreadTitleNgrams' => 'applications/conpherence/storage/ConpherenceThreadTitleNgrams.php', 'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php', 'ConpherenceTransactionComment' => 'applications/conpherence/storage/ConpherenceTransactionComment.php', 'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php', @@ -4814,7 +4816,9 @@ phutil_register_library_map(array( 'PhabricatorApplicationTransactionInterface', 'PhabricatorMentionableInterface', 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', ), + 'ConpherenceThreadDatasource' => 'PhabricatorTypeaheadDatasource', 'ConpherenceThreadIndexEngineExtension' => 'PhabricatorIndexEngineExtension', 'ConpherenceThreadListView' => 'AphrontView', 'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver', @@ -4822,6 +4826,7 @@ phutil_register_library_map(array( 'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'ConpherenceThreadRemarkupRule' => 'PhabricatorObjectRemarkupRule', 'ConpherenceThreadSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'ConpherenceThreadTitleNgrams' => 'PhabricatorSearchNgrams', 'ConpherenceTransaction' => 'PhabricatorApplicationTransaction', 'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment', 'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', diff --git a/src/applications/conpherence/query/ConpherenceThreadQuery.php b/src/applications/conpherence/query/ConpherenceThreadQuery.php index 640a19a612..7cb7003121 100644 --- a/src/applications/conpherence/query/ConpherenceThreadQuery.php +++ b/src/applications/conpherence/query/ConpherenceThreadQuery.php @@ -76,6 +76,12 @@ final class ConpherenceThreadQuery return $this; } + public function withTitleNgrams($ngrams) { + return $this->withNgramsConstraint( + id(new ConpherenceThreadTitleNgrams()), + $ngrams); + } + protected function loadPage() { $table = new ConpherenceThread(); $conn_r = $table->establishConnection('r'); diff --git a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php index f2c172b0f2..f41bf835e7 100644 --- a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php +++ b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php @@ -22,8 +22,13 @@ final class ConpherenceThreadSearchEngine ->setLabel(pht('Participants')) ->setKey('participants') ->setAliases(array('participant')), + id(new PhabricatorSearchDatasourceField()) + ->setLabel(pht('Rooms')) + ->setKey('phids') + ->setDescription(pht('Search by room titles.')) + ->setDatasource(id(new ConpherenceThreadDatasource())), id(new PhabricatorSearchTextField()) - ->setLabel(pht('Contains Words')) + ->setLabel(pht('Room Contains Words')) ->setKey('fulltext'), ); } @@ -47,7 +52,9 @@ final class ConpherenceThreadSearchEngine if ($map['fulltext']) { $query->withFulltext($map['fulltext']); } - + if ($map['phids']) { + $query->withPHIDs($map['phids']); + } return $query; } diff --git a/src/applications/conpherence/storage/ConpherenceThread.php b/src/applications/conpherence/storage/ConpherenceThread.php index 36930f6151..6032835c42 100644 --- a/src/applications/conpherence/storage/ConpherenceThread.php +++ b/src/applications/conpherence/storage/ConpherenceThread.php @@ -5,7 +5,8 @@ final class ConpherenceThread extends ConpherenceDAO PhabricatorPolicyInterface, PhabricatorApplicationTransactionInterface, PhabricatorMentionableInterface, - PhabricatorDestructibleInterface { + PhabricatorDestructibleInterface, + PhabricatorNgramsInterface { protected $title; protected $topic; @@ -427,6 +428,16 @@ final class ConpherenceThread extends ConpherenceDAO return $timeline; } +/* -( PhabricatorNgramInterface )------------------------------------------ */ + + + public function newNgrams() { + return array( + id(new ConpherenceThreadTitleNgrams()) + ->setValue($this->getTitle()), + ); + } + /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/conpherence/storage/ConpherenceThreadTitleNgrams.php b/src/applications/conpherence/storage/ConpherenceThreadTitleNgrams.php new file mode 100644 index 0000000000..7f8ec99d02 --- /dev/null +++ b/src/applications/conpherence/storage/ConpherenceThreadTitleNgrams.php @@ -0,0 +1,17 @@ +getViewer(); + $raw_query = $this->getRawQuery(); + + $rooms = id(new ConpherenceThreadQuery()) + ->setViewer($viewer) + ->withTitleNgrams($raw_query) + ->needParticipants(true) + ->execute(); + + $results = array(); + foreach ($rooms as $room) { + if (strlen($room->getTopic())) { + $topic = $room->getTopic(); + } else { + $topic = phutil_tag('em', array(), pht('No topic set')); + } + + $token = id(new PhabricatorTypeaheadResult()) + ->setName($room->getTitle()) + ->setPHID($room->getPHID()) + ->addAttribute($topic); + + $results[] = $token; + } + + return $results; + } + +}