mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| package tsdb
 | |
| 
 | |
| import "context"
 | |
| 
 | |
| type Batch struct {
 | |
| 	DataSourceId int64
 | |
| 	Queries      QuerySlice
 | |
| 	Depends      map[string]bool
 | |
| 	Done         bool
 | |
| 	Started      bool
 | |
| }
 | |
| 
 | |
| type BatchSlice []*Batch
 | |
| 
 | |
| func newBatch(dsId int64, queries QuerySlice) *Batch {
 | |
| 	return &Batch{
 | |
| 		DataSourceId: dsId,
 | |
| 		Queries:      queries,
 | |
| 		Depends:      make(map[string]bool),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (bg *Batch) process(ctx context.Context, queryContext *QueryContext) {
 | |
| 	executor, err := getExecutorFor(bg.Queries[0].DataSource)
 | |
| 
 | |
| 	if err != nil {
 | |
| 		bg.Done = true
 | |
| 		result := &BatchResult{
 | |
| 			Error:        err,
 | |
| 			QueryResults: make(map[string]*QueryResult),
 | |
| 		}
 | |
| 		for _, query := range bg.Queries {
 | |
| 			result.QueryResults[query.RefId] = &QueryResult{Error: result.Error}
 | |
| 		}
 | |
| 		queryContext.ResultsChan <- result
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	res := executor.Execute(ctx, bg.Queries, queryContext)
 | |
| 	bg.Done = true
 | |
| 	queryContext.ResultsChan <- res
 | |
| }
 | |
| 
 | |
| func (bg *Batch) addQuery(query *Query) {
 | |
| 	bg.Queries = append(bg.Queries, query)
 | |
| }
 | |
| 
 | |
| func (bg *Batch) allDependenciesAreIn(context *QueryContext) bool {
 | |
| 	for key := range bg.Depends {
 | |
| 		if _, exists := context.Results[key]; !exists {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func getBatches(req *Request) (BatchSlice, error) {
 | |
| 	batches := make(BatchSlice, 0)
 | |
| 
 | |
| 	for _, query := range req.Queries {
 | |
| 		if foundBatch := findMatchingBatchGroup(query, batches); foundBatch != nil {
 | |
| 			foundBatch.addQuery(query)
 | |
| 		} else {
 | |
| 			newBatch := newBatch(query.DataSource.Id, QuerySlice{query})
 | |
| 			batches = append(batches, newBatch)
 | |
| 
 | |
| 			for _, refId := range query.Depends {
 | |
| 				for _, batch := range batches {
 | |
| 					for _, batchQuery := range batch.Queries {
 | |
| 						if batchQuery.RefId == refId {
 | |
| 							newBatch.Depends[refId] = true
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return batches, nil
 | |
| }
 | |
| 
 | |
| func findMatchingBatchGroup(query *Query, batches BatchSlice) *Batch {
 | |
| 	for _, batch := range batches {
 | |
| 		if batch.DataSourceId == query.DataSource.Id {
 | |
| 			return batch
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |