feat: render models.Points to string (#17266)

Signed-off-by: Chris Goller <goller@gmail.com>
pull/17264/head
Chris Goller 2020-03-13 14:11:10 -05:00 committed by GitHub
parent a5c368e5f8
commit 6af35aec42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 6 deletions

View File

@ -236,13 +236,32 @@ type FieldIterator interface {
type Points []Point
// Len implements sort.Interface.
func (a Points) Len() int { return len(a) }
func (p Points) Len() int { return len(p) }
// Less implements sort.Interface.
func (a Points) Less(i, j int) bool { return a[i].Time().Before(a[j].Time()) }
func (p Points) Less(i, j int) bool { return p[i].Time().Before(p[j].Time()) }
// Swap implements sort.Interface.
func (a Points) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (p Points) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p Points) String() string {
const sep = "\n"
switch len(p) {
case 0:
return ""
case 1:
return p[0].String()
}
var b strings.Builder
b.WriteString(p[0].String())
for _, s := range p[1:] {
b.WriteString(sep)
b.WriteString(s.String())
}
return b.String()
}
// point is the default implementation of Point.
type point struct {

View File

@ -160,7 +160,7 @@ func TestPoint_Tags(t *testing.T) {
}
func TestPoint_StringSize(t *testing.T) {
testPoint_cube(t, func(p models.Point) {
testPointCube(t, func(p models.Point) {
l := p.StringSize()
s := p.String()
@ -171,7 +171,7 @@ func TestPoint_StringSize(t *testing.T) {
}
func TestPoint_AppendString(t *testing.T) {
testPoint_cube(t, func(p models.Point) {
testPointCube(t, func(p models.Point) {
got := p.AppendString(nil)
exp := []byte(p.String())
@ -181,7 +181,7 @@ func TestPoint_AppendString(t *testing.T) {
})
}
func testPoint_cube(t *testing.T, f func(p models.Point)) {
func testPointCube(t *testing.T, f func(p models.Point)) {
// heard of a table-driven test? let's make a cube-driven test...
tagList := []models.Tags{nil, {models.NewTag([]byte("foo"), []byte("bar"))}, tags}
fieldList := []models.Fields{{"a": 42.0}, {"a": 42, "b": "things"}, fields}
@ -1278,6 +1278,37 @@ func TestParsePointUnescape(t *testing.T) {
time.Unix(0, 0)))
}
func TestPoints_String(t *testing.T) {
tags := models.NewTags(map[string]string{
"t1": "v1",
"t2": "v2",
})
pts := make(models.Points, 5)
for i := 0; i < len(pts); i++ {
point, err := models.NewPoint(
"m1",
tags,
models.Fields{
"f1": i,
},
time.Unix(0, int64(i)),
)
if err != nil {
t.Fatalf("unable to create point %v", err)
}
pts[i] = point
}
got := pts.String()
want := `m1,t1=v1,t2=v2 f1=0i 0
m1,t1=v1,t2=v2 f1=1i 1
m1,t1=v1,t2=v2 f1=2i 2
m1,t1=v1,t2=v2 f1=3i 3
m1,t1=v1,t2=v2 f1=4i 4`
if got != want {
t.Errorf("Points.String() %v| \n want \n%v", got, want)
}
}
func TestParsePointWithTags(t *testing.T) {
testParsePoints(t,
"cpu,host=serverA,region=us-east value=1.0 1000000000", "mm",