filter_test.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package plans
  2. import (
  3. "engine/xsql"
  4. "fmt"
  5. "reflect"
  6. "strings"
  7. "testing"
  8. )
  9. func TestFilterPlan_Apply(t *testing.T) {
  10. var tests = []struct {
  11. sql string
  12. data map[string]interface{}
  13. result interface{}
  14. }{
  15. {
  16. sql: "SELECT abc FROM tbl WHERE abc*2+3 > 12 AND abc < 20",
  17. data: map[string]interface{}{
  18. "a" : int64(6),
  19. },
  20. result: nil,
  21. },
  22. {
  23. sql: "SELECT abc FROM tbl WHERE abc*2+3 > 12 AND abc < 20",
  24. data: map[string]interface{}{
  25. "abc" : int64(6),
  26. },
  27. result: map[string]interface{}{
  28. "abc" : int64(6),
  29. },
  30. },
  31. {
  32. sql: "SELECT abc FROM tbl WHERE abc*2+3 > 12 OR def = \"hello\"",
  33. data: map[string]interface{}{
  34. "abc" : int64(34),
  35. "def" : "hello",
  36. },
  37. result: map[string]interface{}{
  38. "abc" : int64(34),
  39. "def" : "hello",
  40. },
  41. },
  42. }
  43. fmt.Printf("The test bucket size is %d.\n\n", len(tests))
  44. for i, tt := range tests {
  45. stmt, err := xsql.NewParser(strings.NewReader(tt.sql)).Parse()
  46. if err != nil {
  47. t.Errorf("statement parse error %s", err)
  48. break
  49. }
  50. pp := &FilterPlan{Condition:stmt.Condition}
  51. result := pp.Apply(nil, tt.data)
  52. if !reflect.DeepEqual(tt.result, result) {
  53. t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.result, result)
  54. }
  55. }
  56. }