From 776d993d8335a5d33eb8bd54a5ec68c2c7343de0 Mon Sep 17 00:00:00 2001 From: zhangleitao Date: Fri, 13 Sep 2024 11:56:52 +0800 Subject: [PATCH 1/3] feat: support native SQL as custom fields --- field/export.go | 4 ++++ field/export_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/field/export.go b/field/export.go index aef41a75..a51b021a 100644 --- a/field/export.go +++ b/field/export.go @@ -32,6 +32,10 @@ func NewField(table, column string, opts ...Option) Field { return Field{expr: expr{col: toColumn(table, column, opts...)}} } +func NewFieldRaw(rawSql string, vars ...interface{}) Field { + return Field{expr: expr{e: clause.Expr{SQL: rawSql, Vars: vars}}} +} + // NewSerializer create new field2 func NewSerializer(table, column string, opts ...Option) Serializer { return Serializer{expr: expr{col: toColumn(table, column, opts...)}} diff --git a/field/export_test.go b/field/export_test.go index 30c3d4b6..6157c26f 100644 --- a/field/export_test.go +++ b/field/export_test.go @@ -89,6 +89,56 @@ func TestExpr_Build(t *testing.T) { Expr: field.NewField("", "id").GroupConcat(), Result: "GROUP_CONCAT(`id`)", }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1"), + Result: "if(column1=?,column2,column3)", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").Eq(p), + Result: "if(column1=?,column2,column3) = ?", + ExpectedVars: []interface{}{"1", p}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", field.NewField("", "new_id")).Eq(p), + Result: "if(column1=`new_id`,column2,column3) = ?", + ExpectedVars: []interface{}{p}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").EqCol(field.NewField("", "new_id")), + Result: "if(column1=?,column2,column3) = `new_id`", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").EqCol(field.NewField("", "new_id").WithTable("tableB")), + Result: "if(column1=?,column2,column3) = `tableB`.`new_id`", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").IsNull(), + Result: "if(column1=?,column2,column3) IS NULL", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").GroupConcat(), + Result: "GROUP_CONCAT(if(column1=?,column2,column3))", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").Desc(), + Result: "if(column1=?,column2,column3) DESC", + ExpectedVars: []interface{}{"1"}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").IfNull(p), + Result: "IFNULL(if(column1=?,column2,column3),?)", + ExpectedVars: []interface{}{"1", p}, + }, + { + Expr: field.NewFieldRaw("if(column1=?,column2,column3)", "1").As("column4"), + Result: "if(column1=?,column2,column3) AS `column4`", + ExpectedVars: []interface{}{"1"}, + }, { Expr: field.Func.UnixTimestamp(), Result: "UNIX_TIMESTAMP()", From ef1c91c8577f2fbf3ec72da277fb1f228b1ea01c Mon Sep 17 00:00:00 2001 From: zhangleitao Date: Fri, 13 Sep 2024 13:12:08 +0800 Subject: [PATCH 2/3] add comment --- field/export.go | 1 + 1 file changed, 1 insertion(+) diff --git a/field/export.go b/field/export.go index a51b021a..37d75b6f 100644 --- a/field/export.go +++ b/field/export.go @@ -32,6 +32,7 @@ func NewField(table, column string, opts ...Option) Field { return Field{expr: expr{col: toColumn(table, column, opts...)}} } +// NewFieldRaw create new field by native sql func NewFieldRaw(rawSql string, vars ...interface{}) Field { return Field{expr: expr{e: clause.Expr{SQL: rawSql, Vars: vars}}} } From a2fe7a45bc41530815647f1a64328e4fb5949a7c Mon Sep 17 00:00:00 2001 From: zhangleitao Date: Fri, 13 Sep 2024 13:13:51 +0800 Subject: [PATCH 3/3] fix var name format --- field/export.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/field/export.go b/field/export.go index 37d75b6f..7364152d 100644 --- a/field/export.go +++ b/field/export.go @@ -33,8 +33,8 @@ func NewField(table, column string, opts ...Option) Field { } // NewFieldRaw create new field by native sql -func NewFieldRaw(rawSql string, vars ...interface{}) Field { - return Field{expr: expr{e: clause.Expr{SQL: rawSql, Vars: vars}}} +func NewFieldRaw(rawSQL string, vars ...interface{}) Field { + return Field{expr: expr{e: clause.Expr{SQL: rawSQL, Vars: vars}}} } // NewSerializer create new field2