@@ -37,7 +37,7 @@ func (s *QuerierServer) Series(req *querierpb.SeriesRequest, srv querierpb.Queri
3737 return fmt .Errorf ("fragment not found: %v" , key )
3838 }
3939
40- batchSize := int (req .Batchsize )
40+ batchSize := int (req .Batchsize ) // TODO: remove this
4141 if batchSize <= 0 {
4242 batchSize = BATCHSIZE
4343 }
@@ -47,7 +47,8 @@ func (s *QuerierServer) Series(req *querierpb.SeriesRequest, srv querierpb.Queri
4747 fragmentResult := result .Data .(FragmentResult )
4848 v1ResultData := fragmentResult .Data .(* v1.QueryData )
4949
50- if v1ResultData .ResultType == parser .ValueTypeMatrix {
50+ switch v1ResultData .ResultType {
51+ case parser .ValueTypeMatrix :
5152 series := v1ResultData .Result .(promql.Matrix )
5253 for i := 0 ; i < len (series ); i += batchSize {
5354 end := i + batchSize
@@ -72,7 +73,7 @@ func (s *QuerierServer) Series(req *querierpb.SeriesRequest, srv querierpb.Queri
7273 }
7374 return nil
7475
75- } else if v1ResultData . ResultType == parser .ValueTypeVector {
76+ case parser .ValueTypeVector :
7677 series := v1ResultData .Result .(promql.Vector )
7778 for i := 0 ; i < len (series ); i += batchSize {
7879 end := i + batchSize
@@ -110,61 +111,46 @@ func (s *QuerierServer) Series(req *querierpb.SeriesRequest, srv querierpb.Queri
110111func (s * QuerierServer ) Next (req * querierpb.NextRequest , srv querierpb.Querier_NextServer ) error {
111112 key := MakeFragmentKey (req .QueryID , req .FragmentID )
112113
114+ batchSize := int (req .Batchsize )
115+ if batchSize <= 0 {
116+ batchSize = BATCHSIZE
117+ }
118+
113119 for {
114- // TODO: maybe add a timeout thing here too
115120 result , ok := s .queryResultCache .Get (* key )
116121 if ! ok {
117122 return fmt .Errorf ("fragment not found: %v" , key )
118123 }
119124
120125 switch result .Status {
121126 case StatusDone :
122- batchSize := int (req .Batchsize )
123- if batchSize <= 0 {
124- batchSize = BATCHSIZE
125- }
126-
127127 fragmentResult := result .Data .(FragmentResult )
128128 v1ResultData := fragmentResult .Data .(* v1.QueryData )
129129
130- if v1ResultData .ResultType == parser .ValueTypeMatrix {
130+ switch v1ResultData .ResultType {
131+ case parser .ValueTypeMatrix :
131132 matrix := v1ResultData .Result .(promql.Matrix )
132133
133- for i := 0 ; i < len (matrix ); i += batchSize {
134- end := i + batchSize
135- if end > len (matrix ) {
136- end = len (matrix )
137- }
138-
139- batch := & querierpb.StepVectorBatch {
140- StepVectors : make ([]* querierpb.StepVector , 0 , end - i ),
141- }
134+ numTimeSteps := matrix .TotalSamples ()
142135
143- for _ , v := range (matrix )[i :end ] {
144- var floats []float64
145- var histograms []* histogram.FloatHistogram
136+ for timeStep := 0 ; timeStep < numTimeSteps ; timeStep ++ {
146137
147- for _ , f := range v .Floats {
148- floats = append (floats , f .F )
138+ for i , series := range matrix {
139+ batch := & querierpb.StepVectorBatch {
140+ StepVectors : make ([]* querierpb.StepVector , 0 , len (matrix )),
149141 }
150-
151- for _ , h := range v . Histograms {
152- histograms = append ( histograms , h . H )
142+ vector , err := s . createVectorForTimestep ( & series , timeStep , uint64 ( i ))
143+ if err != nil {
144+ return err
153145 }
154-
155- protoVector := & querierpb.StepVector {
156- T : 0 ,
157- Samples : floats ,
158- Histograms : FloatHistogramsToFloatHistogramProto (histograms ),
146+ batch .StepVectors = append (batch .StepVectors , vector )
147+ if err := srv .Send (batch ); err != nil {
148+ return fmt .Errorf ("error sending batch: %w" , err )
159149 }
160- batch .StepVectors = append (batch .StepVectors , protoVector )
161150 }
162- if err := srv .Send (batch ); err != nil {
163- return err
164- }
165- }
166151
167- } else if v1ResultData .ResultType == parser .ValueTypeVector {
152+ }
153+ case parser .ValueTypeVector :
168154 vector := v1ResultData .Result .(promql.Vector )
169155
170156 for i := 0 ; i < len (vector ); i += batchSize {
@@ -190,23 +176,52 @@ func (s *QuerierServer) Next(req *querierpb.NextRequest, srv querierpb.Querier_N
190176 return err
191177 }
192178 }
193- }
194-
195- return nil
196179
180+ default :
181+ return fmt .Errorf ("unsupported result type: %v" , v1ResultData .ResultType )
182+ }
197183 case StatusError :
198184 return fmt .Errorf ("fragment processing failed" )
199-
200185 case StatusWriting :
201186 time .Sleep (WritingTimeout )
202187 continue
203188 }
204189 }
205190}
206191
192+ func (s * QuerierServer ) createVectorForTimestep (series * promql.Series , timeStep int , sampleID uint64 ) (* querierpb.StepVector , error ) {
193+ var samples []float64
194+ var sampleIDs []uint64
195+ var histograms []* histogram.FloatHistogram
196+ var histogramIDs []uint64
197+ var timestamp int64
198+
199+ if timeStep < len (series .Floats ) {
200+ point := series .Floats [timeStep ]
201+ timestamp = point .T
202+ samples = append (samples , point .F )
203+ sampleIDs = append (sampleIDs , sampleID )
204+ }
205+
206+ if timeStep < len (series .Histograms ) {
207+ point := series .Histograms [timeStep ]
208+ timestamp = point .T
209+ histograms = append (histograms , point .H )
210+ histogramIDs = append (histogramIDs , uint64 (timeStep ))
211+ }
212+
213+ return & querierpb.StepVector {
214+ T : timestamp ,
215+ Sample_IDs : sampleIDs ,
216+ Samples : samples ,
217+ Histogram_IDs : histogramIDs ,
218+ Histograms : FloatHistogramsToFloatHistogramProto (histograms ),
219+ }, nil
220+ }
221+
207222func FloatHistogramsToFloatHistogramProto (histograms []* histogram.FloatHistogram ) []querierpb.Histogram {
208223 if histograms == nil {
209- return nil
224+ return []querierpb. Histogram {}
210225 }
211226
212227 protoHistograms := make ([]querierpb.Histogram , 0 , len (histograms ))
0 commit comments