No description
Find a file
2017-07-09 15:17:59 +02:00
cmd added match logic and query error checking 2017-07-09 15:09:39 +02:00
filter.go added comments 2017-07-09 15:17:59 +02:00
filter_test.go added match logic and query error checking 2017-07-09 15:09:39 +02:00
LICENSE initial commit 2017-07-09 01:05:58 +02:00
README.md added match logic and query error checking 2017-07-09 15:09:39 +02:00

filter - a simple struct field filter for go

Usage

// Example data structure
type Example struct {
        String string
        Int    int
        Bool   bool
        Struct Struct1
}

type Struct1 struct {
        String string
        Struct Struct2
}

type Struct2 struct {
        Int int
}

// Filter implements the filter.Filter interface
type Filter []Example

func (v Filter) Len() int                { return len(v) }
func (v Filter) Index(i int) interface{} { return v[i] }
func (v *Filter) Remove(i, j int)        { *v = append((*v)[:i], (*v)[j:]...) }

// Example data
var data = Filter{
        {"str1", 42, true, Struct1{"s1", Struct2{1}}},
        {"2str", 42, true, Struct1{"s2", Struct2{2}}},
        {"str3", 42, false, Struct1{"s3", Struct2{3}}},
}

Filter logic

Supported logical matching:

  • AND - all of the queries have to match
  • OR - only one query has to match
  • NOT - none of the queries have to match

Explicit match

filter.NewQuery("Bool:true", filter.OR).Filter(&data)

data = [{str1 42 true {s1 {1}}} {str2 42 true {s2 {2}}}]

Wildcard match

filter.NewQuery("String:s*", filter.OR).Filter(&data)

data = [{str1 42 true {s1 {1}}} {str3 42 false {s3 {3}}}]

Nested struct match

filter.NewQuery("Struct.Struct.Int:3", filter.OR).Filter(&data)

data = [{str3 42 false {s3 {3}}}]

Multiple matches

filter.NewQuery("Struct.String:*2 Bool:true", filter.AND).Filter(&data)

data = [{2str 42 true {s2 {2}}}]

Benchmarks

go test -cpu 1,2,4 --bench .
BenchmarkFilterSimple               	 2000000	       877 ns/op	     432 B/op	      12 allocs/op
BenchmarkFilterSimple-2             	 2000000	       865 ns/op	     432 B/op	      12 allocs/op
BenchmarkFilterSimple-4             	 1000000	      1713 ns/op	     432 B/op	      12 allocs/op
BenchmarkFilterComplex              	  500000	      3032 ns/op	     672 B/op	      48 allocs/op
BenchmarkFilterComplex-2            	  500000	      3100 ns/op	     672 B/op	      48 allocs/op
BenchmarkFilterComplex-4            	  500000	      6235 ns/op	     672 B/op	      48 allocs/op
BenchmarkFilterComplexOr            	  500000	      2649 ns/op	     816 B/op	      39 allocs/op
BenchmarkFilterComplexOr-2          	  500000	      2659 ns/op	     816 B/op	      39 allocs/op
BenchmarkFilterComplexOr-4          	  500000	      5548 ns/op	     816 B/op	      39 allocs/op
BenchmarkGenericFilterSimple        	  500000	      2340 ns/op	    1200 B/op	      24 allocs/op
BenchmarkGenericFilterSimple-2      	 1000000	      2307 ns/op	    1200 B/op	      24 allocs/op
BenchmarkGenericFilterSimple-4      	 1000000	      3615 ns/op	    1200 B/op	      24 allocs/op
BenchmarkGenericFilterComplex       	  200000	      7073 ns/op	    1680 B/op	      96 allocs/op
BenchmarkGenericFilterComplex-2     	  200000	      7598 ns/op	    1680 B/op	      96 allocs/op
BenchmarkGenericFilterComplex-4     	  200000	     10735 ns/op	    1680 B/op	      96 allocs/op
BenchmarkGenericFilterComplexOr     	  200000	      5406 ns/op	    2456 B/op	      61 allocs/op
BenchmarkGenericFilterComplexOr-2   	  300000	      5300 ns/op	    2456 B/op	      61 allocs/op
BenchmarkGenericFilterComplexOr-4   	  200000	      7707 ns/op	    2456 B/op	      61 allocs/op