From 9fdb86c4cf5fca8b9926ba5ff1b8bf1085957366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Wed, 14 Sep 2022 19:23:04 +0200 Subject: [PATCH] Add date_format to supported QL functions --- pkg/dal/runner_gval.go | 6 ++++++ pkg/expr/func_time.go | 20 +------------------- pkg/gvalfnc/time.go | 18 ++++++++++++++++++ store/adapters/rdbms/ql/ref.go | 5 +++++ 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/pkg/dal/runner_gval.go b/pkg/dal/runner_gval.go index fdb270b83..a887c7b61 100644 --- a/pkg/dal/runner_gval.go +++ b/pkg/dal/runner_gval.go @@ -166,6 +166,11 @@ var ( return fmt.Sprintf("date(%s)", args[0]) }, }, + "date_format": { + Handler: func(args ...string) string { + return fmt.Sprintf("strftime(%s, %s)", args[0], args[1]) + }, + }, // generic stuff "null": { @@ -270,6 +275,7 @@ func newGval(expr string) (gval.Evaluable, error) { gval.Function("quarter", gvalfnc.Quarter), gval.Function("year", gvalfnc.Year), gval.Function("month", gvalfnc.Month), + gval.Function("strftime", gvalfnc.StrfTime), gval.Function("date", gvalfnc.Date), gval.Function("isNil", gvalfnc.IsNil), gval.Function("float", gvalfnc.CastFloat), diff --git a/pkg/expr/func_time.go b/pkg/expr/func_time.go index 11998fee2..9e4e35ce0 100644 --- a/pkg/expr/func_time.go +++ b/pkg/expr/func_time.go @@ -6,7 +6,6 @@ import ( "github.com/PaesslerAG/gval" "github.com/cortezaproject/corteza-server/pkg/gvalfnc" - "github.com/lestrrat-go/strftime" ) func TimeFunctions() []gval.Language { @@ -20,7 +19,7 @@ func TimeFunctions() []gval.Language { gval.Function("modMonth", modMonth), gval.Function("modYear", modYear), gval.Function("parseDuration", time.ParseDuration), - gval.Function("strftime", strfTime), + gval.Function("strftime", gvalfnc.StrfTime), gval.Function("isLeapYear", isLeapYear), gval.Function("now", now), gval.Function("isWeekDay", isWeekDay), @@ -163,23 +162,6 @@ func modYear(base interface{}, mod interface{}) (*time.Time, error) { return &tmp, nil } -// Strftime formats time with POSIX standard format -// More details here: -// https://github.com/lestrrat-go/strftime#supported-conversion-specifications -func strfTime(base interface{}, f string) (string, error) { - t, _, err := gvalfnc.PrepMod(base, 0) - - if err != nil { - return "", err - } - - o, _ := strftime.Format(f, *t, - strftime.WithMilliseconds('b'), - strftime.WithUnixSeconds('L')) - - return o, nil -} - // sub returns difference between two date into milliseconds func sub(from interface{}, to interface{}) (out int64, err error) { t1, _, err := gvalfnc.PrepMod(from, 0) diff --git a/pkg/gvalfnc/time.go b/pkg/gvalfnc/time.go index ee166c833..8f5ae39a9 100644 --- a/pkg/gvalfnc/time.go +++ b/pkg/gvalfnc/time.go @@ -4,6 +4,7 @@ import ( "errors" "time" + "github.com/lestrrat-go/strftime" "github.com/spf13/cast" ) @@ -76,3 +77,20 @@ func PrepMod(base interface{}, mod interface{}) (*time.Time, int, error) { return t, m, nil } + +// Strftime formats time with POSIX standard format +// More details here: +// https://github.com/lestrrat-go/strftime#supported-conversion-specifications +func StrfTime(base interface{}, f string) (string, error) { + t, _, err := PrepMod(base, 0) + + if err != nil { + return "", err + } + + o, _ := strftime.Format(f, *t, + strftime.WithMilliseconds('b'), + strftime.WithUnixSeconds('L')) + + return o, nil +} diff --git a/store/adapters/rdbms/ql/ref.go b/store/adapters/rdbms/ql/ref.go index b95d2784a..fb4372e0d 100644 --- a/store/adapters/rdbms/ql/ref.go +++ b/store/adapters/rdbms/ql/ref.go @@ -176,6 +176,11 @@ var ( //}, // - filtering + "date_format": { + Handler: func(args ...exp.Expression) exp.Expression { + return exp.NewSQLFunctionExpression("DATE_FORMAT", args[0], args[1]) + }, + }, "now": { Handler: func(args ...exp.Expression) exp.Expression { return exp.NewSQLFunctionExpression("NOW")