@@ -57,6 +57,17 @@ func (s indexWriterSeriesSlice) Less(i, j int) bool {
5757 return labels .Compare (s [i ].labels , s [j ].labels ) < 0
5858}
5959
60+ type symbolFrequencyPair struct {
61+ symbol string
62+ frequency int
63+ }
64+
65+ type symbolFrequencylist []symbolFrequencyPair
66+
67+ func (s symbolFrequencylist ) Len () int { return len (s ) }
68+ func (s symbolFrequencylist ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
69+ func (s symbolFrequencylist ) Less (i , j int ) bool { return s [i ].frequency < s [j ].frequency }
70+
6071type indexWriterStage uint8
6172
6273const (
@@ -334,17 +345,17 @@ func (w *Writer) AddSeries(ref uint64, lset labels.Labels, chunks ...chunks.Meta
334345 return nil
335346}
336347
337- func (w * Writer ) AddSymbols (sym map [string ]struct {} ) error {
348+ func (w * Writer ) AddSymbols (sym map [string ]int ) error {
338349 if err := w .ensureStage (idxStageSymbols ); err != nil {
339350 return err
340351 }
341352 // Generate sorted list of strings we will store as reference table.
342- symbols := make ([] string , 0 , len (sym ))
353+ symbols := make (symbolFrequencylist , 0 , len (sym ))
343354
344- for s := range sym {
345- symbols = append (symbols , s )
355+ for k , v := range sym {
356+ symbols = append (symbols , symbolFrequencyPair { k , v } )
346357 }
347- sort .Strings ( symbols )
358+ sort .Sort ( sort . Reverse ( symbols ) )
348359
349360 const headerSize = 4
350361
@@ -356,8 +367,8 @@ func (w *Writer) AddSymbols(sym map[string]struct{}) error {
356367 w .symbols = make (map [string ]uint32 , len (symbols ))
357368
358369 for index , s := range symbols {
359- w .symbols [s ] = uint32 (index )
360- w .buf2 .putUvarintStr (s )
370+ w .symbols [s . symbol ] = uint32 (index )
371+ w .buf2 .putUvarintStr (s . symbol )
361372 }
362373
363374 w .buf1 .putBE32int (w .buf2 .len ())
@@ -856,11 +867,11 @@ func (r *Reader) lookupSymbol(o uint32) (string, error) {
856867}
857868
858869// Symbols returns a set of symbols that exist within the index.
859- func (r * Reader ) Symbols () (map [string ]struct {} , error ) {
860- res := make (map [string ]struct {} , len (r .symbols ))
870+ func (r * Reader ) Symbols () (map [string ]int , error ) {
871+ res := make (map [string ]int , len (r .symbols ))
861872
862873 for _ , s := range r .symbols {
863- res [s ] = struct {}{}
874+ res [s ] = 0
864875 }
865876 for _ , s := range r .symbolSlice {
866877 res [s ] = struct {}{}
0 commit comments