github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/query/graphite/ts/datapoint.go (about)

     1  // Copyright (c) 2019 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package ts
    22  
    23  import (
    24  	"math"
    25  	"time"
    26  
    27  	"github.com/m3db/m3/src/query/graphite/stats"
    28  )
    29  
    30  // A Datapoint is a single data value reported at a given time
    31  type Datapoint struct {
    32  	Timestamp time.Time
    33  	Value     float64
    34  }
    35  
    36  // ValueIsNaN returns true iff underlying value is NaN
    37  func (d Datapoint) ValueIsNaN() bool { return math.IsNaN(d.Value) }
    38  
    39  // DatapointsByTimestamp is a sortable interface for datapoints
    40  type DatapointsByTimestamp []Datapoint
    41  
    42  // Len is the length of the datapoints
    43  func (p DatapointsByTimestamp) Len() int { return len(p) }
    44  
    45  // Less compares two datapoints by timestamp
    46  func (p DatapointsByTimestamp) Less(i, j int) bool { return p[i].Timestamp.Before(p[j].Timestamp) }
    47  
    48  // Swap swaps two datapoints
    49  func (p DatapointsByTimestamp) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
    50  
    51  // ConsolidatedValue represents a time window of consolidated data
    52  type ConsolidatedValue struct {
    53  	// StartTime is the start time of the time window covered by this
    54  	// consolidation
    55  	StartTime time.Time
    56  
    57  	// EndTime is the end time of the time window covered by this
    58  	// consolidation
    59  	EndTime time.Time
    60  
    61  	// Values is the statistics for that consolidated time window
    62  	Values stats.Statistics
    63  }
    64  
    65  // ConsolidatedValuesByStartTime is a sortable interface for consolidated values
    66  type ConsolidatedValuesByStartTime []ConsolidatedValue
    67  
    68  // Len is the length of the values
    69  func (p ConsolidatedValuesByStartTime) Len() int { return len(p) }
    70  
    71  // Less compares two values by start time
    72  func (p ConsolidatedValuesByStartTime) Less(i, j int) bool {
    73  	return p[i].StartTime.Before(p[j].StartTime)
    74  }
    75  
    76  // Swap swaps two values
    77  func (p ConsolidatedValuesByStartTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
    78  
    79  // Datapoints is a list of datapoints that implement the stats.Values interface.
    80  type Datapoints []Datapoint
    81  
    82  // Len is the length of the array.
    83  func (d Datapoints) Len() int { return len(d) }
    84  
    85  // ValueAt returns the value at the nth element.
    86  func (d Datapoints) ValueAt(n int) float64 { return d[n].Value }
    87  
    88  // AllNaN returns true if all the values are NaN
    89  func (d Datapoints) AllNaN() bool {
    90  	for _, dp := range d {
    91  		if !dp.ValueIsNaN() {
    92  			return false
    93  		}
    94  	}
    95  	return true
    96  }