From 6d595eee2db59a1bff3df49e380080a3ff7f311c Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Mon, 15 Jul 2013 12:53:46 +0300 Subject: [PATCH] expiration date for minutebuckets --- rater/minute_buckets.go | 1 + rater/timespans.go | 12 +++++-- rater/timespans_test.go | 74 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/rater/minute_buckets.go b/rater/minute_buckets.go index 0ebf71d4d..7cbcd0750 100644 --- a/rater/minute_buckets.go +++ b/rater/minute_buckets.go @@ -21,6 +21,7 @@ package rater import ( "math" "sort" + "time" ) type MinuteBucket struct { diff --git a/rater/timespans.go b/rater/timespans.go index a876da390..523c75d1e 100644 --- a/rater/timespans.go +++ b/rater/timespans.go @@ -160,14 +160,22 @@ Splits the given timespan on minute bucket's duration. */ func (ts *TimeSpan) SplitByMinuteBucket(mb *MinuteBucket) (newTs *TimeSpan) { // if mb expired skip it - if !mb.ExpirationTime.IsZero() && (ts.TimeStart.Equal(mb.ExpirationTime) || ts.TimeStart.After(mb.ExpirationTime)) { + if !mb.ExpirationDate.IsZero() && (ts.TimeStart.Equal(mb.ExpirationDate) || ts.TimeStart.After(mb.ExpirationDate)) { return nil } + + // expiring before time spans end + + if !mb.ExpirationDate.IsZero() && ts.TimeEnd.After(mb.ExpirationDate) { + newTs = &TimeSpan{TimeStart: mb.ExpirationDate, TimeEnd: ts.TimeEnd} + ts.TimeEnd = mb.ExpirationDate + } + s := ts.GetDuration().Seconds() ts.MinuteInfo = &MinuteInfo{mb.DestinationId, s, mb.Price} if s <= mb.Seconds { mb.Seconds -= s - return nil + return newTs } secDuration, _ := time.ParseDuration(fmt.Sprintf("%vs", mb.Seconds)) diff --git a/rater/timespans_test.go b/rater/timespans_test.go index 626e4e75a..d60055d35 100644 --- a/rater/timespans_test.go +++ b/rater/timespans_test.go @@ -249,13 +249,83 @@ func TestTimespanSplitByMinuteBucketScarce(t *testing.T) { func TestTimespanSplitByMinuteBucketPlantyExpired(t *testing.T) { t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) - mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)} + mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 39, 0, 0, time.UTC)} ts := TimeSpan{TimeStart: t1, TimeEnd: t2} newTs := ts.SplitByMinuteBucket(mb) - if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 { + if ts.MinuteInfo != nil { t.Error("Not enough minutes on minute bucket split") } if newTs != nil { t.Error("Bad extra timespan on minute bucket split") } } + +func TestTimespanSplitByMinuteBucketPlantyExpiring(t *testing.T) { + t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) + t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) + mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)} + ts := TimeSpan{TimeStart: t1, TimeEnd: t2} + newTs := ts.SplitByMinuteBucket(mb) + if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 { + t.Error("Not enough minutes on minute bucket split") + } + if newTs == nil || newTs.MinuteInfo != nil { + t.Error("Missing extra timespan on minute bucket split") + } +} + +func TestTimespanSplitByMinuteBucketPlantyExpiringEnd(t *testing.T) { + t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) + t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) + mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)} + ts := TimeSpan{TimeStart: t1, TimeEnd: t2} + newTs := ts.SplitByMinuteBucket(mb) + if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 { + t.Error("Not enough minutes on minute bucket split") + } + if newTs != nil { + t.Error("Missing extra timespan on minute bucket split") + } +} + +func TestTimespanSplitByMinuteBucketScarceExpiringSame(t *testing.T) { + t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) + t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) + mb := &MinuteBucket{Seconds: 120, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)} + ts := TimeSpan{TimeStart: t1, TimeEnd: t2} + newTs := ts.SplitByMinuteBucket(mb) + if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 { + t.Error("Not enough minutes on minute bucket split") + } + if newTs == nil || newTs.MinuteInfo != nil { + t.Error("Missing extra timespan on minute bucket split") + } +} + +func TestTimespanSplitByMinuteBucketScarceExpiringDifferentExpFirst(t *testing.T) { + t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) + t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) + mb := &MinuteBucket{Seconds: 140, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 1, 0, time.UTC)} + ts := TimeSpan{TimeStart: t1, TimeEnd: t2} + newTs := ts.SplitByMinuteBucket(mb) + if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 { + t.Error("Not enough minutes on minute bucket split: ", ts.MinuteInfo.Quantity) + } + if newTs == nil || newTs.MinuteInfo != nil { + t.Error("Missing extra timespan on minute bucket split") + } +} + +func TestTimespanSplitByMinuteBucketScarceExpiringDifferentScarceFirst(t *testing.T) { + t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC) + t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC) + mb := &MinuteBucket{Seconds: 61, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 30, 0, time.UTC)} + ts := TimeSpan{TimeStart: t1, TimeEnd: t2} + newTs := ts.SplitByMinuteBucket(mb) + if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 { + t.Error("Not enough minutes on minute bucket split") + } + if newTs == nil || newTs.MinuteInfo != nil { + t.Error("Missing extra timespan on minute bucket split") + } +}