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  }