influxdb/query/control/queue.go

68 lines
1.1 KiB
Go

package control
import "container/heap"
// priorityQueue implements heap.Interface and holds Query objects.
type priorityQueue []*Query
func (pq priorityQueue) Len() int { return len(pq) }
func (pq priorityQueue) Less(i, j int) bool {
return pq[i].spec.Resources.Priority < pq[j].spec.Resources.Priority
}
func (pq priorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
}
func (pq *priorityQueue) Push(x interface{}) {
q := x.(*Query)
*pq = append(*pq, q)
}
func (pq *priorityQueue) Pop() interface{} {
old := *pq
n := len(old)
q := old[n-1]
*pq = old[0 : n-1]
return q
}
type PriorityQueue struct {
queue priorityQueue
}
func newPriorityQueue() *PriorityQueue {
return &PriorityQueue{
queue: make(priorityQueue, 0, 100),
}
}
func (p *PriorityQueue) Push(q *Query) {
heap.Push(&p.queue, q)
}
func (p *PriorityQueue) Peek() *Query {
for {
if p.queue.Len() == 0 {
return nil
}
q := p.queue[0]
if q.isOK() {
return q
}
heap.Pop(&p.queue)
}
}
func (p *PriorityQueue) Pop() *Query {
for {
if p.queue.Len() == 0 {
return nil
}
q := heap.Pop(&p.queue).(*Query)
if q.isOK() {
return q
}
}
}