userPHID = $user_phid; return $this; } public function withKeys(array $keys) { $this->keys = $keys; return $this; } /** * Filter results by read/unread status. Note that `true` means to return * only unread notifications, while `false` means to return only //read// * notifications. The default is `null`, which returns both. * * @param mixed True or false to filter results by read status. Null to remove * the filter. * @return this * @task config */ public function withUnread($unread) { $this->unread = $unread; return $this; } /* -( Query Execution )---------------------------------------------------- */ public function execute() { if (!$this->userPHID) { throw new Exception("Call setUser() before executing the query"); } $story_table = new PhabricatorFeedStoryData(); $notification_table = new PhabricatorFeedStoryNotification(); $conn = $story_table->establishConnection('r'); $data = queryfx_all( $conn, "SELECT story.*, notif.primaryObjectPHID, notif.hasViewed FROM %T notif JOIN %T story ON notif.chronologicalKey = story.chronologicalKey %Q ORDER BY notif.chronologicalKey DESC %Q", $notification_table->getTableName(), $story_table->getTableName(), $this->buildWhereClause($conn), $this->buildLimitClause($conn)); $viewed_map = ipull($data, 'hasViewed', 'chronologicalKey'); $primary_map = ipull($data, 'primaryObjectPHID', 'chronologicalKey'); $data = $story_table->loadAllFromArray($data); $stories = array(); foreach ($data as $story_data) { $class = $story_data->getStoryType(); try { if (!class_exists($class) || !is_subclass_of($class, 'PhabricatorFeedStory')) { $class = 'PhabricatorFeedStoryUnknown'; } } catch (PhutilMissingSymbolException $ex) { $class = 'PhabricatorFeedStoryUnknown'; } $story = newv($class, array($story_data)); $story->setHasViewed($viewed_map[$story->getChronologicalKey()]); $story->setPrimaryObjectPHID($primary_map[$story->getChronologicalKey()]); $stories[] = $story; } return $stories; } private function buildWhereClause(AphrontDatabaseConnection $conn_r) { $where = array(); if ($this->userPHID) { $where[] = qsprintf( $conn_r, 'notif.userPHID = %s', $this->userPHID); } if ($this->unread !== null) { $where[] = qsprintf( $conn_r, 'notif.hasViewed = %d', (int)!$this->unread); } if ($this->keys) { $where[] = qsprintf( $conn_r, 'notif.chronologicalKey IN (%Ls)', $this->keys); } return $this->formatWhereClause($where); } }