380 lines
8.4 KiB
Go
380 lines
8.4 KiB
Go
package exp
|
|
|
|
type (
|
|
SelectClauses interface {
|
|
HasSources() bool
|
|
IsDefaultSelect() bool
|
|
clone() *selectClauses
|
|
|
|
Select() ColumnListExpression
|
|
SelectAppend(cl ColumnListExpression) SelectClauses
|
|
SetSelect(cl ColumnListExpression) SelectClauses
|
|
|
|
Distinct() ColumnListExpression
|
|
SetDistinct(cle ColumnListExpression) SelectClauses
|
|
|
|
From() ColumnListExpression
|
|
SetFrom(cl ColumnListExpression) SelectClauses
|
|
|
|
HasAlias() bool
|
|
Alias() IdentifierExpression
|
|
SetAlias(ie IdentifierExpression) SelectClauses
|
|
|
|
Joins() JoinExpressions
|
|
JoinsAppend(jc JoinExpression) SelectClauses
|
|
|
|
Where() ExpressionList
|
|
ClearWhere() SelectClauses
|
|
WhereAppend(expressions ...Expression) SelectClauses
|
|
|
|
Having() ExpressionList
|
|
ClearHaving() SelectClauses
|
|
HavingAppend(expressions ...Expression) SelectClauses
|
|
|
|
Order() ColumnListExpression
|
|
HasOrder() bool
|
|
ClearOrder() SelectClauses
|
|
SetOrder(oes ...OrderedExpression) SelectClauses
|
|
OrderAppend(...OrderedExpression) SelectClauses
|
|
OrderPrepend(...OrderedExpression) SelectClauses
|
|
|
|
GroupBy() ColumnListExpression
|
|
SetGroupBy(cl ColumnListExpression) SelectClauses
|
|
GroupByAppend(cl ColumnListExpression) SelectClauses
|
|
|
|
Limit() interface{}
|
|
HasLimit() bool
|
|
ClearLimit() SelectClauses
|
|
SetLimit(limit interface{}) SelectClauses
|
|
|
|
Offset() uint
|
|
ClearOffset() SelectClauses
|
|
SetOffset(offset uint) SelectClauses
|
|
|
|
Compounds() []CompoundExpression
|
|
CompoundsAppend(ce CompoundExpression) SelectClauses
|
|
|
|
Lock() Lock
|
|
SetLock(l Lock) SelectClauses
|
|
|
|
CommonTables() []CommonTableExpression
|
|
CommonTablesAppend(cte CommonTableExpression) SelectClauses
|
|
|
|
Windows() []WindowExpression
|
|
SetWindows(ws []WindowExpression) SelectClauses
|
|
WindowsAppend(ws ...WindowExpression) SelectClauses
|
|
ClearWindows() SelectClauses
|
|
}
|
|
selectClauses struct {
|
|
commonTables []CommonTableExpression
|
|
selectColumns ColumnListExpression
|
|
distinct ColumnListExpression
|
|
from ColumnListExpression
|
|
joins JoinExpressions
|
|
where ExpressionList
|
|
alias IdentifierExpression
|
|
groupBy ColumnListExpression
|
|
having ExpressionList
|
|
order ColumnListExpression
|
|
limit interface{}
|
|
offset uint
|
|
compounds []CompoundExpression
|
|
lock Lock
|
|
windows []WindowExpression
|
|
}
|
|
)
|
|
|
|
func NewSelectClauses() SelectClauses {
|
|
return &selectClauses{
|
|
selectColumns: NewColumnListExpression(Star()),
|
|
}
|
|
}
|
|
|
|
func (c *selectClauses) HasSources() bool {
|
|
return c.from != nil && len(c.from.Columns()) > 0
|
|
}
|
|
|
|
func (c *selectClauses) IsDefaultSelect() bool {
|
|
ret := false
|
|
if c.selectColumns != nil {
|
|
selects := c.selectColumns.Columns()
|
|
if len(selects) == 1 {
|
|
if l, ok := selects[0].(LiteralExpression); ok && l.Literal() == "*" {
|
|
ret = true
|
|
}
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) clone() *selectClauses {
|
|
return &selectClauses{
|
|
commonTables: c.commonTables,
|
|
selectColumns: c.selectColumns,
|
|
distinct: c.distinct,
|
|
from: c.from,
|
|
joins: c.joins[0:len(c.joins):len(c.joins)],
|
|
where: c.where,
|
|
alias: c.alias,
|
|
groupBy: c.groupBy,
|
|
having: c.having,
|
|
order: c.order,
|
|
limit: c.limit,
|
|
offset: c.offset,
|
|
compounds: c.compounds,
|
|
lock: c.lock,
|
|
windows: c.windows,
|
|
}
|
|
}
|
|
|
|
func (c *selectClauses) CommonTables() []CommonTableExpression {
|
|
return c.commonTables
|
|
}
|
|
|
|
func (c *selectClauses) CommonTablesAppend(cte CommonTableExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.commonTables = append(ret.commonTables, cte)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Select() ColumnListExpression {
|
|
return c.selectColumns
|
|
}
|
|
|
|
func (c *selectClauses) SelectAppend(cl ColumnListExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.selectColumns = ret.selectColumns.Append(cl.Columns()...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) SetSelect(cl ColumnListExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.selectColumns = cl
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Distinct() ColumnListExpression {
|
|
return c.distinct
|
|
}
|
|
|
|
func (c *selectClauses) SetDistinct(cle ColumnListExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.distinct = cle
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) From() ColumnListExpression {
|
|
return c.from
|
|
}
|
|
|
|
func (c *selectClauses) SetFrom(cl ColumnListExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.from = cl
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) HasAlias() bool {
|
|
return c.alias != nil
|
|
}
|
|
|
|
func (c *selectClauses) Alias() IdentifierExpression {
|
|
return c.alias
|
|
}
|
|
|
|
func (c *selectClauses) SetAlias(ie IdentifierExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.alias = ie
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Joins() JoinExpressions {
|
|
return c.joins
|
|
}
|
|
|
|
func (c *selectClauses) JoinsAppend(jc JoinExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.joins = append(ret.joins, jc)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Where() ExpressionList {
|
|
return c.where
|
|
}
|
|
|
|
func (c *selectClauses) ClearWhere() SelectClauses {
|
|
ret := c.clone()
|
|
ret.where = nil
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) WhereAppend(expressions ...Expression) SelectClauses {
|
|
if len(expressions) == 0 {
|
|
return c
|
|
}
|
|
ret := c.clone()
|
|
if ret.where == nil {
|
|
ret.where = NewExpressionList(AndType, expressions...)
|
|
} else {
|
|
ret.where = ret.where.Append(expressions...)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Having() ExpressionList {
|
|
return c.having
|
|
}
|
|
|
|
func (c *selectClauses) ClearHaving() SelectClauses {
|
|
ret := c.clone()
|
|
ret.having = nil
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) HavingAppend(expressions ...Expression) SelectClauses {
|
|
if len(expressions) == 0 {
|
|
return c
|
|
}
|
|
ret := c.clone()
|
|
if ret.having == nil {
|
|
ret.having = NewExpressionList(AndType, expressions...)
|
|
} else {
|
|
ret.having = ret.having.Append(expressions...)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Lock() Lock {
|
|
return c.lock
|
|
}
|
|
|
|
func (c *selectClauses) SetLock(l Lock) SelectClauses {
|
|
ret := c.clone()
|
|
ret.lock = l
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Order() ColumnListExpression {
|
|
return c.order
|
|
}
|
|
|
|
func (c *selectClauses) HasOrder() bool {
|
|
return c.order != nil
|
|
}
|
|
|
|
func (c *selectClauses) ClearOrder() SelectClauses {
|
|
ret := c.clone()
|
|
ret.order = nil
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) SetOrder(oes ...OrderedExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.order = NewOrderedColumnList(oes...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) OrderAppend(oes ...OrderedExpression) SelectClauses {
|
|
if c.order == nil {
|
|
return c.SetOrder(oes...)
|
|
}
|
|
ret := c.clone()
|
|
ret.order = ret.order.Append(NewOrderedColumnList(oes...).Columns()...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) OrderPrepend(oes ...OrderedExpression) SelectClauses {
|
|
if c.order == nil {
|
|
return c.SetOrder(oes...)
|
|
}
|
|
ret := c.clone()
|
|
ret.order = NewOrderedColumnList(oes...).Append(ret.order.Columns()...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) GroupBy() ColumnListExpression {
|
|
return c.groupBy
|
|
}
|
|
|
|
func (c *selectClauses) GroupByAppend(cl ColumnListExpression) SelectClauses {
|
|
if c.groupBy == nil {
|
|
return c.SetGroupBy(cl)
|
|
}
|
|
ret := c.clone()
|
|
ret.groupBy = ret.groupBy.Append(cl.Columns()...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) SetGroupBy(cl ColumnListExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.groupBy = cl
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Limit() interface{} {
|
|
return c.limit
|
|
}
|
|
|
|
func (c *selectClauses) HasLimit() bool {
|
|
return c.limit != nil
|
|
}
|
|
|
|
func (c *selectClauses) ClearLimit() SelectClauses {
|
|
ret := c.clone()
|
|
ret.limit = nil
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) SetLimit(limit interface{}) SelectClauses {
|
|
ret := c.clone()
|
|
ret.limit = limit
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Offset() uint {
|
|
return c.offset
|
|
}
|
|
|
|
func (c *selectClauses) ClearOffset() SelectClauses {
|
|
ret := c.clone()
|
|
ret.offset = 0
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) SetOffset(offset uint) SelectClauses {
|
|
ret := c.clone()
|
|
ret.offset = offset
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Compounds() []CompoundExpression {
|
|
return c.compounds
|
|
}
|
|
|
|
func (c *selectClauses) CompoundsAppend(ce CompoundExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.compounds = append(ret.compounds, ce)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) Windows() []WindowExpression {
|
|
return c.windows
|
|
}
|
|
|
|
func (c *selectClauses) SetWindows(ws []WindowExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.windows = ws
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) WindowsAppend(ws ...WindowExpression) SelectClauses {
|
|
ret := c.clone()
|
|
ret.windows = append(ret.windows, ws...)
|
|
return ret
|
|
}
|
|
|
|
func (c *selectClauses) ClearWindows() SelectClauses {
|
|
ret := c.clone()
|
|
ret.windows = nil
|
|
return ret
|
|
}
|