jet/postgres/set_statement.go

151 lines
4.8 KiB
Go
Raw Normal View History

2019-08-11 09:52:02 +02:00
package postgres
import "github.com/Gleipnir-Technology/jet/internal/jet"
2019-08-11 09:52:02 +02:00
// UNION effectively appends the result of sub-queries(select statements) into single query.
// It eliminates duplicate rows from its result.
func UNION(lhs, rhs jet.SerializerStatement, selects ...jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(union, false, toSelectList(lhs, rhs, selects...))
2019-08-11 09:52:02 +02:00
}
// UNION_ALL effectively appends the result of sub-queries(select statements) into single query.
// It does not eliminates duplicate rows from its result.
func UNION_ALL(lhs, rhs jet.SerializerStatement, selects ...jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(union, true, toSelectList(lhs, rhs, selects...))
2019-08-11 09:52:02 +02:00
}
// INTERSECT returns all rows that are in query results.
// It eliminates duplicate rows from its result.
func INTERSECT(lhs, rhs jet.SerializerStatement, selects ...jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(intersect, false, toSelectList(lhs, rhs, selects...))
2019-08-11 09:52:02 +02:00
}
// INTERSECT_ALL returns all rows that are in query results.
// It does not eliminates duplicate rows from its result.
func INTERSECT_ALL(lhs, rhs jet.SerializerStatement, selects ...jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(intersect, true, toSelectList(lhs, rhs, selects...))
2019-08-11 09:52:02 +02:00
}
// EXCEPT returns all rows that are in the result of query lhs but not in the result of query rhs.
// It eliminates duplicate rows from its result.
func EXCEPT(lhs, rhs jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(except, false, toSelectList(lhs, rhs))
2019-08-11 09:52:02 +02:00
}
// EXCEPT_ALL returns all rows that are in the result of query lhs but not in the result of query rhs.
// It does not eliminates duplicate rows from its result.
func EXCEPT_ALL(lhs, rhs jet.SerializerStatement) setStatement {
2019-08-17 10:43:16 +02:00
return newSetStatementImpl(except, true, toSelectList(lhs, rhs))
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
type setStatement interface {
setOperators
2019-08-11 09:52:02 +02:00
ORDER_BY(orderByClauses ...OrderByClause) setStatement
2019-08-11 09:52:02 +02:00
2019-08-17 10:43:16 +02:00
LIMIT(limit int64) setStatement
OFFSET(offset int64) setStatement
// OFFSET_e can be used when an integer expression is needed as offset, otherwise OFFSET can be used
OFFSET_e(offset IntegerExpression) setStatement
2019-08-11 09:52:02 +02:00
AsTable(alias string) SelectTable
}
2019-08-17 10:43:16 +02:00
type setOperators interface {
Statement
2019-08-11 09:52:02 +02:00
jet.HasProjections
2019-08-17 10:43:16 +02:00
Expression
2019-08-11 09:52:02 +02:00
2019-08-17 10:43:16 +02:00
UNION(rhs SelectStatement) setStatement
UNION_ALL(rhs SelectStatement) setStatement
INTERSECT(rhs SelectStatement) setStatement
INTERSECT_ALL(rhs SelectStatement) setStatement
EXCEPT(rhs SelectStatement) setStatement
EXCEPT_ALL(rhs SelectStatement) setStatement
2019-08-11 09:52:02 +02:00
}
type setOperatorsImpl struct {
stmtRoot setOperators
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) UNION(rhs SelectStatement) setStatement {
return UNION(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) UNION_ALL(rhs SelectStatement) setStatement {
return UNION_ALL(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) INTERSECT(rhs SelectStatement) setStatement {
return INTERSECT(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) INTERSECT_ALL(rhs SelectStatement) setStatement {
return INTERSECT_ALL(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) EXCEPT(rhs SelectStatement) setStatement {
return EXCEPT(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
2019-08-17 10:43:16 +02:00
func (s *setOperatorsImpl) EXCEPT_ALL(rhs SelectStatement) setStatement {
return EXCEPT_ALL(s.stmtRoot, rhs)
2019-08-11 09:52:02 +02:00
}
type setStatementImpl struct {
2019-08-17 18:32:01 +02:00
jet.ExpressionStatement
2019-08-11 09:52:02 +02:00
setOperatorsImpl
setOperator jet.ClauseSetStmtOperator
}
func newSetStatementImpl(operator string, all bool, selects []jet.SerializerStatement) setStatement {
2019-08-11 09:52:02 +02:00
newSetStatement := &setStatementImpl{}
2019-08-17 18:32:01 +02:00
newSetStatement.ExpressionStatement = jet.NewExpressionStatementImpl(Dialect, jet.SetStatementType, newSetStatement,
2019-08-11 09:52:02 +02:00
&newSetStatement.setOperator)
newSetStatement.setOperator.Operator = operator
newSetStatement.setOperator.All = all
newSetStatement.setOperator.Selects = selects
newSetStatement.setOperator.Limit.Count = -1
newSetStatement.setOperatorsImpl.stmtRoot = newSetStatement
2019-08-11 09:52:02 +02:00
return newSetStatement
}
func (s *setStatementImpl) ORDER_BY(orderByClauses ...OrderByClause) setStatement {
2019-08-11 09:52:02 +02:00
s.setOperator.OrderBy.List = orderByClauses
return s
}
2019-08-17 10:43:16 +02:00
func (s *setStatementImpl) LIMIT(limit int64) setStatement {
2019-08-11 09:52:02 +02:00
s.setOperator.Limit.Count = limit
return s
}
2019-08-17 10:43:16 +02:00
func (s *setStatementImpl) OFFSET(offset int64) setStatement {
s.setOperator.Offset.Count = Int(offset)
return s
}
func (s *setStatementImpl) OFFSET_e(offset IntegerExpression) setStatement {
2019-08-11 09:52:02 +02:00
s.setOperator.Offset.Count = offset
return s
}
func (s *setStatementImpl) AsTable(alias string) SelectTable {
2024-10-17 14:12:21 +02:00
return newSelectTable(s, alias, nil)
2019-08-11 09:52:02 +02:00
}
const (
2019-08-17 10:43:16 +02:00
union = "UNION"
intersect = "INTERSECT"
except = "EXCEPT"
2019-08-11 09:52:02 +02:00
)
func toSelectList(lhs, rhs jet.SerializerStatement, selects ...jet.SerializerStatement) []jet.SerializerStatement {
return append([]jet.SerializerStatement{lhs, rhs}, selects...)
2019-08-11 09:52:02 +02:00
}