Expose ListPostings Length via Len() method (#15678)

tsdb: expose remaining ListPostings Length

Signed-off-by: Ben Ye <benye@amazon.com>

---------

Signed-off-by: Ben Ye <benye@amazon.com>
This commit is contained in:
Ben Ye 2025-01-07 08:58:26 -08:00 committed by GitHub
parent 18bb8bf996
commit 919a5b657e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 0 deletions

View file

@ -863,6 +863,11 @@ func (it *ListPostings) Err() error {
return nil return nil
} }
// Len returns the remaining number of postings in the list.
func (it *ListPostings) Len() int {
return len(it.list)
}
// bigEndianPostings implements the Postings interface over a byte stream of // bigEndianPostings implements the Postings interface over a byte stream of
// big endian numbers. // big endian numbers.
type bigEndianPostings struct { type bigEndianPostings struct {

View file

@ -1244,63 +1244,78 @@ func TestPostingsWithIndexHeap(t *testing.T) {
func TestListPostings(t *testing.T) { func TestListPostings(t *testing.T) {
t.Run("empty list", func(t *testing.T) { t.Run("empty list", func(t *testing.T) {
p := NewListPostings(nil) p := NewListPostings(nil)
require.Equal(t, 0, p.(*ListPostings).Len())
require.False(t, p.Next()) require.False(t, p.Next())
require.False(t, p.Seek(10)) require.False(t, p.Seek(10))
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("one posting", func(t *testing.T) { t.Run("one posting", func(t *testing.T) {
t.Run("next", func(t *testing.T) { t.Run("next", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10}) p := NewListPostings([]storage.SeriesRef{10})
require.Equal(t, 1, p.(*ListPostings).Len())
require.True(t, p.Next()) require.True(t, p.Next())
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek less", func(t *testing.T) { t.Run("seek less", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10}) p := NewListPostings([]storage.SeriesRef{10})
require.Equal(t, 1, p.(*ListPostings).Len())
require.True(t, p.Seek(5)) require.True(t, p.Seek(5))
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.True(t, p.Seek(5)) require.True(t, p.Seek(5))
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek equal", func(t *testing.T) { t.Run("seek equal", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10}) p := NewListPostings([]storage.SeriesRef{10})
require.Equal(t, 1, p.(*ListPostings).Len())
require.True(t, p.Seek(10)) require.True(t, p.Seek(10))
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek more", func(t *testing.T) { t.Run("seek more", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10}) p := NewListPostings([]storage.SeriesRef{10})
require.Equal(t, 1, p.(*ListPostings).Len())
require.False(t, p.Seek(15)) require.False(t, p.Seek(15))
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek after next", func(t *testing.T) { t.Run("seek after next", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10}) p := NewListPostings([]storage.SeriesRef{10})
require.Equal(t, 1, p.(*ListPostings).Len())
require.True(t, p.Next()) require.True(t, p.Next())
require.False(t, p.Seek(15)) require.False(t, p.Seek(15))
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
}) })
t.Run("multiple postings", func(t *testing.T) { t.Run("multiple postings", func(t *testing.T) {
t.Run("next", func(t *testing.T) { t.Run("next", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10, 20}) p := NewListPostings([]storage.SeriesRef{10, 20})
require.Equal(t, 2, p.(*ListPostings).Len())
require.True(t, p.Next()) require.True(t, p.Next())
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.True(t, p.Next()) require.True(t, p.Next())
require.Equal(t, storage.SeriesRef(20), p.At()) require.Equal(t, storage.SeriesRef(20), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek", func(t *testing.T) { t.Run("seek", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10, 20}) p := NewListPostings([]storage.SeriesRef{10, 20})
require.Equal(t, 2, p.(*ListPostings).Len())
require.True(t, p.Seek(5)) require.True(t, p.Seek(5))
require.Equal(t, storage.SeriesRef(10), p.At()) require.Equal(t, storage.SeriesRef(10), p.At())
require.True(t, p.Seek(5)) require.True(t, p.Seek(5))
@ -1315,23 +1330,30 @@ func TestListPostings(t *testing.T) {
require.Equal(t, storage.SeriesRef(20), p.At()) require.Equal(t, storage.SeriesRef(20), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.NoError(t, p.Err()) require.NoError(t, p.Err())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek lest than last", func(t *testing.T) { t.Run("seek lest than last", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50}) p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50})
require.Equal(t, 5, p.(*ListPostings).Len())
require.True(t, p.Seek(45)) require.True(t, p.Seek(45))
require.Equal(t, storage.SeriesRef(50), p.At()) require.Equal(t, storage.SeriesRef(50), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek exactly last", func(t *testing.T) { t.Run("seek exactly last", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50}) p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50})
require.Equal(t, 5, p.(*ListPostings).Len())
require.True(t, p.Seek(50)) require.True(t, p.Seek(50))
require.Equal(t, storage.SeriesRef(50), p.At()) require.Equal(t, storage.SeriesRef(50), p.At())
require.False(t, p.Next()) require.False(t, p.Next())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
t.Run("seek more than last", func(t *testing.T) { t.Run("seek more than last", func(t *testing.T) {
p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50}) p := NewListPostings([]storage.SeriesRef{10, 20, 30, 40, 50})
require.Equal(t, 5, p.(*ListPostings).Len())
require.False(t, p.Seek(60)) require.False(t, p.Seek(60))
require.False(t, p.Next()) require.False(t, p.Next())
require.Equal(t, 0, p.(*ListPostings).Len())
}) })
}) })