github.com/aacfactory/fns-contrib/databases/sql@v1.2.84/dac/specifications/group.go (about) 1 package specifications 2 3 import ( 4 "github.com/aacfactory/errors" 5 "github.com/aacfactory/fns-contrib/databases/sql/dac/groups" 6 "github.com/valyala/bytebufferpool" 7 "io" 8 ) 9 10 type GroupBy struct { 11 groups.GroupBy 12 } 13 14 func (group GroupBy) Exist() bool { 15 return len(group.Bys) > 0 16 } 17 18 func (group GroupBy) Render(ctx Context, w io.Writer) (argument []any, err error) { 19 buf := bytebufferpool.Get() 20 defer bytebufferpool.Put(buf) 21 _, _ = buf.Write(GROUP) 22 _, _ = buf.Write(SPACE) 23 _, _ = buf.Write(BY) 24 _, _ = buf.Write(SPACE) 25 for i, field := range group.Bys { 26 if i > 0 { 27 _, _ = buf.Write(COMMA) 28 } 29 content, localed := ctx.Localization(field) 30 if !localed { 31 err = errors.Warning("sql: group by render failed").WithMeta("field", field) 32 return 33 } 34 _, _ = buf.WriteString(content[0]) 35 } 36 if group.Havings.Exist() { 37 _, _ = buf.Write(SPACE) 38 _, _ = buf.Write(HAVING) 39 _, _ = buf.Write(SPACE) 40 argument, err = Condition{group.Havings}.Render(ctx, buf) 41 if err != nil { 42 err = errors.Warning("sql: group by render failed").WithCause(err) 43 return 44 } 45 } 46 _, err = w.Write([]byte(buf.String())) 47 if err != nil { 48 err = errors.Warning("sql: group by render failed").WithCause(err) 49 return 50 } 51 return 52 }