public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $query = new PhabricatorSearchQuery();
     $query_str = $request->getStr('query');
     $matches = array();
     $query->setQuery($query_str);
     $query->setParameter('type', $this->type);
     switch ($request->getStr('filter')) {
         case 'assigned':
             $query->setParameter('owner', array($user->getPHID()));
             $query->setParameter('open', 1);
             break;
         case 'created':
             $query->setParameter('author', array($user->getPHID()));
             $query->setParameter('open', 1);
             break;
         case 'open':
             $query->setParameter('open', 1);
             break;
     }
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     $results = $engine->executeSearch($query);
     $phids = array_fill_keys(ipull($results, 'phid'), true);
     $phids += $this->queryObjectNames($query_str);
     $phids = array_keys($phids);
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $data = array();
     foreach ($handles as $handle) {
         $view = new PhabricatorHandleObjectSelectorDataView($handle);
         $data[] = $view->renderData();
     }
     return id(new AphrontAjaxResponse())->setContent($data);
 }
 public function indexDocumentByPHID($phid)
 {
     try {
         $document = $this->buildAbstractDocumentByPHID($phid);
         $object = $this->loadDocumentByPHID($phid);
         // Automatically rebuild CustomField indexes if the object uses custom
         // fields.
         if ($object instanceof PhabricatorCustomFieldInterface) {
             $this->indexCustomFields($document, $object);
         }
         // Automatically rebuild subscriber indexes if the object is subscribable.
         if ($object instanceof PhabricatorSubscribableInterface) {
             $this->indexSubscribers($document);
         }
         $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
         try {
             $engine->reindexAbstractDocument($document);
         } catch (Exception $ex) {
             $phid = $document->getPHID();
             $class = get_class($engine);
             phlog("Unable to index document {$phid} with engine {$class}.");
             phlog($ex);
         }
         $this->dispatchDidUpdateIndexEvent($phid, $document);
     } catch (Exception $ex) {
         $class = get_class($this);
         phlog("Unable to build document {$phid} with indexer {$class}.");
         phlog($ex);
     }
     return $this;
 }
 protected static final function reindexAbstractDocument(PhabricatorSearchAbstractDocument $document)
 {
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     try {
         $engine->reindexAbstractDocument($document);
     } catch (Exception $ex) {
         $phid = $document->getPHID();
         $class = get_class($engine);
         phlog("Unable to index document {$phid} by engine {$class}.");
     }
 }
 public function processRequest()
 {
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     $document = $engine->reconstructDocument($this->phid);
     if (!$document) {
         return new Aphront404Response();
     }
     $panels = array();
     $panel = new AphrontPanelView();
     $panel->setHeader('Abstract Document Index');
     $props = array('PHID' => phutil_escape_html($document->getPHID()), 'Title' => phutil_escape_html($document->getDocumentTitle()), 'Type' => phutil_escape_html($document->getDocumentType()));
     $rows = array();
     foreach ($props as $name => $value) {
         $rows[] = array($name, $value);
     }
     $table = new AphrontTableView($rows);
     $table->setColumnClasses(array('header', ''));
     $panel->appendChild($table);
     $panels[] = $panel;
     $panel = new AphrontPanelView();
     $panel->setHeader('Document Fields');
     $fields = $document->getFieldData();
     $rows = array();
     foreach ($fields as $field) {
         list($name, $corpus, $aux_phid) = $field;
         $rows[] = array(phutil_escape_html($name), phutil_escape_html(nonempty($aux_phid, null)), str_replace("\n", '<br />', phutil_escape_html($corpus)));
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('Field', 'Aux PHID', 'Corpus'));
     $table->setColumnClasses(array('', '', 'wide'));
     $panel->appendChild($table);
     $panels[] = $panel;
     $panel = new AphrontPanelView();
     $panel->setHeader('Document Relationships');
     $relationships = $document->getRelationshipData();
     $phids = ipull($relationships, 1);
     $handles = $this->loadViewerHandles($phids);
     $rows = array();
     foreach ($relationships as $relationship) {
         list($type, $phid, $rtype, $time) = $relationship;
         $rows[] = array(phutil_escape_html($type), phutil_escape_html($phid), phutil_escape_html($rtype), $handles[$phid]->renderLink());
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('Relationship', 'Related PHID', 'Related Type', 'Related Handle'));
     $table->setColumnClasses(array('', '', '', 'wide'));
     $panel->appendChild($table);
     $panels[] = $panel;
     return $this->buildStandardPageResponse($panels, array('title' => 'Raw Index'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     if ($this->username) {
         $user = id(new PhabricatorUser())->loadOneWhere('username = %s', $this->username);
     } else {
         $user = $request->getUser();
     }
     $content = array();
     if (!$user) {
         $error_view = new AphrontErrorView();
         $error_view->setSeverity(AphrontErrorView::SEVERITY_ERROR);
         $error_body = 'User name ' . '<b>' . phutil_escape_html($this->username) . '</b>' . ' doesn\'t exist.';
         $error_view->setTitle("Error");
         $error_view->appendChild('<p>' . $error_body . '</p>');
         $content[] = $error_view;
     } else {
         $pager = new AphrontPagerView();
         $pager->setOffset($request->getInt('offset'));
         $pager->setURI($request->getRequestURI(), 'offset');
         $query = new PhabricatorSearchQuery();
         $query->setParameter('type', PhabricatorPHIDConstants::PHID_TYPE_CMIT);
         $query->setParameter('author', array($user->getPHID()));
         $query->setParameter('limit', $pager->getPageSize() + 1);
         $query->setParameter('offset', $pager->getOffset());
         $user_link = phutil_render_tag('a', array('href' => '/p/' . $user->getUsername() . '/'), phutil_escape_html($user->getUsername()));
         $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
         $results = $engine->executeSearch($query);
         $results = $pager->sliceResults($results);
         $result_phids = ipull($results, 'phid');
         $commit_table = self::createCommitTable($result_phids, $user);
         $list_panel = new AphrontPanelView();
         $list_panel->setHeader('Commits by ' . $user_link);
         $list_panel->appendChild($commit_table);
         $list_panel->appendChild($pager);
         $content[] = $list_panel;
     }
     return $this->buildStandardPageResponse($content, array('title' => 'Commit List'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     if ($this->key) {
         $query = id(new PhabricatorSearchQuery())->loadOneWhere('queryKey = %s', $this->key);
         if (!$query) {
             return new Aphront404Response();
         }
     } else {
         $query = new PhabricatorSearchQuery();
         if ($request->isFormPost()) {
             $query_str = $request->getStr('query');
             $pref_jump = PhabricatorUserPreferences::PREFERENCE_SEARCHBAR_JUMP;
             if ($request->getStr('jump') != 'no' && $user && $user->loadPreferences()->getPreference($pref_jump, 1)) {
                 $response = PhabricatorJumpNavHandler::jumpPostResponse($query_str);
             } else {
                 $response = null;
             }
             if ($response) {
                 return $response;
             } else {
                 $query->setQuery($query_str);
                 if ($request->getStr('scope')) {
                     switch ($request->getStr('scope')) {
                         case PhabricatorSearchScope::SCOPE_OPEN_REVISIONS:
                             $query->setParameter('open', 1);
                             $query->setParameter('type', PhabricatorPHIDConstants::PHID_TYPE_DREV);
                             break;
                         case PhabricatorSearchScope::SCOPE_OPEN_TASKS:
                             $query->setParameter('open', 1);
                             $query->setParameter('type', PhabricatorPHIDConstants::PHID_TYPE_TASK);
                             break;
                         case PhabricatorSearchScope::SCOPE_WIKI:
                             $query->setParameter('type', PhabricatorPHIDConstants::PHID_TYPE_WIKI);
                             break;
                         case PhabricatorSearchScope::SCOPE_COMMITS:
                             $query->setParameter('type', PhabricatorPHIDConstants::PHID_TYPE_CMIT);
                             break;
                         default:
                             break;
                     }
                 } else {
                     if (strlen($request->getStr('type'))) {
                         $query->setParameter('type', $request->getStr('type'));
                     }
                     if ($request->getArr('author')) {
                         $query->setParameter('author', $request->getArr('author'));
                     }
                     if ($request->getArr('owner')) {
                         $query->setParameter('owner', $request->getArr('owner'));
                     }
                     if ($request->getInt('open')) {
                         $query->setParameter('open', $request->getInt('open'));
                     }
                     if ($request->getArr('project')) {
                         $query->setParameter('project', $request->getArr('project'));
                     }
                 }
                 $query->save();
                 return id(new AphrontRedirectResponse())->setURI('/search/' . $query->getQueryKey() . '/');
             }
         }
     }
     $options = array('' => 'All Documents') + PhabricatorSearchAbstractDocument::getSupportedTypes();
     $status_options = array(0 => 'Open and Closed Documents', 1 => 'Open Documents');
     $phids = array_merge($query->getParameter('author', array()), $query->getParameter('owner', array()), $query->getParameter('project', array()));
     $handles = $this->loadViewerHandles($phids);
     $author_value = array_select_keys($handles, $query->getParameter('author', array()));
     $author_value = mpull($author_value, 'getFullName', 'getPHID');
     $owner_value = array_select_keys($handles, $query->getParameter('owner', array()));
     $owner_value = mpull($owner_value, 'getFullName', 'getPHID');
     $project_value = array_select_keys($handles, $query->getParameter('project', array()));
     $project_value = mpull($project_value, 'getFullName', 'getPHID');
     $search_form = new AphrontFormView();
     $search_form->setUser($user)->setAction('/search/')->appendChild(phutil_render_tag('input', array('type' => 'hidden', 'name' => 'jump', 'value' => 'no')))->appendChild(id(new AphrontFormTextControl())->setLabel('Search')->setName('query')->setValue($query->getQuery()))->appendChild(id(new AphrontFormSelectControl())->setLabel('Document Type')->setName('type')->setOptions($options)->setValue($query->getParameter('type')))->appendChild(id(new AphrontFormSelectControl())->setLabel('Document Status')->setName('open')->setOptions($status_options)->setValue($query->getParameter('open')))->appendChild(id(new AphrontFormTokenizerControl())->setName('author')->setLabel('Author')->setDatasource('/typeahead/common/users/')->setValue($author_value))->appendChild(id(new AphrontFormTokenizerControl())->setName('owner')->setLabel('Owner')->setDatasource('/typeahead/common/searchowner/')->setValue($owner_value)->setCaption('Tip: search for "Up For Grabs" to find unowned documents.'))->appendChild(id(new AphrontFormTokenizerControl())->setName('project')->setLabel('Project')->setDatasource('/typeahead/common/projects/')->setValue($project_value))->appendChild(id(new AphrontFormSubmitControl())->setValue('Search'));
     $search_panel = new AphrontPanelView();
     $search_panel->setHeader('Search Phabricator');
     $search_panel->appendChild($search_form);
     require_celerity_resource('phabricator-search-results-css');
     if ($query->getID()) {
         $limit = 20;
         $pager = new AphrontPagerView();
         $pager->setURI($request->getRequestURI(), 'page');
         $pager->setPageSize($limit);
         $pager->setOffset($request->getInt('page'));
         $query->setParameter('limit', $limit + 1);
         $query->setParameter('offset', $pager->getOffset());
         $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
         $results = $engine->executeSearch($query);
         $results = $pager->sliceResults($results);
         if (!$request->getInt('page')) {
             $jump = PhabricatorPHID::fromObjectName($query->getQuery());
             if ($jump) {
                 array_unshift($results, $jump);
             }
         }
         if ($results) {
             $loader = new PhabricatorObjectHandleData($results);
             $handles = $loader->loadHandles();
             $objects = $loader->loadObjects();
             $results = array();
             foreach ($handles as $phid => $handle) {
                 $view = new PhabricatorSearchResultView();
                 $view->setHandle($handle);
                 $view->setQuery($query);
                 $view->setObject(idx($objects, $phid));
                 $results[] = $view->render();
             }
             $results = '<div class="phabricator-search-result-list">' . implode("\n", $results) . '<div class="search-results-pager">' . $pager->render() . '</div>' . '</div>';
         } else {
             $results = '<div class="phabricator-search-result-list">' . '<p class="phabricator-search-no-results">No search results.</p>' . '</div>';
         }
     } else {
         $results = null;
     }
     return $this->buildStandardPageResponse(array($search_panel, $results), array('title' => 'Search Results'));
 }
Ejemplo n.º 7
0
 private function buildFullTextWhereClause($conn)
 {
     if (!$this->fullTextSearch) {
         return null;
     }
     // In doing a fulltext search, we first find all the PHIDs that match the
     // fulltext search, and then use that to limit the rest of the search
     $fulltext_query = new PhabricatorSearchQuery();
     $fulltext_query->setQuery($this->fullTextSearch);
     $fulltext_query->setParameter('limit', PHP_INT_MAX);
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     $fulltext_results = $engine->executeSearch($fulltext_query);
     if (empty($fulltext_results)) {
         $fulltext_results = array(null);
     }
     return qsprintf($conn, 'phid IN (%Ls)', $fulltext_results);
 }
Ejemplo n.º 8
0
 private function buildFullTextWhereClause(AphrontDatabaseConnection $conn)
 {
     if (!strlen($this->fullTextSearch)) {
         return null;
     }
     // In doing a fulltext search, we first find all the PHIDs that match the
     // fulltext search, and then use that to limit the rest of the search
     $fulltext_query = id(new PhabricatorSavedQuery())->setEngineClassName('PhabricatorSearchApplicationSearchEngine')->setParameter('query', $this->fullTextSearch);
     // NOTE: Setting this to something larger than 2^53 will raise errors in
     // ElasticSearch, and billions of results won't fit in memory anyway.
     $fulltext_query->setParameter('limit', 100000);
     $fulltext_query->setParameter('type', ManiphestTaskPHIDType::TYPECONST);
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     $fulltext_results = $engine->executeSearch($fulltext_query);
     if (empty($fulltext_results)) {
         $fulltext_results = array(null);
     }
     return qsprintf($conn, 'phid IN (%Ls)', $fulltext_results);
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     if ($this->id) {
         $query = id(new PhabricatorSearchQuery())->load($this->id);
         if (!$query) {
             return new Aphront404Response();
         }
     } else {
         $query = new PhabricatorSearchQuery();
         if ($request->isFormPost()) {
             $query->setQuery($request->getStr('query'));
             if (strlen($request->getStr('type'))) {
                 $query->setParameter('type', $request->getStr('type'));
             }
             if ($request->getArr('author')) {
                 $query->setParameter('author', $request->getArr('author'));
             }
             if ($request->getArr('owner')) {
                 $query->setParameter('owner', $request->getArr('owner'));
             }
             if ($request->getInt('open')) {
                 $query->setParameter('open', $request->getInt('open'));
             }
             if ($request->getArr('project')) {
                 $query->setParameter('project', $request->getArr('project'));
             }
             $query->save();
             return id(new AphrontRedirectResponse())->setURI('/search/' . $query->getID() . '/');
         }
     }
     $more = PhabricatorEnv::getEnvConfig('search.more-document-types', array());
     $options = array('' => 'All Documents', PhabricatorPHIDConstants::PHID_TYPE_DREV => 'Differential Revisions', PhabricatorPHIDConstants::PHID_TYPE_CMIT => 'Repository Commits', PhabricatorPHIDConstants::PHID_TYPE_TASK => 'Maniphest Tasks', PhabricatorPHIDConstants::PHID_TYPE_WIKI => 'Phriction Documents', PhabricatorPHIDConstants::PHID_TYPE_USER => 'Phabricator Users') + $more;
     $status_options = array(0 => 'Open and Closed Documents', 1 => 'Open Documents');
     $phids = array_merge($query->getParameter('author', array()), $query->getParameter('owner', array()), $query->getParameter('project', array()));
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $author_value = array_select_keys($handles, $query->getParameter('author', array()));
     $author_value = mpull($author_value, 'getFullName', 'getPHID');
     $owner_value = array_select_keys($handles, $query->getParameter('owner', array()));
     $owner_value = mpull($owner_value, 'getFullName', 'getPHID');
     $project_value = array_select_keys($handles, $query->getParameter('project', array()));
     $project_value = mpull($project_value, 'getFullName', 'getPHID');
     $search_form = new AphrontFormView();
     $search_form->setUser($user)->setAction('/search/')->appendChild(id(new AphrontFormTextControl())->setLabel('Search')->setName('query')->setValue($query->getQuery()))->appendChild(id(new AphrontFormSelectControl())->setLabel('Document Type')->setName('type')->setOptions($options)->setValue($query->getParameter('type')))->appendChild(id(new AphrontFormSelectControl())->setLabel('Document Status')->setName('open')->setOptions($status_options)->setValue($query->getParameter('open')))->appendChild(id(new AphrontFormTokenizerControl())->setName('author')->setLabel('Author')->setDatasource('/typeahead/common/users/')->setValue($author_value))->appendChild(id(new AphrontFormTokenizerControl())->setName('owner')->setLabel('Owner')->setDatasource('/typeahead/common/searchowner/')->setValue($owner_value)->setCaption('Tip: search for "Up For Grabs" to find unowned documents.'))->appendChild(id(new AphrontFormTokenizerControl())->setName('project')->setLabel('Project')->setDatasource('/typeahead/common/projects/')->setValue($project_value))->appendChild(id(new AphrontFormSubmitControl())->setValue('Search'));
     $search_panel = new AphrontPanelView();
     $search_panel->setHeader('Search Phabricator');
     $search_panel->appendChild($search_form);
     require_celerity_resource('phabricator-search-results-css');
     if ($query->getID()) {
         $limit = 20;
         $pager = new AphrontPagerView();
         $pager->setURI($request->getRequestURI(), 'page');
         $pager->setPageSize($limit);
         $pager->setOffset($request->getInt('page'));
         $query->setParameter('limit', $limit + 1);
         $query->setParameter('offset', $pager->getOffset());
         $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
         $results = $engine->executeSearch($query);
         $results = ipull($results, 'phid');
         $results = $pager->sliceResults($results);
         if ($results) {
             $loader = new PhabricatorObjectHandleData($results);
             $handles = $loader->loadHandles();
             $objects = $loader->loadObjects();
             $results = array();
             foreach ($handles as $phid => $handle) {
                 $view = new PhabricatorSearchResultView();
                 $view->setHandle($handle);
                 $view->setQuery($query);
                 $view->setObject($objects[$phid]);
                 $results[] = $view->render();
             }
             $results = '<div class="phabricator-search-result-list">' . implode("\n", $results) . '<div class="search-results-pager">' . $pager->render() . '</div>' . '</div>';
         } else {
             $results = '<div class="phabricator-search-result-list">' . '<p class="phabricator-search-no-results">No search results.</p>' . '</div>';
         }
     } else {
         $results = null;
     }
     return $this->buildStandardPageResponse(array($search_panel, $results), array('title' => 'Results: what'));
 }
 protected static final function reindexAbstractDocument(PhabricatorSearchAbstractDocument $document)
 {
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     $engine->reindexAbstractDocument($document);
 }
 public function loadDocumentPHIDsWithoutPolicyChecks()
 {
     $query = id(clone $this->savedQuery)->setParameter('offset', $this->getOffset())->setParameter('limit', $this->getRawResultLimit());
     $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine();
     return $engine->executeSearch($query);
 }