forked from cerc-io/plugeth
ae9f97221a
* go-metrics: fork library and introduce ResettingTimer and InfluxDB reporter. * vendor: change nonsense/go-metrics to ethersphere/go-metrics * go-metrics: add tests. move ResettingTimer logic from reporter to type. * all, metrics: pull in metrics package in go-ethereum * metrics/test: make sure metrics are enabled for tests * metrics: apply gosimple rules * metrics/exp, internal/debug: init expvar endpoint when starting pprof server * internal/debug: tiny comment formatting fix
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package models
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
// Row represents a single row returned from the execution of a statement.
|
|
type Row struct {
|
|
Name string `json:"name,omitempty"`
|
|
Tags map[string]string `json:"tags,omitempty"`
|
|
Columns []string `json:"columns,omitempty"`
|
|
Values [][]interface{} `json:"values,omitempty"`
|
|
Partial bool `json:"partial,omitempty"`
|
|
}
|
|
|
|
// SameSeries returns true if r contains values for the same series as o.
|
|
func (r *Row) SameSeries(o *Row) bool {
|
|
return r.tagsHash() == o.tagsHash() && r.Name == o.Name
|
|
}
|
|
|
|
// tagsHash returns a hash of tag key/value pairs.
|
|
func (r *Row) tagsHash() uint64 {
|
|
h := NewInlineFNV64a()
|
|
keys := r.tagsKeys()
|
|
for _, k := range keys {
|
|
h.Write([]byte(k))
|
|
h.Write([]byte(r.Tags[k]))
|
|
}
|
|
return h.Sum64()
|
|
}
|
|
|
|
// tagKeys returns a sorted list of tag keys.
|
|
func (r *Row) tagsKeys() []string {
|
|
a := make([]string, 0, len(r.Tags))
|
|
for k := range r.Tags {
|
|
a = append(a, k)
|
|
}
|
|
sort.Strings(a)
|
|
return a
|
|
}
|
|
|
|
// Rows represents a collection of rows. Rows implements sort.Interface.
|
|
type Rows []*Row
|
|
|
|
// Len implements sort.Interface.
|
|
func (p Rows) Len() int { return len(p) }
|
|
|
|
// Less implements sort.Interface.
|
|
func (p Rows) Less(i, j int) bool {
|
|
// Sort by name first.
|
|
if p[i].Name != p[j].Name {
|
|
return p[i].Name < p[j].Name
|
|
}
|
|
|
|
// Sort by tag set hash. Tags don't have a meaningful sort order so we
|
|
// just compute a hash and sort by that instead. This allows the tests
|
|
// to receive rows in a predictable order every time.
|
|
return p[i].tagsHash() < p[j].tagsHash()
|
|
}
|
|
|
|
// Swap implements sort.Interface.
|
|
func (p Rows) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|