cloudflare/pint

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.81.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

internal/parser/utils/conditions.go

83lines · modecode

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