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] }