Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15334395
D15653.id37721.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
5 KB
Referenced Files
None
Subscribers
None
D15653.id37721.diff
View Options
diff --git a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
--- a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
+++ b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
@@ -90,24 +90,11 @@
}
protected function loadPage() {
- $table = new PhabricatorCalendarEvent();
- $conn_r = $table->establishConnection('r');
- $viewer = $this->getViewer();
-
- $data = queryfx_all(
- $conn_r,
- '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));
-
- $events = $table->loadAllFromArray($data);
+ $events = $this->loadStandardPage($this->newResultObject());
+ $viewer = $this->getViewer();
foreach ($events as $event) {
- $event->applyViewerTimezone($this->getViewer());
+ $event->applyViewerTimezone($viewer);
}
if (!$this->generateGhosts) {
@@ -115,6 +102,7 @@
}
$enforced_end = null;
+ $raw_limit = $this->getRawResultLimit();
foreach ($events as $key => $event) {
$sequence_start = 0;
@@ -176,12 +164,12 @@
$sequence_end++;
$datetime->modify($modify_key);
$date = $datetime->format('U');
- if ($sequence_end > $this->getRawResultLimit() + $sequence_start) {
+ if ($sequence_end > $raw_limit + $sequence_start) {
break;
}
}
} else {
- $sequence_end = $this->getRawResultLimit() + $sequence_start;
+ $sequence_end = $raw_limit + $sequence_start;
}
$sequence_start = max(1, $sequence_start);
@@ -190,10 +178,17 @@
$events[] = $event->generateNthGhost($index, $viewer);
}
- if (count($events) >= $this->getRawResultLimit()) {
- $events = msort($events, 'getDateFrom');
- $events = array_slice($events, 0, $this->getRawResultLimit(), true);
- $enforced_end = last($events)->getDateFrom();
+ // NOTE: We're slicing results every time because this makes it cheaper
+ // to generate future ghosts. If we already have 100 events that occur
+ // before July 1, we know we never need to generate ghosts after that
+ // because they couldn't possibly ever appear in the result set.
+
+ if ($raw_limit) {
+ if (count($events) >= $raw_limit) {
+ $events = msort($events, 'getDateFrom');
+ $events = array_slice($events, 0, $raw_limit, true);
+ $enforced_end = last($events)->getDateFrom();
+ }
}
}
}
@@ -251,61 +246,61 @@
return $parts;
}
- protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
- $where = array();
+ protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
+ $where = parent::buildWhereClauseParts($conn);
if ($this->ids) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.id IN (%Ld)',
$this->ids);
}
if ($this->phids) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.phid IN (%Ls)',
$this->phids);
}
if ($this->rangeBegin) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.dateTo >= %d OR event.isRecurring = 1',
$this->rangeBegin);
}
if ($this->rangeEnd) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.dateFrom <= %d',
$this->rangeEnd);
}
if ($this->inviteePHIDs !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'invitee.inviteePHID IN (%Ls)',
$this->inviteePHIDs);
}
if ($this->creatorPHIDs) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.userPHID IN (%Ls)',
$this->creatorPHIDs);
}
if ($this->isCancelled !== null) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.isCancelled = %d',
(int)$this->isCancelled);
}
if ($this->eventsWithNoParent == true) {
$where[] = qsprintf(
- $conn_r,
+ $conn,
'event.instanceOfEventPHID IS NULL');
}
@@ -314,20 +309,19 @@
foreach ($this->instanceSequencePairs as $pair) {
$sql[] = qsprintf(
- $conn_r,
+ $conn,
'(event.instanceOfEventPHID = %s AND event.sequenceIndex = %d)',
$pair[0],
$pair[1]);
}
+
$where[] = qsprintf(
- $conn_r,
+ $conn,
'%Q',
implode(' OR ', $sql));
}
- $where[] = $this->buildPagingClause($conn_r);
-
- return $this->formatWhereClause($where);
+ return $where;
}
protected function getPrimaryTableAlias() {
diff --git a/src/applications/people/query/PhabricatorPeopleQuery.php b/src/applications/people/query/PhabricatorPeopleQuery.php
--- a/src/applications/people/query/PhabricatorPeopleQuery.php
+++ b/src/applications/people/query/PhabricatorPeopleQuery.php
@@ -412,6 +412,10 @@
$min_range = PhabricatorTime::getNow();
$max_range = $min_range + phutil_units('72 hours in seconds');
+ // NOTE: We don't need to generate ghosts here, because we only care if
+ // the user is attending, and you can't attend a ghost event: RSVP'ing
+ // to it creates a real event.
+
$events = id(new PhabricatorCalendarEventQuery())
->setViewer(PhabricatorUser::getOmnipotentUser())
->withInvitedPHIDs(array_keys($rebuild))
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 9, 8:46 AM (2 d, 18 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7387738
Default Alt Text
D15653.id37721.diff (5 KB)
Attached To
Mode
D15653: Account for raw limits properly in CalendarEventQuery
Attached
Detach File
Event Timeline
Log In to Comment