having_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package plans
  2. import (
  3. "engine/xsql"
  4. "fmt"
  5. "reflect"
  6. "strings"
  7. "testing"
  8. )
  9. func TestHavingPlan_Apply(t *testing.T) {
  10. var tests = []struct {
  11. sql string
  12. data interface{}
  13. result interface{}
  14. }{
  15. {
  16. sql: `SELECT id1 FROM src1 HAVING avg(id1) > 1`,
  17. data: xsql.WindowTuplesSet{
  18. xsql.WindowTuples{
  19. Emitter:"src1",
  20. Tuples:[]xsql.Tuple{
  21. {
  22. Emitter: "src1",
  23. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  24. },{
  25. Emitter: "src1",
  26. Message: xsql.Message{"id1" : 2, "f1" : "v2"},
  27. },{
  28. Emitter: "src1",
  29. Message: xsql.Message{"id1" : 5, "f1" : "v1"},
  30. },
  31. },
  32. },
  33. },
  34. result: xsql.WindowTuplesSet{
  35. xsql.WindowTuples{
  36. Emitter:"src1",
  37. Tuples:[]xsql.Tuple{
  38. {
  39. Emitter: "src1",
  40. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  41. },{
  42. Emitter: "src1",
  43. Message: xsql.Message{"id1" : 2, "f1" : "v2"},
  44. },{
  45. Emitter: "src1",
  46. Message: xsql.Message{"id1" : 5, "f1" : "v1"},
  47. },
  48. },
  49. },
  50. },
  51. },
  52. {
  53. sql: `SELECT id1 FROM src1 HAVING sum(id1) > 1`,
  54. data: xsql.WindowTuplesSet{
  55. xsql.WindowTuples{
  56. Emitter:"src1",
  57. Tuples:[]xsql.Tuple{
  58. {
  59. Emitter: "src1",
  60. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  61. },
  62. },
  63. },
  64. },
  65. result: nil,
  66. },
  67. {
  68. sql: `SELECT id1 FROM src1 HAVING sum(id1) = 1`,
  69. data: xsql.WindowTuplesSet{
  70. xsql.WindowTuples{
  71. Emitter:"src1",
  72. Tuples:[]xsql.Tuple{
  73. {
  74. Emitter: "src1",
  75. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  76. },
  77. },
  78. },
  79. },
  80. result: xsql.WindowTuplesSet{
  81. xsql.WindowTuples{
  82. Emitter:"src1",
  83. Tuples:[]xsql.Tuple{
  84. {
  85. Emitter: "src1",
  86. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  87. },
  88. },
  89. },
  90. },
  91. },
  92. {
  93. sql: `SELECT id1 FROM src1 HAVING max(id1) > 10`,
  94. data: xsql.WindowTuplesSet{
  95. xsql.WindowTuples{
  96. Emitter:"src1",
  97. Tuples:[]xsql.Tuple{
  98. {
  99. Emitter: "src1",
  100. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  101. },
  102. },
  103. },
  104. },
  105. result: nil,
  106. },
  107. {
  108. sql: `SELECT id1 FROM src1 HAVING max(id1) = 1`,
  109. data: xsql.WindowTuplesSet{
  110. xsql.WindowTuples{
  111. Emitter:"src1",
  112. Tuples:[]xsql.Tuple{
  113. {
  114. Emitter: "src1",
  115. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  116. },
  117. },
  118. },
  119. },
  120. result: xsql.WindowTuplesSet{
  121. xsql.WindowTuples{
  122. Emitter:"src1",
  123. Tuples:[]xsql.Tuple{
  124. {
  125. Emitter: "src1",
  126. Message: xsql.Message{"id1" : 1, "f1" : "v1"},
  127. },
  128. },
  129. },
  130. },
  131. },
  132. }
  133. fmt.Printf("The test bucket size is %d.\n\n", len(tests))
  134. for i, tt := range tests {
  135. stmt, err := xsql.NewParser(strings.NewReader(tt.sql)).Parse()
  136. if err != nil {
  137. t.Errorf("statement parse error %s", err)
  138. break
  139. }
  140. pp := &HavingPlan{Condition:stmt.Having}
  141. result := pp.Apply(nil, tt.data)
  142. if !reflect.DeepEqual(tt.result, result) {
  143. t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.result, result)
  144. }
  145. }
  146. }