Skip to content

Commit

Permalink
Support Simple RRULE:FREQ and RRULE:INTERVAL
Browse files Browse the repository at this point in the history
  • Loading branch information
k1low committed Oct 14, 2011
1 parent 9ef268f commit 702a173
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 8 deletions.
20 changes: 12 additions & 8 deletions models/vevent.php
Expand Up @@ -247,6 +247,7 @@ function _expandEvents($start, $end, $event){
function _expandEventsDaily($start, $end, $event){
$eventStart = $event['Vevent']['dtstart'];
$eventEnd = $event['Vevent']['dtend'];
$interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval'];

$expandStartPoint; // 登録するイベント群の開始日時
$expandEndPoint;
Expand All @@ -261,7 +262,7 @@ function _expandEventsDaily($start, $end, $event){
if (!empty($event['Vevent']['rrule_count'])) {
$count = $event['Vevent']['rrule_count'];
$s = $this->_expandDate($eventStart);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + $count, $s['year']);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * $interval), $s['year']);
if (strtotime($end) < $endPoint) {
$expandEndPoint = $this->_expandDate($end);
} else {
Expand Down Expand Up @@ -290,7 +291,7 @@ function _expandEventsDaily($start, $end, $event){
$event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']));
$event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff);
$events[] = $event['Vevent'];
$s['day']++;
$s['day'] += 1 * $interval;
}

return $events;
Expand All @@ -305,6 +306,7 @@ function _expandEventsDaily($start, $end, $event){
function _expandEventsWeekly($start, $end, $event){
$eventStart = $event['Vevent']['dtstart'];
$eventEnd = $event['Vevent']['dtend'];
$interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval'];

$expandStartPoint; // 登録するイベント群の開始日時
$expandEndPoint;
Expand All @@ -319,7 +321,7 @@ function _expandEventsWeekly($start, $end, $event){
if (!empty($event['Vevent']['rrule_count'])) {
$count = $event['Vevent']['rrule_count'];
$s = $this->_expandDate($eventStart);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * 7), $s['year']);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * 7 * $interval), $s['year']);
if (strtotime($end) < $endPoint) {
$expandEndPoint = $this->_expandDate($end);
} else {
Expand Down Expand Up @@ -348,7 +350,7 @@ function _expandEventsWeekly($start, $end, $event){
$event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']));
$event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff);
$events[] = $event['Vevent'];
$s['day'] += 7;
$s['day'] += 7 * $interval;
}

return $events;
Expand All @@ -364,6 +366,7 @@ function _expandEventsWeekly($start, $end, $event){
function _expandEventsMonthly($start, $end, $event){
$eventStart = $event['Vevent']['dtstart'];
$eventEnd = $event['Vevent']['dtend'];
$interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval'];

$expandStartPoint; // 登録するイベント群の開始日時
$expandEndPoint;
Expand All @@ -378,7 +381,7 @@ function _expandEventsMonthly($start, $end, $event){
if (!empty($event['Vevent']['rrule_count'])) {
$count = $event['Vevent']['rrule_count'];
$s = $this->_expandDate($eventStart);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'] + $count, $s['day'], $s['year']);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'] + ($count * $interval), $s['day'], $s['year']);
if (strtotime($end) < $endPoint) {
$expandEndPoint = $this->_expandDate($end);
} else {
Expand All @@ -400,7 +403,7 @@ function _expandEventsMonthly($start, $end, $event){
$event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']));
$event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff);
$events[] = $event['Vevent'];
$s['month']++;
$s['month'] += 1 * $interval;
}

return $events;
Expand All @@ -416,6 +419,7 @@ function _expandEventsMonthly($start, $end, $event){
function _expandEventsYearly($start, $end, $event){
$eventStart = $event['Vevent']['dtstart'];
$eventEnd = $event['Vevent']['dtend'];
$interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval'];

$expandStartPoint; // 登録するイベント群の開始日時
$expandEndPoint;
Expand All @@ -430,7 +434,7 @@ function _expandEventsYearly($start, $end, $event){
if (!empty($event['Vevent']['rrule_count'])) {
$count = $event['Vevent']['rrule_count'];
$s = $this->_expandDate($eventStart);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'] + $count);
$endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'] + ($count * $interval));
if (strtotime($end) < $endPoint) {
$expandEndPoint = $this->_expandDate($end);
} else {
Expand Down Expand Up @@ -459,7 +463,7 @@ function _expandEventsYearly($start, $end, $event){
$event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']));
$event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff);
$events[] = $event['Vevent'];
$s['year']++;
$s['year'] += 1 * $interval;
}

return $events;
Expand Down
126 changes: 126 additions & 0 deletions tests/cases/models/vevent.test.php
Expand Up @@ -349,6 +349,132 @@ function test_freqYearlyUntil(){
$this->assertIdentical($result['2014-11-15'], array());
}

/**
* test_freqDailyCount5Interval2
*
* jpn:rrule_freq = 'daily'のときに正しくスケジュールが展開されること
*/
function test_freqDailyCount5Interval2(){
$data = array(
'dtstart' => '2011-11-14 10:00:00',
'dtend' => '2011-11-15 12:00:00',
'summary' => '毎日5回2回に1回',
'rrule_freq' => 'daily',
'rrule_count' => 5,
'rrule_interval' => 2,
);
$uid = $this->Vevent->setEvent($data);
$result = $this->Vevent->findByRange('2011-11-01', '2011-11-30');

$this->assertIdentical($result['2011-11-13'], array());
$this->assertIdentical($result['2011-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-11-14']), 1);
$this->assertIdentical(count($result['2011-11-15']), 1);
$this->assertIdentical($result['2011-11-24'][0]['uid'], $uid);
$this->assertIdentical($result['2011-11-25'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-11-24']), 1);
$this->assertIdentical(count($result['2011-11-25']), 1);
$this->assertIdentical($result['2011-11-26'], array());
}

/**
* test_freqWeeklyCount2Interval3
*
*/
function test_freqWeeklyCount2Interval3(){
$data = array(
'dtstart' => '2011-11-14 10:00:00',
'dtend' => '2011-11-15 12:00:00',
'summary' => '毎週2回3回に1回',
'rrule_freq' => 'weekly',
'rrule_count' => 2,
'rrule_interval' => 3,
);
$uid = $this->Vevent->setEvent($data);
$result = $this->Vevent->findByRange('2011-11-01', '2011-12-31');
$this->assertIdentical(count($result), 61);
$this->assertIdentical($result['2011-11-13'], array());
$this->assertIdentical($result['2011-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-11-14']), 1);
$this->assertIdentical(count($result['2011-11-15']), 1);
$this->assertIdentical($result['2011-11-16'], array());
$this->assertIdentical($result['2011-11-21'], array());
$this->assertIdentical($result['2011-11-28'], array());
$this->assertIdentical($result['2011-12-05'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-12-05']), 1);
$this->assertIdentical(count($result['2011-12-06']), 1);
$this->assertIdentical($result['2011-12-12'], array());
}

/**
* test_freqMonthlyCount3Interval2
*
*/
function test_freqMonthlyCount3Interval2(){
$data = array(
'dtstart' => '2011-11-14 10:00:00',
'dtend' => '2011-11-15 12:00:00',
'summary' => '毎月3回2回に1回',
'rrule_freq' => 'monthly',
'rrule_count' => 3,
'rrule_interval' => 2,
);
$uid = $this->Vevent->setEvent($data);
$result = $this->Vevent->findByRange('2011-11-01', '2012-02-28');

$this->assertIdentical(count($result), (30 + 31 + 31 + 28));
$this->assertIdentical($result['2011-11-13'], array());
$this->assertIdentical($result['2011-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-11-14']), 1);
$this->assertIdentical(count($result['2011-11-15']), 1);
$this->assertIdentical($result['2011-11-16'], array());
$this->assertIdentical($result['2011-12-14'], array());
$this->assertIdentical($result['2012-01-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2012-01-14']), 1);
$this->assertIdentical(count($result['2012-01-15']), 1);
$this->assertIdentical($result['2012-01-16'], array());
$this->assertIdentical($result['2012-02-14'], array());
}

/**
* test_freqYearlyCount3Interval2
*
*/
function test_freqYearlyCount3Interval2(){
$data = array(
'dtstart' => '2011-11-14 10:00:00',
'dtend' => '2011-11-15 12:00:00',
'summary' => '毎年3回2回に1回',
'rrule_freq' => 'yearly',
'rrule_count' => 3,
'rrule_interval' => 2,
);
$uid = $this->Vevent->setEvent($data);
$result = $this->Vevent->findByRange('2011-11-01', '2015-11-30');
$this->assertIdentical($result['2011-11-13'], array());
$this->assertIdentical($result['2011-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2011-11-14']), 1);
$this->assertIdentical(count($result['2011-11-15']), 1);
$this->assertIdentical($result['2011-11-16'], array());

$this->assertIdentical($result['2012-11-14'], array());

$this->assertIdentical($result['2013-11-13'], array());
$this->assertIdentical($result['2013-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2013-11-14']), 1);
$this->assertIdentical(count($result['2013-11-15']), 1);
$this->assertIdentical($result['2013-11-16'], array());

$this->assertIdentical($result['2014-11-14'], array());

$this->assertIdentical($result['2015-11-13'], array());
$this->assertIdentical($result['2015-11-14'][0]['uid'], $uid);
$this->assertIdentical(count($result['2015-11-14']), 1);
$this->assertIdentical(count($result['2015-11-15']), 1);
$this->assertIdentical($result['2015-11-16'], array());
}


/**
* test_findRange
*
Expand Down

0 comments on commit 702a173

Please sign in to comment.