cloudflare/pint

Public

mirrored from https://github.com/cloudflare/pintAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.17.3

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

internal/parser/utils/aggregation.go

94lines · modeblame

e6be01a8Lukasz Mierzwa4 years ago1package utils
2
3import (
4"github.com/cloudflare/pint/internal/parser"
5
6promParser "github.com/prometheus/prometheus/promql/parser"
7"github.com/rs/zerolog/log"
8)
9
b92428fbLukasz Mierzwa4 years ago10func HasOuterAggregation(node *parser.PromQLNode) (aggs []*promParser.AggregateExpr) {
e6be01a8Lukasz Mierzwa4 years ago11if n, ok := node.Node.(*promParser.AggregateExpr); ok {
12switch n.Op {
13case promParser.SUM:
14case promParser.MIN:
15case promParser.MAX:
16case promParser.AVG:
17case promParser.GROUP:
18case promParser.STDDEV:
19case promParser.STDVAR:
20case promParser.COUNT:
21case promParser.COUNT_VALUES:
22case promParser.BOTTOMK:
23goto NEXT
24case promParser.TOPK:
25goto NEXT
26case promParser.QUANTILE:
27default:
28log.Warn().Str("op", n.Op.String()).Msg("Unsupported aggregation operation")
29}
b92428fbLukasz Mierzwa4 years ago30aggs = append(aggs, n)
31return aggs
e6be01a8Lukasz Mierzwa4 years ago32}
33
34NEXT:
b92428fbLukasz Mierzwa4 years ago35if n, ok := node.Node.(*promParser.BinaryExpr); ok {
3b6c7e83Lukasz Mierzwa4 years ago36if n.VectorMatching != nil {
37switch n.VectorMatching.Card {
38case promParser.CardOneToOne:
39case promParser.CardOneToMany:
40for i, child := range node.Children {
41if i == len(node.Children)-1 {
42a := HasOuterAggregation(child)
43if len(a) > 0 && !a[0].Without {
44a[0].Grouping = append(a[0].Grouping, n.VectorMatching.Include...)
45}
46return a
47}
48}
49case promParser.CardManyToOne:
50a := HasOuterAggregation(node.Children[0])
51if len(a) > 0 && !a[0].Without {
52a[0].Grouping = append(a[0].Grouping, n.VectorMatching.Include...)
53}
54return a
55case promParser.CardManyToMany:
56default:
57log.Warn().Str("matching", n.VectorMatching.Card.String()).Msg("Unsupported VectorMatching operation")
58}
59}
60
b92428fbLukasz Mierzwa4 years ago61if n.Op.IsComparisonOperator() {
3b6c7e83Lukasz Mierzwa4 years ago62for i, child := range node.Children {
63if n.VectorMatching != nil {
64a := HasOuterAggregation(child)
65if len(a) > 0 && !a[0].Without {
66a[0].Grouping = append(a[0].Grouping, n.VectorMatching.Include...)
67}
68return a
69}
70if i == 0 {
71return HasOuterAggregation(child)
72}
b92428fbLukasz Mierzwa4 years ago73}
74} else {
75switch n.Op {
76case promParser.LOR:
77for _, child := range node.Children {
78aggs = append(aggs, HasOuterAggregation(child)...)
79}
80return aggs
81case promParser.DIV, promParser.LUNLESS, promParser.LAND:
82for _, child := range node.Children {
83return HasOuterAggregation(child)
84}
85}
86}
e6be01a8Lukasz Mierzwa4 years ago87}
88
89for _, child := range node.Children {
b92428fbLukasz Mierzwa4 years ago90aggs = append(aggs, HasOuterAggregation(child)...)
e6be01a8Lukasz Mierzwa4 years ago91}
92
b92428fbLukasz Mierzwa4 years ago93return aggs
e6be01a8Lukasz Mierzwa4 years ago94}