public function getEventsItemized(\DateTime $start_date, \DateTime $end_date, $granularity = Event::BAT_HOURLY)
{
// The final events we will return
$events = array();
$keyed_units = $this->keyUnitsById();
$db_events = $this->store->getEventData($start_date, $end_date, array_keys($keyed_units));
// Create a mock itemized event for the period in question - since event data is either
// in the database or the default value we first create a mock event and then fill it in
// accordingly
$mock_event = new Event($start_date, $end_date, new Unit(0, 0), $this->default_value);
$itemized = $mock_event->itemize(new EventItemizer($mock_event, $granularity));
// Cycle through each unit retrieved and provide it with a fully configured itemized mock event
foreach ($db_events as $unit => $event) {
// Add the mock event
$events[$unit] = $itemized;
$events[$unit][Event::BAT_DAY] = $this->itemizeDays($db_events, $itemized, $unit, $keyed_units);
// Handle hours
if (isset($itemized[Event::BAT_HOUR]) || isset($db_events[$unit][Event::BAT_HOUR])) {
$events[$unit][Event::BAT_HOUR] = $this->itemizeHours($db_events, $itemized, $unit, $keyed_units);
} else {
// No hours - set an empty array
$events[$unit][Event::BAT_HOUR] = array();
}
// Handle minutes
if (isset($itemized[Event::BAT_MINUTE]) || isset($db_events[$unit][Event::BAT_MINUTE])) {
$events[$unit][Event::BAT_MINUTE] = $this->itemizeMinutes($db_events, $itemized, $unit, $keyed_units);
} else {
// No minutes - set an empty array
$events[$unit][Event::BAT_MINUTE] = array();
}
}
// Check to see if any events came back from the db
foreach ($keyed_units as $id => $unit) {
// If we don't have any db events add mock events (itemized)
if (isset($events[$id]) && count($events[$id]) == 0 || !isset($events[$id])) {
$empty_event = new Event($start_date, $end_date, $unit, $unit->getDefaultValue());
$events[$id] = $empty_event->itemize(new EventItemizer($empty_event, $granularity));
}
}
return $events;
}