// len: length of array types // // len([1,2,3]) => 3, true // len(not_a_field) => -- NilInt, false // func LengthFunc(ctx expr.EvalContext, val value.Value) (value.IntValue, bool) { switch node := val.(type) { case value.StringValue: return value.NewIntValue(int64(len(node.Val()))), true case value.BoolValue: return value.NewIntValue(0), true case value.NumberValue: return value.NewIntValue(0), true case value.IntValue: return value.NewIntValue(0), true case value.TimeValue: return value.NewIntValue(0), true case value.StringsValue: return value.NewIntValue(int64(node.Len())), true case value.SliceValue: return value.NewIntValue(int64(node.Len())), true case value.ByteSliceValue: return value.NewIntValue(int64(node.Len())), true case value.MapIntValue: return value.NewIntValue(int64(len(node.Val()))), true case value.MapNumberValue: return value.NewIntValue(int64(len(node.Val()))), true case value.MapStringValue: return value.NewIntValue(int64(len(node.Val()))), true case value.MapValue: return value.NewIntValue(int64(len(node.Val()))), true case nil, value.NilValue: return value.NewIntNil(), false } return value.NewIntNil(), false }
// day of week [0-6] func DayOfWeek(ctx expr.EvalContext, items ...value.Value) (value.IntValue, bool) { if len(items) == 0 { if !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewIntValue(int64(t.Weekday())), true } } else if len(items) == 1 { dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.NewIntNil(), false } //u.Infof("v=%v %v ", v, items[0].Rv()) if t, err := dateparse.ParseAny(dateStr); err == nil { return value.NewIntValue(int64(t.Weekday())), true } } return value.NewIntNil(), false }