filter.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // +build !nofilter
  2. package filtering
  3. import (
  4. "fmt"
  5. "os"
  6. "github.com/araddon/qlbridge/datasource"
  7. "github.com/araddon/qlbridge/expr"
  8. "github.com/araddon/qlbridge/value"
  9. "github.com/araddon/qlbridge/vm"
  10. )
  11. type ExprValue struct {
  12. node expr.Node
  13. expression string
  14. }
  15. func (e *ExprValue) String() string {
  16. if e.node != nil {
  17. return e.node.String()
  18. } else {
  19. return "<Empty Expression>"
  20. }
  21. }
  22. func (e *ExprValue) Set(value string) error {
  23. if value == "" {
  24. e.node = nil
  25. e.expression = value
  26. return nil
  27. }
  28. ast, err := expr.ParseExpression(value)
  29. if err != nil {
  30. return err
  31. }
  32. e.node = ast
  33. e.expression = value
  34. return nil
  35. }
  36. func (e *ExprValue) Validate(line map[string]interface{}) bool {
  37. if e.node == nil {
  38. return true
  39. }
  40. context := datasource.NewContextSimpleNative(line)
  41. val, ok := vm.Eval(context, e.node)
  42. if !ok || val == nil { // errors when evaluating
  43. return false
  44. }
  45. if bv, isBool := val.(value.BoolValue); isBool {
  46. return bv.Val()
  47. }
  48. fmt.Fprintln(os.Stderr, "WARNING: The 'where' expression doesn't return a boolean")
  49. return false
  50. }