brimdata / super

A novel data lake based on super-structured data
https://zed.brimdata.io/
BSD 3-Clause "New" or "Revised" License
1.39k stars 64 forks source link

Handle numeric types in filter.newBufferFilterForLiteral #1140

Closed nwt closed 4 years ago

nwt commented 4 years ago

filter.newBufferFilterForLiteral ignores numeric types, but it doesn't have to.

nwt commented 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