cloudflare/pint

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.40.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

internal/parser/utils/conditions.go

78lines · modecode

1package utils
2
3import (
4 promParser "github.com/prometheus/prometheus/promql/parser"
5)
6
7// RemoveConditions takes a *valid* PromQL expression and removes
8// any condition from it.
9func RemoveConditions(source string) promParser.Node {
10 node, _ := promParser.ParseExpr(source)
11 switch n := node.(type) {
12 case *promParser.AggregateExpr:
13 n.Expr = RemoveConditions(n.Expr.String()).(promParser.Expr)
14 return n
15 case *promParser.BinaryExpr:
16 lhs := RemoveConditions(n.LHS.String())
17 rhs := RemoveConditions(n.RHS.String())
18 _, ln := lhs.(*promParser.NumberLiteral)
19 if v, ok := lhs.(*promParser.VectorSelector); ok && v.Name == "" {
20 ln = true
21 }
22 _, rn := rhs.(*promParser.NumberLiteral)
23 if v, ok := rhs.(*promParser.VectorSelector); ok && v.Name == "" {
24 rn = true
25 }
26 if ln && rn {
27 return &promParser.VectorSelector{}
28 }
29 if ln {
30 return rhs
31 }
32 if rn {
33 return lhs
34 }
35 n.LHS = lhs.(promParser.Expr)
36 n.RHS = rhs.(promParser.Expr)
37 return n
38 case *promParser.Call:
39 ret := promParser.Expressions{}
40 for i, e := range n.Args {
41 var vt promParser.ValueType
42 if i >= len(n.Func.ArgTypes) {
43 vt = n.Func.ArgTypes[len(n.Func.ArgTypes)-1]
44 } else {
45 vt = n.Func.ArgTypes[i]
46 }
47 // nolint: exhaustive
48 switch vt {
49 case promParser.ValueTypeVector, promParser.ValueTypeMatrix:
50 ret = append(ret, RemoveConditions(e.String()).(promParser.Expr))
51 default:
52 ret = append(ret, e)
53 }
54 }
55 n.Args = ret
56 return n
57 case *promParser.SubqueryExpr:
58 n.Expr = RemoveConditions(n.Expr.String()).(promParser.Expr)
59 return n
60 case *promParser.ParenExpr:
61 n.Expr = RemoveConditions(n.Expr.String()).(promParser.Expr)
62 switch n.Expr.(type) {
63 case *promParser.NumberLiteral, *promParser.StringLiteral, *promParser.VectorSelector, *promParser.MatrixSelector:
64 return n.Expr
65 }
66 return n
67 case *promParser.UnaryExpr:
68 n.Expr = RemoveConditions(n.Expr.String()).(promParser.Expr)
69 return n
70 case *promParser.StepInvariantExpr:
71 n.Expr = RemoveConditions(n.Expr.String()).(promParser.Expr)
72 return n
73 case *promParser.NumberLiteral, *promParser.StringLiteral, *promParser.VectorSelector, *promParser.MatrixSelector:
74 return node
75 default:
76 return node
77 }
78}
79