More Search-related PhpDoc additions

Summary: I'm still trying to understand search a bit better. As a side effect I add PhpDocs.

Test Plan: Inspect parameter and return formats, types, content while searching in Phorge.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D26042
This commit is contained in:
Andre Klapper 2025-05-31 23:32:08 +02:00
parent a7f94af9cf
commit e410020f78
4 changed files with 108 additions and 0 deletions

View file

@ -5,6 +5,10 @@ abstract class PhabricatorSearchEngineExtension extends Phobject {
private $viewer; private $viewer;
private $searchEngine; private $searchEngine;
/**
* @return string The EXTENSIONKEY of the PhabricatorSearchEngineExtension
* subclass
*/
final public function getExtensionKey() { final public function getExtensionKey() {
return $this->getPhobjectClassConstant('EXTENSIONKEY'); return $this->getPhobjectClassConstant('EXTENSIONKEY');
} }
@ -14,6 +18,9 @@ abstract class PhabricatorSearchEngineExtension extends Phobject {
return $this; return $this;
} }
/**
* @return PhabricatorUser
*/
final public function getViewer() { final public function getViewer() {
return $this->viewer; return $this->viewer;
} }
@ -24,22 +31,43 @@ abstract class PhabricatorSearchEngineExtension extends Phobject {
return $this; return $this;
} }
/**
* @return PhabricatorApplicationSearchEngine A subclass of
* PhabricatorApplicationSearchEngine
*/
final public function getSearchEngine() { final public function getSearchEngine() {
return $this->searchEngine; return $this->searchEngine;
} }
/**
* @return bool
*/
abstract public function isExtensionEnabled(); abstract public function isExtensionEnabled();
/**
* @return string Description of the Search Engine Extension
*/
abstract public function getExtensionName(); abstract public function getExtensionName();
/**
* @return bool
*/
abstract public function supportsObject($object); abstract public function supportsObject($object);
public function getExtensionOrder() { public function getExtensionOrder() {
return 7000; return 7000;
} }
/**
* @return array<PhabricatorSearchField> Subclasses of
* PhabricatorSearchField, or an empty array
*/
public function getSearchFields($object) { public function getSearchFields($object) {
return array(); return array();
} }
/**
* @return array<PhabricatorSearchEngineAttachment> Subclasses of
* PhabricatorSearchEngineAttachment, or an empty array
*/
public function getSearchAttachments($object) { public function getSearchAttachments($object) {
return array(); return array();
} }
@ -64,6 +92,11 @@ abstract class PhabricatorSearchEngineExtension extends Phobject {
return array(); return array();
} }
/**
* @return map<string, PhabricatorSearchEngineExtension> Array of
* PhabricatorSearchEngineExtension extension keys and the
* PhabricatorSearchEngineExtension subclasses
*/
final public static function getAllExtensions() { final public static function getAllExtensions() {
return id(new PhutilClassMapQuery()) return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__) ->setAncestorClass(__CLASS__)

View file

@ -6,8 +6,18 @@ abstract class PhabricatorFerretEngine extends Phobject {
private $ferretFunctions; private $ferretFunctions;
private $templateObject; private $templateObject;
/**
* @return string Application name in lower-case, e.g. 'maniphest'
*/
abstract public function getApplicationName(); abstract public function getApplicationName();
/**
* @return string Object name in lower-case, e.g. 'task'
*/
abstract public function getScopeName(); abstract public function getScopeName();
/**
* @return string New instance of the corresponding
* PhabricatorApplicationSearchEngine subclass
*/
abstract public function newSearchEngine(); abstract public function newSearchEngine();
public function getDefaultFunctionKey() { public function getDefaultFunctionKey() {
@ -47,10 +57,16 @@ abstract class PhabricatorFerretEngine extends Phobject {
return $this->fieldMap[$raw_name]; return $this->fieldMap[$raw_name];
} }
/**
* @return PhutilSearchStemmer New instance of PhutilSearchStemmer
*/
public function newStemmer() { public function newStemmer() {
return new PhutilSearchStemmer(); return new PhutilSearchStemmer();
} }
/**
* @return string
*/
public function newTermsCorpus($raw_corpus) { public function newTermsCorpus($raw_corpus) {
$term_corpus = strtr( $term_corpus = strtr(
$raw_corpus, $raw_corpus,
@ -108,6 +124,10 @@ abstract class PhabricatorFerretEngine extends Phobject {
/* -( Schema )------------------------------------------------------------- */ /* -( Schema )------------------------------------------------------------- */
/**
* @return string Name of database table, e.g. 'calendar_event_fdocument' or
* 'maniphest_task_fdocument' or 'phame_post_fdocument'
*/
public function getDocumentTableName() { public function getDocumentTableName() {
$application = $this->getApplicationName(); $application = $this->getApplicationName();
$scope = $this->getScopeName(); $scope = $this->getScopeName();
@ -152,6 +172,10 @@ abstract class PhabricatorFerretEngine extends Phobject {
); );
} }
/**
* @return string Name of database table, e.g. 'calendar_event_ffield' or
* 'maniphest_task_ffield' or 'phame_post_ffield'
*/
public function getFieldTableName() { public function getFieldTableName() {
$application = $this->getApplicationName(); $application = $this->getApplicationName();
$scope = $this->getScopeName(); $scope = $this->getScopeName();
@ -183,6 +207,10 @@ abstract class PhabricatorFerretEngine extends Phobject {
); );
} }
/**
* @return string Name of database table, e.g. 'calendar_event_fngrams' or
* 'maniphest_task_fngrams' or 'phame_post_fngrams'
*/
public function getNgramsTableName() { public function getNgramsTableName() {
$application = $this->getApplicationName(); $application = $this->getApplicationName();
$scope = $this->getScopeName(); $scope = $this->getScopeName();
@ -213,6 +241,11 @@ abstract class PhabricatorFerretEngine extends Phobject {
); );
} }
/**
* @return string Name of database table, e.g.
* 'calendar_event_fngrams_common' or 'maniphest_task_fngrams_common' or
* 'phame_post_fngrams_common'
*/
public function getCommonNgramsTableName() { public function getCommonNgramsTableName() {
$application = $this->getApplicationName(); $application = $this->getApplicationName();
$scope = $this->getScopeName(); $scope = $this->getScopeName();

View file

@ -11,6 +11,10 @@ final class PhabricatorFerretMetadata extends Phobject {
return $this; return $this;
} }
/**
* @return PhabricatorFerretEngine A subclass of PhabricatorFerretEngine,
* e.g. DiffusionCommitFerretEngine or ManiphestTaskFerretEngine
*/
public function getEngine() { public function getEngine() {
return $this->engine; return $this->engine;
} }
@ -20,6 +24,9 @@ final class PhabricatorFerretMetadata extends Phobject {
return $this; return $this;
} }
/**
* @return string PHID of a search result
*/
public function getPHID() { public function getPHID() {
return $this->phid; return $this->phid;
} }
@ -29,10 +36,16 @@ final class PhabricatorFerretMetadata extends Phobject {
return $this; return $this;
} }
/**
* @return int
*/
public function getRelevance() { public function getRelevance() {
return $this->relevance; return $this->relevance;
} }
/**
* @return PhutilSortVector
*/
public function getRelevanceSortVector() { public function getRelevanceSortVector() {
$engine = $this->getEngine(); $engine = $this->getEngine();

View file

@ -3,14 +3,34 @@
abstract class FerretSearchFunction abstract class FerretSearchFunction
extends Phobject { extends Phobject {
/**
* @return string Ferret function name, e.g. 'title', 'body', 'comment',
* 'core', 'all'
*/
abstract public function getFerretFunctionName(); abstract public function getFerretFunctionName();
/**
* @return string Ferret field key, e.g. 'titl', 'body', 'cmnt', 'core',
* 'full'
*/
abstract public function getFerretFieldKey(); abstract public function getFerretFieldKey();
/**
* @return bool
*/
abstract public function supportsObject(PhabricatorFerretInterface $object); abstract public function supportsObject(PhabricatorFerretInterface $object);
/**
* @param string $name
* @return string Lower-case $name
*/
final public static function getNormalizedFunctionName($name) { final public static function getNormalizedFunctionName($name) {
return phutil_utf8_strtolower($name); return phutil_utf8_strtolower($name);
} }
/**
* @param string $function_name
* @return void
* @throws Exception if $function_name is invalid
*/
final public static function validateFerretFunctionName($function_name) { final public static function validateFerretFunctionName($function_name) {
if (!preg_match('/^[a-zA-Z-]+\z/', $function_name)) { if (!preg_match('/^[a-zA-Z-]+\z/', $function_name)) {
throw new Exception( throw new Exception(
@ -22,6 +42,12 @@ abstract class FerretSearchFunction
} }
} }
/**
* @param string $field_key Ferret search engine field key, supposed to be
* four characters and only lowercase latin letters
* @return void
* @throws Exception if $field_key is invalid
*/
final public static function validateFerretFunctionFieldKey($field_key) { final public static function validateFerretFunctionFieldKey($field_key) {
if (!preg_match('/^[a-z]{4}\z/', $field_key)) { if (!preg_match('/^[a-z]{4}\z/', $field_key)) {
throw new Exception( throw new Exception(
@ -33,6 +59,9 @@ abstract class FerretSearchFunction
} }
} }
/**
* @return array<string,FerretSearchFunction>
*/
final public static function newFerretSearchFunctions() { final public static function newFerretSearchFunctions() {
$extensions = PhabricatorFulltextEngineExtension::getAllExtensions(); $extensions = PhabricatorFulltextEngineExtension::getAllExtensions();