diff --git a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php index 5f880eaace..fe072e03d6 100644 --- a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php +++ b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php @@ -1,146 +1,173 @@ ids = $ids; return $this; } public function withPHIDs(array $phids) { $this->phids = $phids; return $this; } public function withDateRange($begin, $end) { $this->rangeBegin = $begin; $this->rangeEnd = $end; return $this; } public function withInvitedPHIDs(array $phids) { - $this->invitedPHIDs = $phids; + $this->inviteePHIDs = $phids; return $this; } public function withCreatorPHIDs(array $phids) { $this->creatorPHIDs = $phids; return $this; } public function withIsCancelled($is_cancelled) { $this->isCancelled = $is_cancelled; return $this; } protected function loadPage() { $table = new PhabricatorCalendarEvent(); $conn_r = $table->establishConnection('r'); $data = queryfx_all( $conn_r, - 'SELECT * FROM %T %Q %Q %Q', + 'SELECT event.* FROM %T event %Q %Q %Q %Q %Q', $table->getTableName(), + $this->buildJoinClause($conn_r), $this->buildWhereClause($conn_r), + $this->buildGroupClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); } + protected function buildJoinClauseParts(AphrontDatabaseConnection $conn_r) { + $parts = parent::buildJoinClauseParts($conn_r); + if ($this->inviteePHIDs !== null) { + $parts[] = qsprintf( + $conn_r, + 'JOIN %T invitee ON invitee.eventPHID = event.phid'. + 'AND invitee.status != %s', + id(new PhabricatorCalendarEventInvitee())->getTableName(), + PhabricatorCalendarEventInvitee::STATUS_UNINVITED); + } + return $parts; + } + protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { $where = array(); if ($this->ids) { $where[] = qsprintf( $conn_r, - 'id IN (%Ld)', + 'event.id IN (%Ld)', $this->ids); } if ($this->phids) { $where[] = qsprintf( $conn_r, - 'phid IN (%Ls)', + 'event.phid IN (%Ls)', $this->phids); } if ($this->rangeBegin) { $where[] = qsprintf( $conn_r, - 'dateTo >= %d', + 'event.dateTo >= %d', $this->rangeBegin); } if ($this->rangeEnd) { $where[] = qsprintf( $conn_r, - 'dateFrom <= %d', + 'event.dateFrom <= %d', $this->rangeEnd); } - // TODO: Currently, the creator is always the only invitee, but you can - // query them separately since this won't always be true. - - if ($this->invitedPHIDs) { + if ($this->inviteePHIDs !== null) { $where[] = qsprintf( $conn_r, - 'userPHID IN (%Ls)', - $this->invitedPHIDs); + 'invitee.inviteePHID IN (%Ls)', + $this->inviteePHIDs); } if ($this->creatorPHIDs) { $where[] = qsprintf( $conn_r, - 'userPHID IN (%Ls)', + 'event.userPHID IN (%Ls)', $this->creatorPHIDs); } if ($this->isCancelled !== null) { $where[] = qsprintf( $conn_r, - 'isCancelled = %d', + 'event.isCancelled = %d', (int)$this->isCancelled); } $where[] = $this->buildPagingClause($conn_r); return $this->formatWhereClause($where); } + protected function getPrimaryTableAlias() { + return 'event'; + } + + protected function shouldGroupQueryResultRows() { + if ($this->inviteePHIDs !== null) { + return true; + } + return parent::shouldGroupQueryResultRows(); + } + + protected function getApplicationSearchObjectPHIDColumn() { + return 'event.phid'; + } + public function getQueryApplicationClass() { return 'PhabricatorCalendarApplication'; } protected function willFilterPage(array $events) { $phids = array(); foreach ($events as $event) { $phids[] = $event->getPHID(); } $invitees = id(new PhabricatorCalendarEventInviteeQuery()) ->setViewer($this->getViewer()) ->withEventPHIDs($phids) ->execute(); $invitees = mgroup($invitees, 'getEventPHID'); foreach ($events as $event) { $event_invitees = idx($invitees, $event->getPHID(), array()); $event->attachInvitees($event_invitees); } return $events; } }