filterPlan.go 817 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package planner
  2. import "github.com/emqx/kuiper/xsql"
  3. type FilterPlan struct {
  4. baseLogicalPlan
  5. condition xsql.Expr
  6. }
  7. func (p FilterPlan) Init() *FilterPlan {
  8. p.baseLogicalPlan.self = &p
  9. return &p
  10. }
  11. func (p *FilterPlan) PushDownPredicate(condition xsql.Expr) (xsql.Expr, LogicalPlan) {
  12. // if no child, swallow all conditions
  13. a := combine(condition, p.condition)
  14. if len(p.children) == 0 {
  15. p.condition = a
  16. return nil, p
  17. }
  18. rest, _ := p.baseLogicalPlan.PushDownPredicate(a)
  19. if rest != nil {
  20. p.condition = rest
  21. return nil, p
  22. } else if len(p.children) == 1 {
  23. // eliminate this filter
  24. return nil, p.children[0]
  25. } else {
  26. return nil, p
  27. }
  28. }
  29. func (p *FilterPlan) PruneColumns(fields []xsql.Expr) error {
  30. f := getFields(p.condition)
  31. return p.baseLogicalPlan.PruneColumns(append(fields, f...))
  32. }