Fix date/time functions in record queries

This commit is contained in:
Denis Arh
2022-03-18 20:38:34 +01:00
parent 745a501019
commit 046855cb30
4 changed files with 13 additions and 0 deletions
+6
View File
@@ -7,6 +7,7 @@ import (
"github.com/cortezaproject/corteza-server/pkg/ql"
"github.com/cortezaproject/corteza-server/pkg/qlng"
"github.com/cortezaproject/corteza-server/store/rdbms"
"github.com/davecgh/go-spew/spew"
)
var (
@@ -38,13 +39,18 @@ func sqlASTFormatter(n *qlng.ASTNode) rdbms.HandlerSig {
}
func sqlFunctionHandler(f ql.Function) (ql.ASTNode, error) {
spew.Dump(f)
switch strings.ToUpper(f.Name) {
case "QUARTER", "YEAR":
return ql.MakeFormattedNode(fmt.Sprintf("EXTRACT(%s FROM %%s::date)", f.Name), f.Arguments...), nil
case "DATE_FORMAT":
return ql.MakeReplacedFormattedNode("TO_CHAR(%s, %s)", translateDateFormatParams, f.Arguments...), nil
case "TIMESTAMP":
return ql.MakeFormattedNode("TIMESTAMPTZ(%s::TIMESTAMPTZ)", f.Arguments...), nil
case "DATE":
return ql.MakeFormattedNode("%s::DATE", f.Arguments...), nil
case "TIME":
return ql.MakeFormattedNode("DATE_TRUNC('second', %s::TIME)::TIME", f.Arguments...), nil
case "DATE_ADD", "DATE_SUB", "STD":
return nil, fmt.Errorf("%q function is currently unsupported in PostgreSQL store backend", f.Name)
}
+2
View File
@@ -540,6 +540,7 @@ func (s Store) convertComposeRecordFilter(m *types.Module, f types.RecordFilter)
// Resolve all identifiers found in the query
// into their table/column counterparts
fp.OnIdent = identResolver
fp.OnFunction = s.SqlFunctionHandler
if fn, err = fp.ParseExpression(f.Query); err != nil {
return
@@ -559,6 +560,7 @@ func (s Store) convertComposeRecordFilter(m *types.Module, f types.RecordFilter)
// Resolve all identifiers found in sort
// into their table/column counterparts
sp.OnIdent = identResolver
sp.OnFunction = s.SqlFunctionHandler
if _, err = sp.ParseColumns(f.Sort.String()); err != nil {
return
+2
View File
@@ -117,6 +117,8 @@ func sqlFunctionHandler(f ql.Function) (ql.ASTNode, error) {
return ql.MakeFormattedNode("STRFTIME('%%Y', %s)", f.Arguments...), nil
case "NOW":
return ql.MakeFormattedNode("DATE('now')", f.Arguments...), nil
case "TIMESTAMP", "DATETIME":
return ql.MakeFormattedNode("DATETIME(%s)", f.Arguments...), nil
case "DATE_FORMAT":
if len(f.Arguments) != 2 {
return nil, fmt.Errorf("expecting exactly two arguments for DATE_FORMAT function")
+3
View File
@@ -1665,8 +1665,11 @@ func testComposeRecords(t *testing.T, s store.ComposeRecords) {
result string
}{
{"datetime1 = '2020-10-02T00:00:02'", "1002"},
{"TIMESTAMP(datetime1) = TIMESTAMP('2020-10-02T00:00:02')", "1002"},
{"date1 = '2020-10-02'", "2002"},
{"DATE(date1) = DATE('2020-10-02')", "2002"},
{"time1 = '02:00:00'", "3002"},
{"TIME(time1) = TIME('02:00:00')", "3002"},
{"datetime1 <= '2020-10-02T00:00:02'", "1001;1002"},
{"date1 <= '2020-10-02'", "2001;2002"},
{"time1 <= '02:00:00'", "3001;3002"},