public function saveQuery(PhabricatorSavedQuery $query)
 {
     $query->setEngineClassName(get_class($this));
     $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
     try {
         $query->save();
     } catch (AphrontDuplicateKeyQueryException $ex) {
         // Ignore, this is just a repeated search.
     }
     unset($unguarded);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $user = $request->getUser();
     $type = $request->getURIData('type');
     $action = $request->getURIData('action');
     $query = new PhabricatorSavedQuery();
     $query_str = $request->getStr('query');
     $query->setEngineClassName('PhabricatorSearchApplicationSearchEngine');
     $query->setParameter('query', $query_str);
     $query->setParameter('types', array($type));
     $status_open = PhabricatorSearchRelationship::RELATIONSHIP_OPEN;
     switch ($request->getStr('filter')) {
         case 'assigned':
             $query->setParameter('ownerPHIDs', array($user->getPHID()));
             $query->setParameter('statuses', array($status_open));
             break;
         case 'created':
             $query->setParameter('authorPHIDs', array($user->getPHID()));
             // TODO - if / when we allow pholio mocks to be archived, etc
             // update this
             if ($type != PholioMockPHIDType::TYPECONST) {
                 $query->setParameter('statuses', array($status_open));
             }
             break;
         case 'open':
             $query->setParameter('statuses', array($status_open));
             break;
     }
     $query->setParameter('excludePHIDs', array($request->getStr('exclude')));
     $capabilities = array(PhabricatorPolicyCapability::CAN_VIEW);
     switch ($action) {
         case self::ACTION_MERGE:
             $capabilities[] = PhabricatorPolicyCapability::CAN_EDIT;
             break;
         default:
             break;
     }
     $results = id(new PhabricatorSearchDocumentQuery())->setViewer($user)->requireObjectCapabilities($capabilities)->withSavedQuery($query)->setOffset(0)->setLimit(100)->execute();
     $phids = array_fill_keys(mpull($results, 'getPHID'), true);
     $phids += $this->queryObjectNames($query_str, $capabilities);
     $phids = array_keys($phids);
     $handles = $this->loadViewerHandles($phids);
     $data = array();
     foreach ($handles as $handle) {
         $view = new PhabricatorHandleObjectSelectorDataView($handle);
         $data[] = $view->renderData();
     }
     return id(new AphrontAjaxResponse())->setContent($data);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $object = $this->loadRelationshipObject();
     if (!$object) {
         return new Aphront404Response();
     }
     $relationship = $this->loadRelationship($object);
     if (!$relationship) {
         return new Aphront404Response();
     }
     $source = $relationship->newSource();
     $query = new PhabricatorSavedQuery();
     $action = $request->getURIData('action');
     $query_str = $request->getStr('query');
     $filter = $request->getStr('filter');
     $query->setEngineClassName('PhabricatorSearchApplicationSearchEngine');
     $query->setParameter('query', $query_str);
     $types = $source->getResultPHIDTypes();
     $query->setParameter('types', $types);
     $status_open = PhabricatorSearchRelationship::RELATIONSHIP_OPEN;
     switch ($filter) {
         case 'assigned':
             $query->setParameter('ownerPHIDs', array($viewer->getPHID()));
             $query->setParameter('statuses', array($status_open));
             break;
         case 'created':
             $query->setParameter('authorPHIDs', array($viewer->getPHID()));
             $query->setParameter('statuses', array($status_open));
             break;
         case 'open':
             $query->setParameter('statuses', array($status_open));
             break;
     }
     $query->setParameter('excludePHIDs', array($request->getStr('exclude')));
     $capabilities = $relationship->getRequiredRelationshipCapabilities();
     $results = id(new PhabricatorSearchDocumentQuery())->setViewer($viewer)->requireObjectCapabilities($capabilities)->withSavedQuery($query)->setOffset(0)->setLimit(100)->execute();
     $phids = array_fill_keys(mpull($results, 'getPHID'), true);
     $phids = $this->queryObjectNames($query, $capabilities) + $phids;
     $phids = array_keys($phids);
     $handles = $viewer->loadHandles($phids);
     $data = array();
     foreach ($handles as $handle) {
         $view = new PhabricatorHandleObjectSelectorDataView($handle);
         $data[] = $view->renderData();
     }
     return id(new AphrontAjaxResponse())->setContent($data);
 }