From 61fc02a00270c4d899037bdcc5450d91028365ee Mon Sep 17 00:00:00 2001
From: Anthony Woods <awoods@grafana.com>
Date: Mon, 11 Feb 2019 19:49:35 +0800
Subject: [PATCH] set currLabels when currEntry is set. (#308)

* set currLabels when creating new heapIterator

fixes #307

* update unit tests to ensure labels are set correctly
---
 pkg/iter/iterator.go      |  4 ++++
 pkg/iter/iterator_test.go | 41 +++++++++++++++++++++++++++------------
 2 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/pkg/iter/iterator.go b/pkg/iter/iterator.go
index df35c0c8..d506cd40 100644
--- a/pkg/iter/iterator.go
+++ b/pkg/iter/iterator.go
@@ -119,6 +119,10 @@ func NewHeapIterator(is []EntryIterator, direction logproto.Direction) EntryIter
 		result.requeue(i, false)
 	}
 
+	if len(is) > 0 {
+		result.currLabels = is[0].Labels()
+	}
+
 	return result
 }
 
diff --git a/pkg/iter/iterator_test.go b/pkg/iter/iterator_test.go
index 5594361a..d42b6e1c 100644
--- a/pkg/iter/iterator_test.go
+++ b/pkg/iter/iterator_test.go
@@ -12,64 +12,80 @@ import (
 )
 
 const testSize = 10
+const defaultLabels = "{foo: \"baz\"}"
 
 func TestIterator(t *testing.T) {
 	for i, tc := range []struct {
 		iterator  EntryIterator
 		generator generator
 		length    int64
+		labels    string
 	}{
 		// Test basic identity.
 		{
-			iterator:  mkStreamIterator(testSize, identity),
+			iterator:  mkStreamIterator(testSize, identity, defaultLabels),
 			generator: identity,
 			length:    testSize,
+			labels:    defaultLabels,
 		},
 
 		// Test basic identity (backwards).
 		{
-			iterator:  mkStreamIterator(testSize, inverse(identity)),
+			iterator:  mkStreamIterator(testSize, inverse(identity), defaultLabels),
 			generator: inverse(identity),
 			length:    testSize,
+			labels:    defaultLabels,
 		},
 
 		// Test dedupe of overlapping iterators with the heap iterator.
 		{
 			iterator: NewHeapIterator([]EntryIterator{
-				mkStreamIterator(testSize, offset(0, identity)),
-				mkStreamIterator(testSize, offset(testSize/2, identity)),
-				mkStreamIterator(testSize, offset(testSize, identity)),
+				mkStreamIterator(testSize, offset(0, identity), defaultLabels),
+				mkStreamIterator(testSize, offset(testSize/2, identity), defaultLabels),
+				mkStreamIterator(testSize, offset(testSize, identity), defaultLabels),
 			}, logproto.FORWARD),
 			generator: identity,
 			length:    2 * testSize,
+			labels:    defaultLabels,
 		},
 
 		// Test dedupe of overlapping iterators with the heap iterator (backward).
 		{
 			iterator: NewHeapIterator([]EntryIterator{
-				mkStreamIterator(testSize, inverse(offset(0, identity))),
-				mkStreamIterator(testSize, inverse(offset(-testSize/2, identity))),
-				mkStreamIterator(testSize, inverse(offset(-testSize, identity))),
+				mkStreamIterator(testSize, inverse(offset(0, identity)), defaultLabels),
+				mkStreamIterator(testSize, inverse(offset(-testSize/2, identity)), defaultLabels),
+				mkStreamIterator(testSize, inverse(offset(-testSize, identity)), defaultLabels),
 			}, logproto.BACKWARD),
 			generator: inverse(identity),
 			length:    2 * testSize,
+			labels:    defaultLabels,
 		},
 
 		// Test dedupe of entries with the same timestamp but different entries.
 		{
 			iterator: NewHeapIterator([]EntryIterator{
-				mkStreamIterator(testSize, offset(0, constant(0))),
-				mkStreamIterator(testSize, offset(0, constant(0))),
-				mkStreamIterator(testSize, offset(testSize, constant(0))),
+				mkStreamIterator(testSize, offset(0, constant(0)), defaultLabels),
+				mkStreamIterator(testSize, offset(0, constant(0)), defaultLabels),
+				mkStreamIterator(testSize, offset(testSize, constant(0)), defaultLabels),
 			}, logproto.FORWARD),
 			generator: constant(0),
 			length:    2 * testSize,
+			labels:    defaultLabels,
+		},
+
+		// Test basic identity with non-default labels.
+		{
+			iterator:  mkStreamIterator(testSize, identity, "{foobar: \"bazbar\"}"),
+			generator: identity,
+			length:    testSize,
+			labels:    "{foobar: \"bazbar\"}",
 		},
 	} {
 		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
 			for i := int64(0); i < tc.length; i++ {
 				assert.Equal(t, true, tc.iterator.Next())
 				assert.Equal(t, tc.generator(i), tc.iterator.Entry(), fmt.Sprintln("iteration", i))
+				assert.Equal(t, tc.labels, tc.iterator.Labels(), fmt.Sprintln("iteration", i))
 			}
 
 			assert.Equal(t, false, tc.iterator.Next())
@@ -81,13 +97,14 @@ func TestIterator(t *testing.T) {
 
 type generator func(i int64) logproto.Entry
 
-func mkStreamIterator(numEntries int64, f generator) EntryIterator {
+func mkStreamIterator(numEntries int64, f generator, labels string) EntryIterator {
 	entries := []logproto.Entry{}
 	for i := int64(0); i < numEntries; i++ {
 		entries = append(entries, f(i))
 	}
 	return newStreamIterator(&logproto.Stream{
 		Entries: entries,
+		Labels:  labels,
 	})
 }
 
-- 
GitLab