cloudflare/pint

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.28.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

internal/parser/utils/aggregation.go

94lines · modecode

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