diff --git a/sqlbuilder/func.go b/sqlbuilder/func.go new file mode 100644 index 0000000..adc095e --- /dev/null +++ b/sqlbuilder/func.go @@ -0,0 +1,57 @@ +package sqlbuilder + +import "bytes" + +type FuncExpression struct { + isExpression + isProjection + + name string + expression Expression + + alias string +} + +func (f *FuncExpression) As(alias string) Projection { + newFuncExpression := *f + + newFuncExpression.alias = alias + + return &newFuncExpression +} + +func (f *FuncExpression) SerializeSql(out *bytes.Buffer) error { + out.WriteString(f.name) + out.WriteString("(") + err := f.expression.SerializeSql(out) + if err != nil { + return err + } + out.WriteString(")") + + if f.alias != "" { + out.WriteString(` AS "`) + out.WriteString(f.alias) + out.WriteString(`"`) + } + + return nil +} + +func (f *FuncExpression) SerializeSqlForColumnList(out *bytes.Buffer) error { + return f.SerializeSql(out) +} + +func MAX(expression Expression) *FuncExpression { + return &FuncExpression{ + name: "MAX", + expression: expression, + } +} + +func SUM(expression Expression) *FuncExpression { + return &FuncExpression{ + name: "SUM", + expression: expression, + } +}