package plans import ( "engine/xsql" "fmt" "reflect" "strings" "testing" ) func TestHavingPlan_Apply(t *testing.T) { var tests = []struct { sql string data interface{} result interface{} }{ { sql: `SELECT id1 FROM src1 HAVING avg(id1) > 1`, data: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, },{ Emitter: "src1", Message: xsql.Message{"id1" : 2, "f1" : "v2"}, },{ Emitter: "src1", Message: xsql.Message{"id1" : 5, "f1" : "v1"}, }, }, }, }, result: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, },{ Emitter: "src1", Message: xsql.Message{"id1" : 2, "f1" : "v2"}, },{ Emitter: "src1", Message: xsql.Message{"id1" : 5, "f1" : "v1"}, }, }, }, }, }, { sql: `SELECT id1 FROM src1 HAVING sum(id1) > 1`, data: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, result: nil, }, { sql: `SELECT id1 FROM src1 HAVING sum(id1) = 1`, data: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, result: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, }, { sql: `SELECT id1 FROM src1 HAVING max(id1) > 10`, data: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, result: nil, }, { sql: `SELECT id1 FROM src1 HAVING max(id1) = 1`, data: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, result: xsql.WindowTuplesSet{ xsql.WindowTuples{ Emitter:"src1", Tuples:[]xsql.Tuple{ { Emitter: "src1", Message: xsql.Message{"id1" : 1, "f1" : "v1"}, }, }, }, }, }, } fmt.Printf("The test bucket size is %d.\n\n", len(tests)) for i, tt := range tests { stmt, err := xsql.NewParser(strings.NewReader(tt.sql)).Parse() if err != nil { t.Errorf("statement parse error %s", err) break } pp := &HavingPlan{Condition:stmt.Having} result := pp.Apply(nil, tt.data) if !reflect.DeepEqual(tt.result, result) { t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.result, result) } } }