|
|
@ -2728,6 +2728,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type groupedAggregation struct {
|
|
|
|
type groupedAggregation struct {
|
|
|
|
|
|
|
|
seen bool // Was this output groups seen in the input at this timestamp.
|
|
|
|
hasFloat bool // Has at least 1 float64 sample aggregated.
|
|
|
|
hasFloat bool // Has at least 1 float64 sample aggregated.
|
|
|
|
hasHistogram bool // Has at least 1 histogram sample aggregated.
|
|
|
|
hasHistogram bool // Has at least 1 histogram sample aggregated.
|
|
|
|
floatValue float64
|
|
|
|
floatValue float64
|
|
|
@ -2744,7 +2745,9 @@ type groupedAggregation struct {
|
|
|
|
func (ev *evaluator) aggregation(e *parser.AggregateExpr, q float64, inputMatrix, outputMatrix Matrix, seriesToResult []int, groups []groupedAggregation, enh *EvalNodeHelper) annotations.Annotations {
|
|
|
|
func (ev *evaluator) aggregation(e *parser.AggregateExpr, q float64, inputMatrix, outputMatrix Matrix, seriesToResult []int, groups []groupedAggregation, enh *EvalNodeHelper) annotations.Annotations {
|
|
|
|
op := e.Op
|
|
|
|
op := e.Op
|
|
|
|
var annos annotations.Annotations
|
|
|
|
var annos annotations.Annotations
|
|
|
|
seen := make([]bool, len(groups)) // Which output groups were seen in the input at this timestamp.
|
|
|
|
for i := range groups {
|
|
|
|
|
|
|
|
groups[i].seen = false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for si := range inputMatrix {
|
|
|
|
for si := range inputMatrix {
|
|
|
|
f, h, ok := ev.nextValues(enh.Ts, &inputMatrix[si])
|
|
|
|
f, h, ok := ev.nextValues(enh.Ts, &inputMatrix[si])
|
|
|
@ -2754,8 +2757,9 @@ func (ev *evaluator) aggregation(e *parser.AggregateExpr, q float64, inputMatrix
|
|
|
|
|
|
|
|
|
|
|
|
group := &groups[seriesToResult[si]]
|
|
|
|
group := &groups[seriesToResult[si]]
|
|
|
|
// Initialize this group if it's the first time we've seen it.
|
|
|
|
// Initialize this group if it's the first time we've seen it.
|
|
|
|
if !seen[seriesToResult[si]] {
|
|
|
|
if !group.seen {
|
|
|
|
*group = groupedAggregation{
|
|
|
|
*group = groupedAggregation{
|
|
|
|
|
|
|
|
seen: true,
|
|
|
|
floatValue: f,
|
|
|
|
floatValue: f,
|
|
|
|
floatMean: f,
|
|
|
|
floatMean: f,
|
|
|
|
groupCount: 1,
|
|
|
|
groupCount: 1,
|
|
|
@ -2776,7 +2780,6 @@ func (ev *evaluator) aggregation(e *parser.AggregateExpr, q float64, inputMatrix
|
|
|
|
case parser.GROUP:
|
|
|
|
case parser.GROUP:
|
|
|
|
group.floatValue = 1
|
|
|
|
group.floatValue = 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
seen[seriesToResult[si]] = true
|
|
|
|
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2867,7 +2870,7 @@ func (ev *evaluator) aggregation(e *parser.AggregateExpr, q float64, inputMatrix
|
|
|
|
numSteps := int((ev.endTimestamp-ev.startTimestamp)/ev.interval) + 1
|
|
|
|
numSteps := int((ev.endTimestamp-ev.startTimestamp)/ev.interval) + 1
|
|
|
|
|
|
|
|
|
|
|
|
for ri, aggr := range groups {
|
|
|
|
for ri, aggr := range groups {
|
|
|
|
if !seen[ri] {
|
|
|
|
if !aggr.seen {
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
switch op {
|
|
|
|
switch op {
|
|
|
@ -2924,7 +2927,9 @@ func (ev *evaluator) aggregationK(e *parser.AggregateExpr, k int, inputMatrix Ma
|
|
|
|
op := e.Op
|
|
|
|
op := e.Op
|
|
|
|
var s Sample
|
|
|
|
var s Sample
|
|
|
|
var annos annotations.Annotations
|
|
|
|
var annos annotations.Annotations
|
|
|
|
seen := make([]bool, len(groups)) // Which output groups were seen in the input at this timestamp.
|
|
|
|
for i := range groups {
|
|
|
|
|
|
|
|
groups[i].seen = false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for si := range inputMatrix {
|
|
|
|
for si := range inputMatrix {
|
|
|
|
f, _, ok := ev.nextValues(enh.Ts, &inputMatrix[si])
|
|
|
|
f, _, ok := ev.nextValues(enh.Ts, &inputMatrix[si])
|
|
|
@ -2935,12 +2940,12 @@ func (ev *evaluator) aggregationK(e *parser.AggregateExpr, k int, inputMatrix Ma
|
|
|
|
|
|
|
|
|
|
|
|
group := &groups[seriesToResult[si]]
|
|
|
|
group := &groups[seriesToResult[si]]
|
|
|
|
// Initialize this group if it's the first time we've seen it.
|
|
|
|
// Initialize this group if it's the first time we've seen it.
|
|
|
|
if !seen[seriesToResult[si]] {
|
|
|
|
if !group.seen {
|
|
|
|
*group = groupedAggregation{
|
|
|
|
*group = groupedAggregation{
|
|
|
|
|
|
|
|
seen: true,
|
|
|
|
heap: make(vectorByValueHeap, 1, k),
|
|
|
|
heap: make(vectorByValueHeap, 1, k),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
group.heap[0] = s
|
|
|
|
group.heap[0] = s
|
|
|
|
seen[seriesToResult[si]] = true
|
|
|
|
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2998,8 +3003,8 @@ func (ev *evaluator) aggregationK(e *parser.AggregateExpr, k int, inputMatrix Ma
|
|
|
|
seriess[hash] = ss
|
|
|
|
seriess[hash] = ss
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ri, aggr := range groups {
|
|
|
|
for _, aggr := range groups {
|
|
|
|
if !seen[ri] {
|
|
|
|
if !aggr.seen {
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
switch op {
|
|
|
|
switch op {
|
|
|
|