public static function indexQuestion(PonderQuestion $question)
 {
     // note: we assume someone's already called attachrelated on $question
     $doc = new PhabricatorSearchAbstractDocument();
     $doc->setPHID($question->getPHID());
     $doc->setDocumentType(PhabricatorPHIDConstants::PHID_TYPE_QUES);
     $doc->setDocumentTitle($question->getTitle());
     $doc->setDocumentCreated($question->getDateCreated());
     $doc->setDocumentModified($question->getDateModified());
     $doc->addField(PhabricatorSearchField::FIELD_BODY, $question->getContent());
     $doc->addRelationship(PhabricatorSearchRelationship::RELATIONSHIP_AUTHOR, $question->getAuthorPHID(), PhabricatorPHIDConstants::PHID_TYPE_USER, $question->getDateCreated());
     $comments = $question->getComments();
     foreach ($comments as $curcomment) {
         $doc->addField(PhabricatorSearchField::FIELD_COMMENT, $curcomment->getContent());
     }
     $answers = $question->getAnswers();
     foreach ($answers as $curanswer) {
         if (strlen($curanswer->getContent())) {
             $doc->addField(PhabricatorSearchField::FIELD_COMMENT, $curanswer->getContent());
         }
         $answer_comments = $curanswer->getComments();
         foreach ($answer_comments as $curcomment) {
             $doc->addField(PhabricatorSearchField::FIELD_COMMENT, $curcomment->getContent());
         }
     }
     self::reindexAbstractDocument($doc);
 }
 public static function indexQuestion(PonderQuestion $question)
 {
     $doc = new PhabricatorSearchAbstractDocument();
     $doc->setPHID($question->getPHID());
     $doc->setDocumentType(PhabricatorPHIDConstants::PHID_TYPE_QUES);
     $doc->setDocumentTitle($question->getTitle());
     $doc->setDocumentCreated($question->getDateCreated());
     $doc->setDocumentModified($question->getDateModified());
     $doc->addField(PhabricatorSearchField::FIELD_BODY, $question->getContent());
     $doc->addRelationship(PhabricatorSearchRelationship::RELATIONSHIP_AUTHOR, $question->getAuthorPHID(), PhabricatorPHIDConstants::PHID_TYPE_USER, $question->getDateCreated());
     $answers = $question->getAnswers();
     $touches = array();
     foreach ($answers as $comment) {
         if (strlen($comment->getContent())) {
             $doc->addField(PhabricatorSearchField::FIELD_COMMENT, $comment->getContent());
         }
         $author = $comment->getAuthorPHID();
         $touches[$author] = $comment->getDateCreated();
     }
     self::reindexAbstractDocument($doc);
 }
 /**
  * This is fairly non-standard; building N timelines at once (N = number of
  * answers) is tricky business.
  *
  * TODO - re-factor this to ajax in one answer panel at a time in a more
  * standard fashion. This is necessary to scale this application.
  */
 private function buildAnswers(PonderQuestion $question)
 {
     $viewer = $this->getViewer();
     $answers = $question->getAnswers();
     $author_phids = mpull($answers, 'getAuthorPHID');
     $handles = $this->loadViewerHandles($author_phids);
     $answers_sort = array_reverse(msort($answers, 'getVoteCount'));
     $view = array();
     foreach ($answers_sort as $answer) {
         $id = $answer->getID();
         $handle = $handles[$answer->getAuthorPHID()];
         $timeline = $this->buildTransactionTimeline($answer, id(new PonderAnswerTransactionQuery())->withTransactionTypes(array(PhabricatorTransactions::TYPE_COMMENT)));
         $xactions = $timeline->getTransactions();
         $view[] = id(new PonderAnswerView())->setUser($viewer)->setAnswer($answer)->setTransactions($xactions)->setTimeline($timeline)->setHandle($handle);
     }
     return $view;
 }
 /**
  * This is fairly non-standard; building N timelines at once (N = number of
  * answers) is tricky business.
  *
  * TODO - re-factor this to ajax in one answer panel at a time in a more
  * standard fashion. This is necessary to scale this application.
  */
 private function buildAnswers(PonderQuestion $question)
 {
     $viewer = $this->getViewer();
     $answers = $question->getAnswers();
     if ($answers) {
         $author_phids = mpull($answers, 'getAuthorPHID');
         $handles = $this->loadViewerHandles($author_phids);
         $view = array();
         foreach ($answers as $answer) {
             $id = $answer->getID();
             $handle = $handles[$answer->getAuthorPHID()];
             $timeline = $this->buildTransactionTimeline($answer, id(new PonderAnswerTransactionQuery())->withTransactionTypes(array(PhabricatorTransactions::TYPE_COMMENT)));
             $xactions = $timeline->getTransactions();
             $view[] = id(new PonderAnswerView())->setUser($viewer)->setAnswer($answer)->setTransactions($xactions)->setTimeline($timeline)->setHandle($handle);
         }
         $header = id(new PHUIHeaderView())->setHeader('Answers');
         return id(new PHUIBoxView())->addClass('ponder-answer-section')->appendChild($header)->appendChild($view);
     }
     return null;
 }