-
Notifications
You must be signed in to change notification settings - Fork 14
/
quals.go
127 lines (114 loc) · 2.73 KB
/
quals.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package grpc
import (
"fmt"
"strings"
"time"
"github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
)
const (
IPv4 = "IPv4"
IPv6 = "IPv6"
)
func QualMapToString(qualMap map[string]*proto.Quals, pretty bool) string {
if len(qualMap) == 0 {
return ""
}
divider := "----------------------------------------------------------------\n"
var sb strings.Builder
if pretty {
sb.WriteString("\n")
sb.WriteString(divider)
}
for _, quals := range qualMap {
var qb strings.Builder
for _, q := range quals.GetQuals() {
qb.WriteString(QualToString(q))
}
sb.WriteString(qb.String())
}
if pretty {
sb.WriteString(divider)
}
return sb.String()
}
func QualMapToLogLine(qualMap map[string]*proto.Quals) string {
if len(qualMap) == 0 {
return "NONE"
}
var line strings.Builder
for column, quals := range qualMap {
for _, q := range quals.Quals {
line.WriteString(fmt.Sprintf("%s %s %s, ", column, q.Operator, q.Value.String()))
}
}
return line.String()
}
func QualMapsEqual(l map[string]*proto.Quals, r map[string]*proto.Quals) bool {
if len(l) != len(r) {
return false
}
for k, lQual := range l {
rQual, ok := r[k]
if !ok || !lQual.Equals(rQual) {
return false
}
}
return true
}
type SerializableQual struct {
Column string `json:"column"`
Operator string `json:"operator"`
Value any `json:"value"`
}
func QualMapToSerializableSlice(qualMap map[string]*proto.Quals) []SerializableQual {
if len(qualMap) == 0 {
return nil
}
var res []SerializableQual
for _, quals := range qualMap {
for _, q := range quals.GetQuals() {
res = append(res, SerializableQual{
Column: q.FieldName,
Operator: q.GetStringValue(),
Value: GetQualValue(q.Value),
})
}
}
return res
}
func QualToString(q *proto.Qual) string {
return fmt.Sprintf("Column: %s, Operator: '%s', Value: '%v'\n", q.FieldName, q.GetStringValue(), GetQualValue(q.Value))
}
func GetQualValue(v *proto.QualValue) interface{} {
var qv interface{}
switch v := v.GetValue().(type) {
case *proto.QualValue_InetValue:
qv = v.InetValue.Cidr
case *proto.QualValue_JsonbValue:
qv = v.JsonbValue
case *proto.QualValue_StringValue:
qv = v.StringValue
case *proto.QualValue_Int64Value:
qv = v.Int64Value
case *proto.QualValue_DoubleValue:
qv = v.DoubleValue
case *proto.QualValue_BoolValue:
qv = v.BoolValue
case *proto.QualValue_TimestampValue:
ts := v.TimestampValue
qv = time.Unix(ts.Seconds, int64(ts.Nanos))
case *proto.QualValue_ListValue:
var values []interface{}
for _, l := range v.ListValue.Values {
values = append(values, GetQualValue(l))
}
qv = values
default:
// not expected
qv = ""
}
return qv
}
func GetQualValueString(v *proto.QualValue) string {
return fmt.Sprintf("%v", GetQualValue(v))
}