func TestNamespaces(t *testing.T) { a1 := value.NewStringValue("a1") b1 := value.NewStringValue("b1") b2 := value.NewStringValue("b2") c1 := value.NewStringValue("c1") d1 := value.NewStringValue("d1") readers := []expr.ContextReader{ datasource.NewNamespacedContextReader(datasource.NewContextSimpleData(map[string]value.Value{ "a": a1, "b": b1, "d": d1, }), "foo"), datasource.NewNamespacedContextReader(datasource.NewContextSimpleData(map[string]value.Value{ "b": b2, "c": c1, }), "BAR"), datasource.NewContextSimpleData(map[string]value.Value{ "a": a1, }), } nc := datasource.NewNestedContextReader(readers, time.Now()) expected := map[string]value.Value{ "foo.a": a1, "foo.b": b1, "foo.d": d1, "bar.b": b2, "bar.c": c1, "a": a1, } for k, v := range expected { checkval(t, nc, k, v) } r := nc.Row() assert.Equal(t, len(expected), len(r)) for k, v := range expected { assert.Equal(t, v, r[k]) } // _, ok := nc.Get("no") // assert.Equal(t, false, ok) }
func BenchmarkVmExecute(b *testing.B) { msg := datasource.NewContextSimpleData( map[string]value.Value{ "int5": value.NewIntValue(5), "item_count": value.NewStringValue("5"), "reg_date": value.NewStringValue("2014/11/01"), "user_id": value.NewStringValue("abc")}, ) b.ReportAllocs() b.StartTimer() for i := 0; i < b.N; i++ { for _, sqlText := range bmSql { verifyBenchmarkSql(b, sqlText, msg) } } }
func BenchmarkVmExecuteNoParse(b *testing.B) { readContext := datasource.NewContextSimpleData( map[string]value.Value{ "int5": value.NewIntValue(5), "item_count": value.NewStringValue("5"), "reg_date": value.NewStringValue("2014/11/01"), "user_id": value.NewStringValue("abc")}, ) sqlVm, err := NewSqlVm(bmSql[0]) if err != nil { b.Fail() } writeContext := datasource.NewContextSimple() b.ReportAllocs() b.StartTimer() for i := 0; i < b.N; i++ { err = sqlVm.Execute(writeContext, readContext) if err != nil { b.Fail() } } }
} expr.FuncAdd("eq", Eq) expr.FuncAdd("toint", ToInt) expr.FuncAdd("yy", Yy) } var ( // This is the message context which will be added to all tests below // and be available to the VM runtime for evaluation by using // key's such as "int5" or "user_id" msgContext = datasource.NewContextSimpleData(map[string]value.Value{ "int5": value.NewIntValue(5), "str5": value.NewStringValue("5"), "bvalt": value.NewBoolValue(true), "bvalf": value.NewBoolValue(false), "user_id": value.NewStringValue("abc"), }) // list of tests vmTests = []vmTest{ // Between: Tri Node Tests vmt("tri between ints", `10 BETWEEN 1 AND 50`, true, noError), vmt("tri between ints false", `10 BETWEEN 20 AND 50`, false, noError), vmtall("tri between ints false", `10 BETWEEN 20 AND true`, nil, parseOk, evalError), // In: Multi Arg Tests vmtall("multi-arg: In (x,y,z) ", `10 IN ("a","b",10, 4.5)`, true, parseOk, evalError), vmtall("multi-arg: In (x,y,z) ", `10 IN ("a","b",20, 4.5)`, false, parseOk, evalError), vmtall("multi-arg: In (x,y,z) ", `"a" IN ("a","b",10, 4.5)`, true, parseOk, evalError),
u.SetColorOutput() } builtins.LoadAllBuiltins() } var ( t1, _ = dateparse.ParseAny("12/18/2019") // This is the message context which will be added to all tests below // and be available to the VM runtime for evaluation by using // key's such as "int5" or "user_id" msgContext = datasource.NewContextSimpleData(map[string]value.Value{ "int5": value.NewIntValue(5), "str5": value.NewStringValue("5"), "created": value.NewTimeValue(t1), "bvalt": value.NewBoolValue(true), "bvalf": value.NewBoolValue(false), "user_id": value.NewStringValue("abc"), "urls": value.NewStringsValue([]string{"abc", "123"}), "hits": value.NewMapIntValue(map[string]int64{"google.com": 5, "bing.com": 1}), "email": value.NewStringValue("*****@*****.**"), }) vmTestsx = []vmTest{ // Native LIKE keyword vmt(`["portland"] LIKE "*land"`, true, noError), } // list of tests vmTests = []vmTest{ // Date math vmt(`created > "now-1M"`, true, noError), vmt(`now() > todate("01/01/2014")`, true, noError),