having_operator.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package plans
  2. import (
  3. "context"
  4. "engine/common"
  5. "engine/xsql"
  6. )
  7. type HavingPlan struct {
  8. Condition xsql.Expr
  9. }
  10. func (p *HavingPlan) Apply(ctx context.Context, data interface{}) interface{} {
  11. log := common.GetLogger(ctx)
  12. log.Debugf("having plan receive %s", data)
  13. switch input := data.(type) {
  14. case xsql.Valuer:
  15. ve := &xsql.ValuerEval{Valuer: xsql.MultiValuer(input, &xsql.FunctionValuer{})}
  16. result, ok := ve.Eval(p.Condition).(bool)
  17. if ok {
  18. if result {
  19. return input
  20. }
  21. } else {
  22. log.Errorf("invalid condition that returns non-bool value")
  23. }
  24. case xsql.WindowTuplesSet:
  25. if len(input) != 1 {
  26. log.Infof("WindowTuplesSet with multiple tuples cannot be evaluated")
  27. return nil
  28. }
  29. ms := input[0].Tuples
  30. r := ms[:0]
  31. for _, v := range ms {
  32. //ve := &xsql.ValuerEval{Valuer: xsql.MultiValuer(&v, &xsql.FunctionValuer{})}
  33. ve := &xsql.ValuerEval{Valuer: xsql.MultiAggregateValuer(input, &v, &xsql.FunctionValuer{}, &xsql.AggregateFunctionValuer{Data: input}, &xsql.WildcardValuer{Data: &v})}
  34. result, ok := ve.Eval(p.Condition).(bool)
  35. if ok {
  36. if result {
  37. r = append(r, v)
  38. }
  39. } else {
  40. log.Errorf("invalid condition that returns non-bool value")
  41. return nil
  42. }
  43. }
  44. if len(r) > 0 {
  45. input[0].Tuples = r
  46. return input
  47. }
  48. case xsql.JoinTupleSets:
  49. ms := input
  50. r := ms[:0]
  51. for _, v := range ms {
  52. //ve := &xsql.ValuerEval{Valuer: xsql.MultiValuer(&v, &xsql.FunctionValuer{})}
  53. ve := &xsql.ValuerEval{Valuer: xsql.MultiAggregateValuer(input, &v, &xsql.FunctionValuer{}, &xsql.AggregateFunctionValuer{Data: input}, &xsql.WildcardValuer{Data: &v})}
  54. result, ok := ve.Eval(p.Condition).(bool)
  55. if ok {
  56. if result {
  57. r = append(r, v)
  58. }
  59. } else {
  60. log.Errorf("invalid condition that returns non-bool value")
  61. return nil
  62. }
  63. }
  64. if len(r) > 0{
  65. return r
  66. }
  67. default:
  68. log.Errorf("Expect xsql.Valuer or its array type.")
  69. return nil
  70. }
  71. return nil
  72. }