filter.go 1.1 KB

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