having_operator.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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.GroupedTuplesSet:
  15. r := xsql.GroupedTuplesSet{}
  16. for _, v := range input {
  17. ve := &xsql.ValuerEval{Valuer: xsql.MultiAggregateValuer(v, &xsql.FunctionValuer{}, &xsql.AggregateFunctionValuer{Data: v})}
  18. result, ok := ve.Eval(p.Condition).(bool)
  19. if ok {
  20. if result {
  21. r = append(r, v)
  22. }
  23. } else {
  24. log.Errorf("invalid condition that returns non-bool value")
  25. return nil
  26. }
  27. }
  28. if len(r) > 0 {
  29. return r
  30. }
  31. case xsql.WindowTuplesSet:
  32. if len(input) != 1 {
  33. log.Infof("WindowTuplesSet with multiple tuples cannot be evaluated")
  34. return nil
  35. }
  36. ms := input[0].Tuples
  37. r := ms[:0]
  38. for _, v := range ms {
  39. //ve := &xsql.ValuerEval{Valuer: xsql.MultiValuer(&v, &xsql.FunctionValuer{})}
  40. ve := &xsql.ValuerEval{Valuer: xsql.MultiAggregateValuer(input, &v, &xsql.FunctionValuer{}, &xsql.AggregateFunctionValuer{Data: input}, &xsql.WildcardValuer{Data: &v})}
  41. result, ok := ve.Eval(p.Condition).(bool)
  42. if ok {
  43. if result {
  44. r = append(r, v)
  45. }
  46. } else {
  47. log.Errorf("invalid condition that returns non-bool value")
  48. return nil
  49. }
  50. }
  51. if len(r) > 0 {
  52. input[0].Tuples = r
  53. return input
  54. }
  55. case xsql.JoinTupleSets:
  56. ms := input
  57. r := ms[:0]
  58. for _, v := range ms {
  59. //ve := &xsql.ValuerEval{Valuer: xsql.MultiValuer(&v, &xsql.FunctionValuer{})}
  60. ve := &xsql.ValuerEval{Valuer: xsql.MultiAggregateValuer(input, &v, &xsql.FunctionValuer{}, &xsql.AggregateFunctionValuer{Data: input}, &xsql.WildcardValuer{Data: &v})}
  61. result, ok := ve.Eval(p.Condition).(bool)
  62. if ok {
  63. if result {
  64. r = append(r, v)
  65. }
  66. } else {
  67. log.Errorf("invalid condition that returns non-bool value")
  68. return nil
  69. }
  70. }
  71. if len(r) > 0{
  72. return r
  73. }
  74. default:
  75. log.Errorf("Expect xsql.Valuer or its array type.")
  76. return nil
  77. }
  78. return nil
  79. }