Closed nwt closed 4 years ago
What I came up with requires a lot of patterns, so we're not going to do this.
case "int16", "uint16", "int32", "uint32", "int64", "uint64":
v, err := zng.Parse(l)
if err != nil {
return nil, err
}
// 1e9 patterns match a duration or time.
var patterns []zcode.Bytes
if f, ok := zngnative.CoerceToFloat64(v); ok {
patterns = append(patterns, zng.NewFloat64(f).Encode(nil))
patterns = append(patterns, zng.NewFloat64(f*1e9).Encode(nil))
}
if i, ok := zngnative.CoerceToInt(v); ok {
patterns = append(patterns, zng.NewInt64(i).Encode(nil))
patterns = append(patterns, zng.NewInt64(i*1e9).Encode(nil))
}
if u, ok := zngnative.CoerceToUint(v); ok {
patterns = append(patterns, zng.NewUint64(u).Encode(nil))
patterns = append(patterns, zng.NewUint64(u*1e9).Encode(nil))
if u < 65536 {
patterns = append(patterns, zng.NewPort(uint32(u)).Encode(nil))
}
}
var bfs []*BufferFilter
for _, p := range patterns {
bf := newBufferFilterForString(string(p))
if bf == nil {
return nil, nil
}
bfs = append(bfs, bf)
}
if len(bfs) == 0 {
return nil, nil
}
for len(bfs) > 1 {
len := len(bfs)
bfs[len-2] = &BufferFilter{op: opOr, left: bfs[len-2], right: bfs[len-1]}
bfs = bfs[:len-1]
}
return bfs[0], nil
filter.newBufferFilterForLiteral ignores numeric types, but it doesn't have to.