package filtering import ( "fmt" "os" "github.com/araddon/qlbridge/datasource" "github.com/araddon/qlbridge/expr" "github.com/araddon/qlbridge/value" "github.com/araddon/qlbridge/vm" ) type ExprValue struct { Node expr.Node Expression string } func (e *ExprValue) String() string { if e.Node != nil { return e.Node.String() } else { return "" } } func (e *ExprValue) Set(value string) error { if value == "" { e.Node = nil e.Expression = value return nil } ast, err := expr.ParseExpression(value) if err != nil { return err } e.Node = ast e.Expression = value return nil } func (e *ExprValue) Validate(line map[string]interface{}) bool { if e.Node == nil { return true } context := datasource.NewContextSimpleNative(line) val, ok := vm.Eval(context, e.Node) if !ok || val == nil { // errors when evaluating return false } if val.Type() != value.BoolType { fmt.Fprintln(os.Stderr, "WARNING: The 'where' expression doesn't return a boolean") return false } if val.Value().(bool) != true { return false } return true }