diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 08c7ac047b..edd5b8790b 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -271,6 +271,8 @@ phutil_register_library_map(array( 'DiffusionSvnHistoryQuery' => 'applications/diffusion/query/history/svn', 'DiffusionSvnLastModifiedQuery' => 'applications/diffusion/query/lastmodified/svn', 'DiffusionSvnRequest' => 'applications/diffusion/request/svn', + 'DiffusionSymbolController' => 'applications/diffusion/controller/symbol', + 'DiffusionSymbolQuery' => 'applications/diffusion/query/symbol', 'DiffusionView' => 'applications/diffusion/view/base', 'HeraldAction' => 'applications/herald/storage/action', 'HeraldActionConfig' => 'applications/herald/config/action', @@ -919,6 +921,7 @@ phutil_register_library_map(array( 'DiffusionSvnHistoryQuery' => 'DiffusionHistoryQuery', 'DiffusionSvnLastModifiedQuery' => 'DiffusionLastModifiedQuery', 'DiffusionSvnRequest' => 'DiffusionRequest', + 'DiffusionSymbolController' => 'DiffusionController', 'DiffusionView' => 'AphrontView', 'HeraldAction' => 'HeraldDAO', 'HeraldApplyTranscript' => 'HeraldDAO', diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index 004b45b5a9..eecef65cd6 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -252,6 +252,7 @@ class AphrontDefaultApplicationConfiguration '$' => 'DiffusionCommitListController', '(?P\w+)/$' => 'DiffusionCommitListController', ), + 'symbol/(?P[^/]+)/$' => 'DiffusionSymbolController', ), '/daemon/' => array( diff --git a/src/applications/diffusion/controller/symbol/DiffusionSymbolController.php b/src/applications/diffusion/controller/symbol/DiffusionSymbolController.php new file mode 100644 index 0000000000..55a0f5ef19 --- /dev/null +++ b/src/applications/diffusion/controller/symbol/DiffusionSymbolController.php @@ -0,0 +1,80 @@ +name = $data['name']; + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $query = new DiffusionSymbolQuery(); + $query->setNamePrefix($this->name); + + if ($request->getStr('type')) { + $query->setType($request->getStr('type')); + } + + if ($request->getStr('lang')) { + $query->setLanguage($request->getStr('lang')); + } + + $symbols = $query->execute(); + + $rows = array(); + foreach ($symbols as $symbol) { + $rows[] = array( + phutil_escape_html($symbol->getSymbolType()), + phutil_escape_html($symbol->getSymbolName()), + phutil_escape_html($symbol->getSymbolLanguage()), + ); + } + + $table = new AphrontTableView($rows); + $table->setHeaders( + array( + 'Type', + 'Name', + 'Language', + )); + $table->setColumnClasses( + array( + '', + 'pri', + '', + )); + + $panel = new AphrontPanelView(); + $panel->setHeader('Similar Symbols'); + $panel->appendChild($table); + + return $this->buildStandardPageResponse( + array( + $panel, + ), + array( + 'title' => 'Find Symbol', + )); + } + +} diff --git a/src/applications/diffusion/controller/symbol/__init__.php b/src/applications/diffusion/controller/symbol/__init__.php new file mode 100644 index 0000000000..a16792507e --- /dev/null +++ b/src/applications/diffusion/controller/symbol/__init__.php @@ -0,0 +1,17 @@ +name = $name; + return $this; + } + + public function setNamePrefix($name_prefix) { + $this->namePrefix = $name_prefix; + return $this; + } + + public function setProjectIDs(array $project_ids) { + $this->projectIDs = $project_ids; + return $this; + } + + public function setLanguage($language) { + $this->language = $language; + return $this; + } + + public function setType($type) { + $this->type = $type; + return $this; + } + + public function setLimit($limit) { + $this->limit = $limit; + return $this; + } + + public function execute() { + if ($this->name && $this->namePrefix) { + throw new Exception( + "You can not set both a name and a name prefix!"); + } else if (!$this->name && !$this->namePrefix) { + throw new Exception( + "You must set a name or a name prefix!"); + } + + $symbol = new PhabricatorRepositorySymbol(); + $conn_r = $symbol->establishConnection('r'); + + $where = array(); + if ($this->name) { + $where[] = qsprintf( + $conn_r, + 'symbolName = %s', + $this->name); + } + + if ($this->namePrefix) { + $where[] = qsprintf( + $conn_r, + 'symbolName LIKE %>', + $this->namePrefix); + } + + if ($this->projectIDs) { + $where[] = qsprintf( + $conn_r, + 'arcanistProjectID IN (%Ld)', + $this->projectIDs); + } + + $where = 'WHERE ('.implode(') AND (', $where).')'; + + $data = queryfx_all( + $conn_r, + 'SELECT * FROM %T %Q', + $symbol->getTableName(), + $where); + + // Our ability to match up symbol types and languages probably isn't all + // that great, so use them as hints for ranking rather than hard + // requirements. TODO: Is this really the right choice? + foreach ($data as $key => $row) { + $score = 0; + if ($this->language && $row['symbolLanguage'] == $this->language) { + $score += 2; + } + if ($this->type && $row['symbolType'] == $this->type) { + $score += 1; + } + $data[$key]['score'] = $score; + $data[$key]['id'] = $key; + } + + $data = isort($data, 'score'); + $data = array_reverse($data); + + $data = array_slice($data, 0, $this->limit); + + return $symbol->loadAllFromArray($data); + } +} diff --git a/src/applications/diffusion/query/symbol/__init__.php b/src/applications/diffusion/query/symbol/__init__.php new file mode 100644 index 0000000000..4a44ee5ff7 --- /dev/null +++ b/src/applications/diffusion/query/symbol/__init__.php @@ -0,0 +1,16 @@ +