From bdb067b47fc06ae40fa02ef8e3c5a980c5830110 Mon Sep 17 00:00:00 2001 From: Julius Volz Date: Tue, 19 Mar 2013 14:34:19 +0100 Subject: [PATCH] Implement remaining View Get* methods. --- storage/metric/interface.go | 2 +- storage/metric/view.go | 38 ++++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/storage/metric/interface.go b/storage/metric/interface.go index 057d29b25d..40d1a14521 100644 --- a/storage/metric/interface.go +++ b/storage/metric/interface.go @@ -70,7 +70,7 @@ type StalenessPolicy struct { // preloading operation. type View interface { GetValueAtTime(model.Fingerprint, time.Time) []model.SamplePair - GetBoundaryValues(model.Fingerprint, model.Interval) []model.SamplePair + GetBoundaryValues(model.Fingerprint, model.Interval) (first []model.SamplePair, second []model.SamplePair) GetRangeValues(model.Fingerprint, model.Interval) []model.SamplePair // Destroy this view. diff --git a/storage/metric/view.go b/storage/metric/view.go index 224eb959c9..a5bd024191 100644 --- a/storage/metric/view.go +++ b/storage/metric/view.go @@ -125,7 +125,7 @@ func (v view) Close() { v.fingerprintToSeries = make(map[model.Fingerprint]viewStream) } -func (v view) GetValueAtTime(f model.Fingerprint, t time.Time) (s []model.SamplePair) { +func (v view) GetValueAtTime(f model.Fingerprint, t time.Time) (samples []model.SamplePair) { series, ok := v.fingerprintToSeries[f] if !ok { return @@ -150,13 +150,13 @@ func (v view) GetValueAtTime(f model.Fingerprint, t time.Time) (s []model.Sample return } - s = append(s, model.SamplePair{ + samples = append(samples, model.SamplePair{ Timestamp: time.Time(iterator.Key().(skipListTime)), Value: iterator.Value().(value).get(), }) if iterator.Previous() { - s = append(s, model.SamplePair{ + samples = append(samples, model.SamplePair{ Timestamp: time.Time(iterator.Key().(skipListTime)), Value: iterator.Value().(value).get(), }) @@ -165,11 +165,39 @@ func (v view) GetValueAtTime(f model.Fingerprint, t time.Time) (s []model.Sample return } -func (v view) GetBoundaryValues(f model.Fingerprint, i model.Interval) (s []model.SamplePair) { +func (v view) GetBoundaryValues(f model.Fingerprint, i model.Interval) (first []model.SamplePair, second []model.SamplePair) { + first = v.GetValueAtTime(f, i.OldestInclusive) + second = v.GetValueAtTime(f, i.NewestInclusive) return } -func (v view) GetRangeValues(f model.Fingerprint, i model.Interval) (s []model.SamplePair) { +func (v view) GetRangeValues(f model.Fingerprint, i model.Interval) (samples []model.SamplePair) { + series, ok := v.fingerprintToSeries[f] + if !ok { + return + } + + iterator := series.values.Seek(skipListTime(i.NewestInclusive)) + if iterator == nil { + return + } + + for { + timestamp := time.Time(iterator.Key().(skipListTime)) + if timestamp.Before(i.OldestInclusive) { + break + } + + samples = append(samples, model.SamplePair{ + Value: iterator.Value().(value).get(), + Timestamp: timestamp, + }) + + if !iterator.Next() { + break + } + } + return }