cloudflare/pint

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.62.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

internal/parser/utils/aggregation.go

103lines · modecode

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