fix(go): store protocol parsed fields in realtime kv
This commit is contained in:
@@ -28,7 +28,7 @@ func realtimeKVFields(env envelope.FrameEnvelope, parsed map[string]any) []Realt
|
||||
return nil
|
||||
}
|
||||
eventID := env.StableEventID()
|
||||
add := func(rows []RealtimeKVField, domain string, fields map[string]any) []RealtimeKVField {
|
||||
add := func(rows []RealtimeKVField, domain string, fields any) []RealtimeKVField {
|
||||
flat := map[string]any{}
|
||||
flattenKV("", fields, flat)
|
||||
names := make([]string, 0, len(flat))
|
||||
@@ -57,70 +57,35 @@ func realtimeKVFields(env envelope.FrameEnvelope, parsed map[string]any) []Realt
|
||||
}
|
||||
|
||||
var rows []RealtimeKVField
|
||||
switch env.Protocol {
|
||||
case envelope.ProtocolGB32960:
|
||||
units, ok := asAnySlice(parsed["data_units"])
|
||||
if !ok {
|
||||
return rows
|
||||
keys := make([]string, 0, len(parsed))
|
||||
for key := range parsed {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
metadata := map[string]any{}
|
||||
for _, key := range keys {
|
||||
domain := strings.TrimSpace(key)
|
||||
if domain == "" {
|
||||
continue
|
||||
}
|
||||
for _, unit := range units {
|
||||
unitMap, ok := unit.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
domain := strings.TrimSpace(strconvAny(unitMap["name"]))
|
||||
if domain == "" {
|
||||
domain = strings.TrimSpace(strconvAny(unitMap["type"]))
|
||||
}
|
||||
if domain == "" {
|
||||
continue
|
||||
}
|
||||
value, ok := unitMap["value"].(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
rows = add(rows, domain, domainKVFields(domain, value))
|
||||
value := parsed[key]
|
||||
switch typed := value.(type) {
|
||||
case map[string]any:
|
||||
rows = add(rows, domain, typed)
|
||||
case []any:
|
||||
rows = add(rows, domain, typed)
|
||||
case []map[string]any:
|
||||
rows = add(rows, domain, typed)
|
||||
default:
|
||||
metadata[domain] = value
|
||||
}
|
||||
case envelope.ProtocolJT808:
|
||||
fields := cloneFields(env.Fields)
|
||||
if location, ok := parsed["location"].(map[string]any); ok {
|
||||
for key, value := range location {
|
||||
fields[key] = value
|
||||
}
|
||||
}
|
||||
rows = add(rows, "location", fields)
|
||||
case envelope.ProtocolYutongMQTT:
|
||||
fields := cloneFields(env.Fields)
|
||||
if data, ok := parsed["data"].(map[string]any); ok {
|
||||
for key, value := range data {
|
||||
fields[key] = value
|
||||
}
|
||||
}
|
||||
rows = add(rows, "vehicle", fields)
|
||||
}
|
||||
if len(metadata) > 0 {
|
||||
rows = add(rows, "metadata", metadata)
|
||||
}
|
||||
return rows
|
||||
}
|
||||
|
||||
func domainKVFields(domain string, value map[string]any) map[string]any {
|
||||
out := cloneMap(value)
|
||||
if domain != "gd_fc_stack" {
|
||||
return out
|
||||
}
|
||||
summaries, ok := asAnySlice(out["summaries"])
|
||||
if !ok || len(summaries) != 1 {
|
||||
return out
|
||||
}
|
||||
summary, ok := summaries[0].(map[string]any)
|
||||
if !ok {
|
||||
return out
|
||||
}
|
||||
delete(out, "summaries")
|
||||
for key, value := range summary {
|
||||
out[key] = value
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func flattenKV(prefix string, value any, out map[string]any) {
|
||||
switch typed := value.(type) {
|
||||
case map[string]any:
|
||||
|
||||
Reference in New Issue
Block a user