@@ -55,6 +55,17 @@ func (s indexWriterSeriesSlice) Less(i, j int) bool {
5555 return labels .Compare (s [i ].labels , s [j ].labels ) < 0
5656}
5757
58+ type symbolFrequencyPair struct {
59+ symbol string
60+ frequency int
61+ }
62+
63+ type symbolFrequencylist []symbolFrequencyPair
64+
65+ func (s symbolFrequencylist ) Len () int { return len (s ) }
66+ func (s symbolFrequencylist ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
67+ func (s symbolFrequencylist ) Less (i , j int ) bool { return s [i ].frequency < s [j ].frequency }
68+
5869type indexWriterStage uint8
5970
6071const (
@@ -332,17 +343,17 @@ func (w *Writer) AddSeries(ref uint64, lset labels.Labels, chunks ...chunks.Meta
332343 return nil
333344}
334345
335- func (w * Writer ) AddSymbols (sym map [string ]struct {} ) error {
346+ func (w * Writer ) AddSymbols (sym map [string ]int ) error {
336347 if err := w .ensureStage (idxStageSymbols ); err != nil {
337348 return err
338349 }
339350 // Generate sorted list of strings we will store as reference table.
340- symbols := make ([] string , 0 , len (sym ))
351+ symbols := make (symbolFrequencylist , 0 , len (sym ))
341352
342- for s := range sym {
343- symbols = append (symbols , s )
353+ for k , v := range sym {
354+ symbols = append (symbols , symbolFrequencyPair { k , v } )
344355 }
345- sort .Strings ( symbols )
356+ sort .Sort ( sort . Reverse ( symbols ) )
346357
347358 const headerSize = 4
348359
@@ -354,8 +365,8 @@ func (w *Writer) AddSymbols(sym map[string]struct{}) error {
354365 w .symbols = make (map [string ]uint32 , len (symbols ))
355366
356367 for index , s := range symbols {
357- w .symbols [s ] = uint32 (index )
358- w .buf2 .putUvarintStr (s )
368+ w .symbols [s . symbol ] = uint32 (index )
369+ w .buf2 .putUvarintStr (s . symbol )
359370 }
360371
361372 w .buf1 .putBE32int (w .buf2 .len ())
@@ -834,11 +845,11 @@ func (r *Reader) lookupSymbol(o uint32) (string, error) {
834845}
835846
836847// Symbols returns a set of symbols that exist within the index.
837- func (r * Reader ) Symbols () (map [string ]struct {} , error ) {
838- res := make (map [string ]struct {} , len (r .symbols ))
848+ func (r * Reader ) Symbols () (map [string ]int , error ) {
849+ res := make (map [string ]int , len (r .symbols ))
839850
840851 for _ , s := range r .symbols {
841- res [s ] = struct {}{}
852+ res [s ] = 0
842853 }
843854 return res , nil
844855}
0 commit comments