public function renderPanelContent(PhabricatorUser $viewer, PhabricatorDashboardPanel $panel, PhabricatorDashboardPanelRenderingEngine $engine)
 {
     $class = $panel->getProperty('class');
     $engine = PhabricatorApplicationSearchEngine::getEngineByClassName($class);
     if (!$engine) {
         throw new Exception(pht('The application search engine "%s" is not known to Phabricator!', $class));
     }
     $engine->setViewer($viewer);
     $engine->setContext(PhabricatorApplicationSearchEngine::CONTEXT_PANEL);
     $key = $panel->getProperty('key');
     if ($engine->isBuiltinQuery($key)) {
         $saved = $engine->buildSavedQueryFromBuiltin($key);
     } else {
         $saved = id(new PhabricatorSavedQueryQuery())->setViewer($viewer)->withEngineClassNames(array($class))->withQueryKeys(array($key))->executeOne();
     }
     if (!$saved) {
         throw new Exception(pht('Query "%s" is unknown to application search engine "%s"!', $key, $class));
     }
     $query = $engine->buildQueryFromSavedQuery($saved);
     $pager = $engine->newPagerForSavedQuery($saved);
     if ($panel->getProperty('limit')) {
         $limit = (int) $panel->getProperty('limit');
         if ($pager->getPageSize() !== 0xffff) {
             $pager->setPageSize($limit);
         }
     }
     $results = $engine->executeQuery($query, $pager);
     return $engine->renderResults($results, $saved);
 }
 private function getSearchEngine(PhabricatorDashboardPanel $panel)
 {
     $class = $panel->getProperty('class');
     $engine = PhabricatorApplicationSearchEngine::getEngineByClassName($class);
     if (!$engine) {
         throw new Exception(pht('The application search engine "%s" is not known to Phabricator!', $class));
     }
     if (!$engine->canUseInPanelContext()) {
         throw new Exception(pht('Application search engines of class "%s" can not be used to build ' . 'dashboard panels.', $class));
     }
     return $engine;
 }