Changeset View
Changeset View
Standalone View
Standalone View
src/applications/calendar/query/PhabricatorCalendarEventQuery.php
<?php | <?php | ||||
final class PhabricatorCalendarEventQuery | final class PhabricatorCalendarEventQuery | ||||
extends PhabricatorCursorPagedPolicyAwareQuery { | extends PhabricatorCursorPagedPolicyAwareQuery { | ||||
private $ids; | private $ids; | ||||
private $phids; | private $phids; | ||||
private $rangeBegin; | private $rangeBegin; | ||||
private $rangeEnd; | private $rangeEnd; | ||||
private $inviteePHIDs; | private $inviteePHIDs; | ||||
private $creatorPHIDs; | private $creatorPHIDs; | ||||
private $isCancelled; | private $isCancelled; | ||||
private $eventsWithNoParent; | private $eventsWithNoParent; | ||||
private $instanceSequencePairs; | private $instanceSequencePairs; | ||||
private $generateGhosts = false; | private $generateGhosts = false; | ||||
private $skipApplyTimezone = false; | |||||
public function setSkipApplyTimezone($skip_apply_timezone) { | |||||
$this->skipApplyTimezone = $skip_apply_timezone; | |||||
return $this; | |||||
} | |||||
public function setGenerateGhosts($generate_ghosts) { | public function setGenerateGhosts($generate_ghosts) { | ||||
$this->generateGhosts = $generate_ghosts; | $this->generateGhosts = $generate_ghosts; | ||||
return $this; | return $this; | ||||
} | } | ||||
public function withIDs(array $ids) { | public function withIDs(array $ids) { | ||||
$this->ids = $ids; | $this->ids = $ids; | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | $data = queryfx_all( | ||||
$this->buildJoinClause($conn_r), | $this->buildJoinClause($conn_r), | ||||
$this->buildWhereClause($conn_r), | $this->buildWhereClause($conn_r), | ||||
$this->buildGroupClause($conn_r), | $this->buildGroupClause($conn_r), | ||||
$this->buildOrderClause($conn_r), | $this->buildOrderClause($conn_r), | ||||
$this->buildLimitClause($conn_r)); | $this->buildLimitClause($conn_r)); | ||||
$events = $table->loadAllFromArray($data); | $events = $table->loadAllFromArray($data); | ||||
if (!$this->skipApplyTimezone) { | |||||
foreach ($events as $event) { | foreach ($events as $event) { | ||||
$event->applyViewerTimezone($this->getViewer()); | $event->applyViewerTimezone($this->getViewer()); | ||||
} | } | ||||
} | |||||
if (!$this->generateGhosts) { | if (!$this->generateGhosts) { | ||||
return $events; | return $events; | ||||
} | } | ||||
$enforced_end = null; | $enforced_end = null; | ||||
foreach ($events as $key => $event) { | foreach ($events as $key => $event) { | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | foreach ($events as $key => $event) { | ||||
} else if ($enforced_end) { | } else if ($enforced_end) { | ||||
if ($end) { | if ($end) { | ||||
$end = min($end, $enforced_end); | $end = min($end, $enforced_end); | ||||
} else { | } else { | ||||
$end = $enforced_end; | $end = $enforced_end; | ||||
} | } | ||||
} | } | ||||
$max_count = max(100, $this->getRawResultLimit()); | |||||
epriestley: What's the reason for this change? I don't understand why this can't be something like `200` if… | |||||
Not Done Inline ActionsI kinda sorta mentioned the reason in a comment in T8600. Basically, sometimes, getRawResultLimit is 0. To reproduce the problem I'm trying to fix here:
Call to a member function getDateFrom() on a non-object /Users/lkassianik/phacility/phabricator/src/applications/calendar/query/PhabricatorCalendarEventQuery.php:209 lpriestley: I kinda sorta mentioned the reason in a comment in T8600. Basically, sometimes… | |||||
if ($end) { | if ($end) { | ||||
$sequence_end = $sequence_start; | $sequence_end = $sequence_start; | ||||
while ($date < $end) { | while ($date < $end) { | ||||
$sequence_end++; | $sequence_end++; | ||||
$datetime->modify($modify_key); | $datetime->modify($modify_key); | ||||
$date = $datetime->format('U'); | $date = $datetime->format('U'); | ||||
if ($sequence_end > $this->getRawResultLimit() + $sequence_start) { | if ($sequence_end > $max_count + $sequence_start) { | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} else { | } else { | ||||
$sequence_end = $this->getRawResultLimit() + $sequence_start; | $sequence_end = $max_count + $sequence_start; | ||||
} | } | ||||
$sequence_start = max(1, $sequence_start); | $sequence_start = max(1, $sequence_start); | ||||
for ($index = $sequence_start; $index < $sequence_end; $index++) { | for ($index = $sequence_start; $index < $sequence_end; $index++) { | ||||
$events[] = $event->generateNthGhost($index, $viewer); | $events[] = $event->generateNthGhost($index, $viewer); | ||||
} | } | ||||
if (count($events) >= $this->getRawResultLimit()) { | if (count($events) >= $max_count) { | ||||
$events = msort($events, 'getDateFrom'); | $events = msort($events, 'getDateFrom'); | ||||
$events = array_slice($events, 0, $this->getRawResultLimit(), true); | $events = array_slice($events, 0, $max_count, true); | ||||
$enforced_end = last($events)->getDateFrom(); | $enforced_end = last($events)->getDateFrom(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
$map = array(); | $map = array(); | ||||
$instance_sequence_pairs = array(); | $instance_sequence_pairs = array(); | ||||
foreach ($events as $key => $event) { | foreach ($events as $key => $event) { | ||||
if ($event->getIsGhostEvent()) { | if ($event->getIsGhostEvent()) { | ||||
$index = $event->getSequenceIndex(); | $index = $event->getSequenceIndex(); | ||||
$instance_sequence_pairs[] = array($event->getPHID(), $index); | $instance_sequence_pairs[] = array($event->getPHID(), $index); | ||||
$map[$event->getPHID()][$index] = $key; | $map[$event->getPHID()][$index] = $key; | ||||
} | } | ||||
} | } | ||||
if (count($instance_sequence_pairs) > 0) { | if (count($instance_sequence_pairs) > 0) { | ||||
$sub_query = id(new PhabricatorCalendarEventQuery()) | $sub_query = id(new PhabricatorCalendarEventQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->setParentQuery($this) | ->setParentQuery($this) | ||||
->setSkipApplyTimezone($this->skipApplyTimezone) | |||||
->withInstanceSequencePairs($instance_sequence_pairs) | ->withInstanceSequencePairs($instance_sequence_pairs) | ||||
->execute(); | ->execute(); | ||||
foreach ($sub_query as $edited_ghost) { | foreach ($sub_query as $edited_ghost) { | ||||
$indexes = idx($map, $edited_ghost->getInstanceOfEventPHID()); | $indexes = idx($map, $edited_ghost->getInstanceOfEventPHID()); | ||||
$key = idx($indexes, $edited_ghost->getSequenceIndex()); | $key = idx($indexes, $edited_ghost->getSequenceIndex()); | ||||
$events[$key] = $edited_ghost; | $events[$key] = $edited_ghost; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 154 Lines • ▼ Show 20 Lines | foreach ($events as $event) { | ||||
if ($instance_of) { | if ($instance_of) { | ||||
$instance_of_event_phids[] = $instance_of; | $instance_of_event_phids[] = $instance_of; | ||||
} | } | ||||
} | } | ||||
if (count($instance_of_event_phids) > 0) { | if (count($instance_of_event_phids) > 0) { | ||||
$recurring_events = id(new PhabricatorCalendarEventQuery()) | $recurring_events = id(new PhabricatorCalendarEventQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->setSkipApplyTimezone($this->skipApplyTimezone) | |||||
->withPHIDs($instance_of_event_phids) | ->withPHIDs($instance_of_event_phids) | ||||
->withEventsWithNoParent(true) | ->withEventsWithNoParent(true) | ||||
->execute(); | ->execute(); | ||||
$recurring_events = mpull($recurring_events, null, 'getPHID'); | $recurring_events = mpull($recurring_events, null, 'getPHID'); | ||||
} | } | ||||
if ($events) { | if ($events) { | ||||
Show All 27 Lines | foreach ($events as $key => $event) { | ||||
if ($event->getIsCancelled() != $this->isCancelled) { | if ($event->getIsCancelled() != $this->isCancelled) { | ||||
unset($events[$key]); | unset($events[$key]); | ||||
continue; | continue; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
$events = msort($events, 'getDateFrom'); | $events = msort($events, 'getDateFrom'); | ||||
return $events; | return $events; | ||||
} | } | ||||
} | } |
What's the reason for this change? I don't understand why this can't be something like 200 if the original caller calls setLimit(200).