// todate: convert to Date // // todate(field) uses araddon\dateparse util to recognize formats // // todate("01/02/2006", field ) uses golang date parse rules // first parameter is the layout/format // // func ToDate(ctx expr.EvalContext, items ...value.Value) (value.TimeValue, bool) { if len(items) == 1 { dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.TimeZeroValue, false } //u.Infof("v=%v %v ", v, item.Rv()) if t, err := dateparse.ParseAny(dateStr); err == nil { return value.NewTimeValue(t), true } } else if len(items) == 2 { dateStr, ok := value.ToString(items[1].Rv()) if !ok { return value.TimeZeroValue, false } formatStr, ok := value.ToString(items[0].Rv()) if !ok { return value.TimeZeroValue, false } //u.Infof("hello layout=%v time=%v", formatStr, dateStr) if t, err := time.Parse(formatStr, dateStr); err == nil { return value.NewTimeValue(t), true } } return value.TimeZeroValue, false }
// Get current time of Message (message time stamp) or else choose current // server time if none is available in message context // func Now(ctx expr.EvalContext, items ...value.Value) (value.TimeValue, bool) { if ctx != nil && !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewTimeValue(t), true } return value.NewTimeValue(time.Now().In(time.UTC)), true }
// Get current time of Message (message time stamp) or else choose current // server time if none is available in message context // func Now(ctx expr.EvalContext, items ...value.Value) (value.TimeValue, bool) { u.Debugf("Now: %v", ctx.Ts()) if !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewTimeValue(t), true } return value.NewTimeValue(time.Now().In(time.UTC)), true }
// todate func ToDate(ctx expr.EvalContext, item value.Value) (value.TimeValue, bool) { dateStr, ok := value.ToString(item.Rv()) if !ok { return value.TimeZeroValue, false } //u.Infof("v=%v %v ", v, item.Rv()) if t, err := dateparse.ParseAny(dateStr); err == nil { return value.NewTimeValue(t), true } return value.TimeZeroValue, false }
{`path("https://www.Google.com/blog/hello.html")`, value.NewStringValue("/blog/hello.html")}, {`path("www.Google.com/?q=golang")`, value.NewStringValue("/")}, {`path("c://Windows/really")`, value.NewStringValue("//windows/really")}, {`path("/home/aaron/vm")`, value.NewStringValue("/home/aaron/vm")}, {`qs("https://www.Google.com/search?q=golang","q")`, value.NewStringValue("golang")}, {`qs("www.Google.com/?q=golang","q")`, value.NewStringValue("golang")}, {`urlminusqs("http://www.Google.com/search?q1=golang&q2=github","q1")`, value.NewStringValue("http://www.Google.com/search?q2=github")}, {`urlminusqs("http://www.Google.com/search?q1=golang&q2=github","q3")`, value.NewStringValue("http://www.Google.com/search?q1=golang&q2=github")}, {`urlminusqs("http://www.Google.com/search?q1=golang","q1")`, value.NewStringValue("http://www.Google.com/search")}, {`urlmain("http://www.Google.com/search?q1=golang&q2=github")`, value.NewStringValue("www.Google.com/search")}, // ts2 = time.Date(2014, 4, 7, 0, 0, 0, 00, time.UTC) // Eu style {`todate("02/01/2006","07/04/2014")`, value.NewTimeValue(ts2)}, {`toint("5")`, value.NewIntValue(5)}, {`toint("hello")`, value.ErrValue}, {`toint("$ 5.22")`, value.NewIntValue(5)}, {`toint("5.56")`, value.NewIntValue(5)}, {`toint("$5.56")`, value.NewIntValue(5)}, {`toint("5,555.00")`, value.NewIntValue(5555)}, {`toint("€ 5,555.00")`, value.NewIntValue(5555)}, {`tonumber("5")`, value.NewNumberValue(float64(5))}, {`tonumber("hello")`, value.ErrValue}, {`tonumber("$ 5.22")`, value.NewNumberValue(float64(5.22))}, {`tonumber("5.56")`, value.NewNumberValue(float64(5.56))}, {`tonumber("$5.56")`, value.NewNumberValue(float64(5.56))}, {`tonumber("5,555.00")`, value.NewNumberValue(float64(5555.00))},
{`yy()`, value.NewIntValue(int64(ts.Year() - 2000))}, {`mm("10/13/2014")`, value.NewIntValue(10)}, {`mm("01/02/2006")`, value.NewIntValue(1)}, {`yymm("10/13/2014")`, value.NewStringValue("1410")}, {`yymm("01/02/2006")`, value.NewStringValue("0601")}, {`hourofday("Apr 7, 2014 4:58:55 PM")`, value.NewIntValue(16)}, {`hourofday()`, value.NewIntValue(16)}, {`hourofweek("Apr 7, 2014 4:58:55 PM")`, value.NewIntValue(40)}, {`totimestamp("Apr 7, 2014 4:58:55 PM")`, value.NewIntValue(1396889935)}, {`todate("Apr 7, 2014 4:58:55 PM")`, value.NewTimeValue(ts)}, {`exists(event)`, value.BoolValueTrue}, {`exists(price)`, value.BoolValueTrue}, {`exists(toint(price))`, value.BoolValueTrue}, {`exists(-1)`, value.BoolValueTrue}, {`exists(non_field)`, value.BoolValueFalse}, {`pow(5,2)`, value.NewNumberValue(25)}, {`pow(2,2)`, value.NewNumberValue(4)}, {`pow(NotAField,2)`, value.ErrValue}, {`sqrt(4)`, value.NewNumberValue(2)}, {`sqrt(25)`, value.NewNumberValue(5)}, {`sqrt(NotAField)`, value.ErrValue},
ts2 = time.Date(2014, 4, 7, 0, 0, 0, 00, time.UTC) regTime, _ = dateparse.ParseAny(regDate) readContext = datasource.NewContextUrlValuesTs(url.Values{ "event": {"hello"}, "reg_date": {"10/13/2014"}, "price": {"$55"}, "email": {"*****@*****.**"}, "url": {"http://www.site.com/membership/all.html"}, "score_amount": {"22"}, "tag_name": {"bob"}, }, ts) float3pt1 = float64(3.1) ) var builtinTestsx = []testBuiltins{ {`cast(reg_date as time)`, value.NewTimeValue(regTime)}, {`CHAR_LENGTH(CAST("abc" AS CHAR))`, value.NewIntValue(3)}, } var builtinTests = []testBuiltins{ {`eq(5,5)`, value.BoolValueTrue}, {`eq("hello", event)`, value.BoolValueTrue}, {`eq(5,6)`, value.BoolValueFalse}, {`eq(5.5,6)`, value.BoolValueFalse}, {`eq(true,eq(5,5))`, value.BoolValueTrue}, {`eq(true,false)`, value.BoolValueFalse}, {`eq(not_a_field,5)`, value.BoolValueFalse}, {`eq(eq(not_a_field,5),false)`, value.BoolValueTrue}, {`ne(5,5)`, value.BoolValueFalse}, {`ne("hello", event)`, value.BoolValueFalse},
if *VerboseTests { u.SetupLogging("debug") 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