79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
package jet
|
|
|
|
// OrderByClause interface
|
|
type OrderByClause interface {
|
|
// NULLS_FIRST specifies sort where null values appear before all non-null values.
|
|
// For some dialects(mysql,mariadb), which do not support NULL_FIRST, NULL_FIRST is simulated
|
|
// with additional IS_NOT_NULL expression.
|
|
// For instance,
|
|
// Rental.ReturnDate.DESC().NULLS_FIRST()
|
|
// would translate to,
|
|
// rental.return_date IS NOT NULL, rental.return_date DESC
|
|
NULLS_FIRST() OrderByClause
|
|
|
|
// NULLS_LAST specifies sort where null values appear after all non-null values.
|
|
// For some dialects(mysql,mariadb), which do not support NULLS_LAST, NULLS_LAST is simulated
|
|
// with additional IS_NULL expression.
|
|
// For instance,
|
|
// Rental.ReturnDate.ASC().NULLS_LAST()
|
|
// would translate to,
|
|
// rental.return_date IS NULL, rental.return_date ASC
|
|
NULLS_LAST() OrderByClause
|
|
|
|
serializeForOrderBy(statement StatementType, out *SQLBuilder)
|
|
}
|
|
|
|
type orderByClauseImpl struct {
|
|
expression Expression
|
|
ascending *bool
|
|
nullsFirst *bool
|
|
}
|
|
|
|
func (ord *orderByClauseImpl) NULLS_FIRST() OrderByClause {
|
|
nullsFirst := true
|
|
ord.nullsFirst = &nullsFirst
|
|
return ord
|
|
}
|
|
func (ord *orderByClauseImpl) NULLS_LAST() OrderByClause {
|
|
nullsFirst := false
|
|
ord.nullsFirst = &nullsFirst
|
|
return ord
|
|
}
|
|
|
|
func (ord *orderByClauseImpl) serializeForOrderBy(statement StatementType, out *SQLBuilder) {
|
|
customSerializer := out.Dialect.SerializeOrderBy()
|
|
if customSerializer != nil {
|
|
customSerializer(ord.expression, ord.ascending, ord.nullsFirst)(statement, out)
|
|
return
|
|
}
|
|
|
|
if ord.expression == nil {
|
|
panic("jet: nil expression in ORDER BY clause")
|
|
}
|
|
|
|
ord.expression.serializeForOrderBy(statement, out)
|
|
|
|
if ord.ascending != nil {
|
|
if *ord.ascending {
|
|
out.WriteString("ASC")
|
|
} else {
|
|
out.WriteString("DESC")
|
|
}
|
|
}
|
|
|
|
if ord.nullsFirst != nil {
|
|
if *ord.nullsFirst {
|
|
out.WriteString("NULLS FIRST")
|
|
} else {
|
|
out.WriteString("NULLS LAST")
|
|
}
|
|
}
|
|
}
|
|
|
|
func newOrderByAscending(expression Expression, ascending bool) OrderByClause {
|
|
return &orderByClauseImpl{expression: expression, ascending: &ascending}
|
|
}
|
|
|
|
func newOrderByNullsFirst(expression Expression, nullsFirst bool) OrderByClause {
|
|
return &orderByClauseImpl{expression: expression, nullsFirst: &nullsFirst}
|
|
}
|