You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-library/vendor/github.com/upper/db/v4/internal/sqladapter/exql/column.go

82 lines
1.6 KiB

package exql
import (
"fmt"
"strings"
)
type columnT struct {
Name string
Alias string
}
// Column represents a SQL column.
type Column struct {
Name interface{}
Alias string
hash hash
}
var _ = Fragment(&Column{})
// ColumnWithName creates and returns a Column with the given name.
func ColumnWithName(name string) *Column {
return &Column{Name: name}
}
// Hash returns a unique identifier for the struct.
func (c *Column) Hash() string {
return c.hash.Hash(c)
}
// Compile transforms the ColumnValue into an equivalent SQL representation.
func (c *Column) Compile(layout *Template) (compiled string, err error) {
if z, ok := layout.Read(c); ok {
return z, nil
}
alias := c.Alias
switch value := c.Name.(type) {
case string:
input := trimString(value)
chunks := separateByAS(input)
if len(chunks) == 1 {
chunks = separateBySpace(input)
}
name := chunks[0]
nameChunks := strings.SplitN(name, layout.ColumnSeparator, 2)
for i := range nameChunks {
nameChunks[i] = trimString(nameChunks[i])
if nameChunks[i] == "*" {
continue
}
nameChunks[i] = layout.MustCompile(layout.IdentifierQuote, Raw{Value: nameChunks[i]})
}
compiled = strings.Join(nameChunks, layout.ColumnSeparator)
if len(chunks) > 1 {
alias = trimString(chunks[1])
alias = layout.MustCompile(layout.IdentifierQuote, Raw{Value: alias})
}
case Raw:
compiled = value.String()
default:
compiled = fmt.Sprintf("%v", c.Name)
}
if alias != "" {
compiled = layout.MustCompile(layout.ColumnAliasLayout, columnT{compiled, alias})
}
layout.Write(c, compiled)
return
}