github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/storage/stores/tsdb/querier_test.go (about) 1 package tsdb 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 "github.com/prometheus/common/model" 9 "github.com/prometheus/prometheus/model/labels" 10 "github.com/stretchr/testify/require" 11 12 "github.com/grafana/loki/pkg/logql/syntax" 13 "github.com/grafana/loki/pkg/storage/stores/tsdb/index" 14 ) 15 16 func mustParseLabels(s string) labels.Labels { 17 ls, err := syntax.ParseLabels(s) 18 if err != nil { 19 panic(err) 20 } 21 return ls 22 } 23 24 func TestQueryIndex(t *testing.T) { 25 dir := t.TempDir() 26 b := NewBuilder() 27 cases := []struct { 28 labels labels.Labels 29 chunks []index.ChunkMeta 30 }{ 31 { 32 labels: mustParseLabels(`{foo="bar"}`), 33 chunks: []index.ChunkMeta{ 34 { 35 Checksum: 1, 36 MinTime: 1, 37 MaxTime: 10, 38 KB: 10, 39 Entries: 10, 40 }, 41 { 42 Checksum: 2, 43 MinTime: 5, 44 MaxTime: 15, 45 KB: 10, 46 Entries: 10, 47 }, 48 }, 49 }, 50 { 51 labels: mustParseLabels(`{foo="bar", bazz="buzz"}`), 52 chunks: []index.ChunkMeta{ 53 { 54 Checksum: 3, 55 MinTime: 20, 56 MaxTime: 30, 57 KB: 10, 58 Entries: 10, 59 }, 60 { 61 Checksum: 4, 62 MinTime: 40, 63 MaxTime: 50, 64 KB: 10, 65 Entries: 10, 66 }, 67 }, 68 }, 69 { 70 labels: mustParseLabels(`{unrelated="true"}`), 71 chunks: []index.ChunkMeta{ 72 { 73 Checksum: 1, 74 MinTime: 1, 75 MaxTime: 10, 76 KB: 10, 77 Entries: 10, 78 }, 79 { 80 Checksum: 2, 81 MinTime: 5, 82 MaxTime: 15, 83 KB: 10, 84 Entries: 10, 85 }, 86 }, 87 }, 88 } 89 for _, s := range cases { 90 b.AddSeries(s.labels, model.Fingerprint(s.labels.Hash()), s.chunks) 91 } 92 93 dst, err := b.Build(context.Background(), dir, func(from, through model.Time, checksum uint32) Identifier { 94 id := SingleTenantTSDBIdentifier{ 95 TS: time.Now(), 96 From: from, 97 Through: through, 98 Checksum: checksum, 99 } 100 return newPrefixedIdentifier(id, dir, dir) 101 }) 102 require.Nil(t, err) 103 104 reader, err := index.NewFileReader(dst.Path()) 105 require.Nil(t, err) 106 107 p, err := PostingsForMatchers(reader, nil, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")) 108 require.Nil(t, err) 109 110 var ( 111 chks []index.ChunkMeta 112 ls labels.Labels 113 ) 114 115 require.True(t, p.Next()) 116 _, err = reader.Series(p.At(), &ls, &chks) 117 require.Nil(t, err) 118 require.Equal(t, cases[0].labels.String(), ls.String()) 119 require.Equal(t, cases[0].chunks, chks) 120 require.True(t, p.Next()) 121 _, err = reader.Series(p.At(), &ls, &chks) 122 require.Nil(t, err) 123 require.Equal(t, cases[1].labels.String(), ls.String()) 124 require.Equal(t, cases[1].chunks, chks) 125 require.False(t, p.Next()) 126 127 mint, maxt := reader.Bounds() 128 require.Equal(t, int64(1), mint) 129 require.Equal(t, int64(50), maxt) 130 }