Changeset View
Changeset View
Standalone View
Standalone View
src/applications/calendar/query/PhabricatorCalendarEventQuery.php
Show First 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | if (!$this->generateGhosts) { | ||||
return $events; | return $events; | ||||
} | } | ||||
$map = array(); | $map = array(); | ||||
$instance_sequence_pairs = array(); | $instance_sequence_pairs = array(); | ||||
foreach ($events as $event) { | foreach ($events as $event) { | ||||
$sequence_start = 0; | $sequence_start = 0; | ||||
$instance_count = null; | $sequence_end = null; | ||||
$duration = $event->getDateTo() - $event->getDateFrom(); | $duration = $event->getDateTo() - $event->getDateFrom(); | ||||
$end = null; | |||||
if ($event->getIsRecurring() && !$event->getInstanceOfEventPHID()) { | if ($event->getIsRecurring() && !$event->getInstanceOfEventPHID()) { | ||||
$frequency = $event->getFrequencyUnit(); | $frequency = $event->getFrequencyUnit(); | ||||
$modify_key = '+1 '.$frequency; | $modify_key = '+1 '.$frequency; | ||||
if ($this->rangeBegin && $this->rangeBegin > $event->getDateFrom()) { | if ($this->rangeBegin && $this->rangeBegin > $event->getDateFrom()) { | ||||
$max_date = $this->rangeBegin - $duration; | $max_date = $this->rangeBegin - $duration; | ||||
$date = $event->getDateFrom(); | $date = $event->getDateFrom(); | ||||
$datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | ||||
while ($date < $max_date) { | while ($date < $max_date) { | ||||
// TODO: optimize this to not loop through all off-screen events | // TODO: optimize this to not loop through all off-screen events | ||||
$sequence_start++; | $sequence_start++; | ||||
$datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | ||||
$date = $datetime->modify($modify_key)->format('U'); | $date = $datetime->modify($modify_key)->format('U'); | ||||
} | } | ||||
$start = $this->rangeBegin; | $start = $this->rangeBegin; | ||||
} else { | } else { | ||||
$start = $event->getDateFrom() - $duration; | $start = $event->getDateFrom() - $duration; | ||||
} | } | ||||
$date = $start; | $date = $start; | ||||
$start_datetime = PhabricatorTime::getDateTimeFromEpoch( | $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | ||||
$start, | |||||
$viewer); | |||||
if ($this->rangeEnd) { | if (($this->rangeEnd && $event->getRecurrenceEndDate()) && | ||||
$this->rangeEnd < $event->getRecurrenceEndDate()) { | |||||
$end = $this->rangeEnd; | |||||
} else if ($event->getRecurrenceEndDate()) { | |||||
$end = $event->getRecurrenceEndDate(); | |||||
} else if ($this->rangeEnd) { | |||||
$end = $this->rangeEnd; | $end = $this->rangeEnd; | ||||
$instance_count = $sequence_start; | } | ||||
if ($end) { | |||||
$sequence_end = $sequence_start; | |||||
while ($date < $end) { | while ($date < $end) { | ||||
$instance_count++; | $sequence_end++; | ||||
epriestley: It looks like `$instance_count` is the index number of the last index here | |||||
$datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); | |||||
$datetime->modify($modify_key); | $datetime->modify($modify_key); | ||||
$date = $datetime->format('U'); | $date = $datetime->format('U'); | ||||
} | } | ||||
} else { | } else { | ||||
$instance_count = $this->getRawResultLimit(); | $sequence_end = $this->getRawResultLimit() + $sequence_start; | ||||
Done Inline ActionsIt looks like $instance_count is a count here. I think one of these is wrong? As written, probably this one should be $sequence_start + $this->getRawResultLimit() and the variable should be $sequence_end? epriestley: It looks like `$instance_count` is a count here. I think one of these is wrong? As written… | |||||
} | } | ||||
$sequence_start = max(1, $sequence_start); | $sequence_start = max(1, $sequence_start); | ||||
$max_sequence = $sequence_start + $instance_count; | for ($index = $sequence_start; $index < $sequence_end; $index++) { | ||||
Not Done Inline ActionsI think this change isn't correct:
I'd expect $sequence_start to be about 365, and $instance_count to be about 30. So this will evaluate to: for ($index = 365; $index < 30; $index++) { ...and not enter the loop body, because $index < 30 is never true. epriestley: I think this change isn't correct:
- Create a daily event a year ago.
- View this month. | |||||
Not Done Inline ActionsJust tested, and this actually works as expected, but it surfaced a small bug - recurrence end date always gets set. Will fix. lpriestley: Just tested, and this actually works as expected, but it surfaced a small bug - recurrence end… | |||||
for ($index = $sequence_start; $index < $max_sequence; $index++) { | |||||
$instance_sequence_pairs[] = array($event->getPHID(), $index); | $instance_sequence_pairs[] = array($event->getPHID(), $index); | ||||
$events[] = $event->generateNthGhost($index, $viewer); | $events[] = $event->generateNthGhost($index, $viewer); | ||||
$key = last_key($events); | $key = last_key($events); | ||||
$map[$event->getPHID()][$index] = $key; | $map[$event->getPHID()][$index] = $key; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 179 Lines • Show Last 20 Lines |
It looks like $instance_count is the index number of the last index here