-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcolumn.go
64 lines (53 loc) · 1.05 KB
/
column.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package q
import (
"github.com/wxy365/basal/opt"
)
type IColumn interface {
aliasable[IColumn]
named
namespaceAware
GetExpr(ctx *RenderCtx) string
iColumnIdentity()
}
type iColumnAdapter struct {
}
func (i *iColumnAdapter) iColumnIdentity() {}
type Column struct {
iColumnAdapter
namedImpl
alias string
namespaceAwareImpl
desc bool
}
func (c *Column) Alias() opt.Opt[string] {
return opt.Of(c.alias)
}
func (c *Column) As(alias string) IColumn {
c.alias = alias
return c
}
func (c *Column) isDesc() bool {
return c.desc
}
func (c *Column) Desc() OrderBySpec {
c.desc = true
return c
}
func (c *Column) OrderByName(escaper func(string) string) string {
colName := escaper(c.Alias().OrElse(c.Name()))
return opt.Map(
c.namespace(),
func(ns string) string {
return escaper(ns) + "." + colName
},
).OrElse(colName)
}
func (c *Column) GetExpr(ctx *RenderCtx) string {
fqn := GetColFqnNamePreferred(ctx, c)
return opt.Map(
c.Alias(),
func(alias string) string {
return fqn + " " + ctx.dbType.escaper()(alias)
},
).OrElse(fqn)
}