MCPcopy Index your code
hub / github.com/upper/db / OrderBy

Method OrderBy

internal/sqlbuilder/select.go:242–305  ·  view source on GitHub ↗
(columns ...interface{})

Source from the content-addressed store, hash-verified

240}
241
242func (sel *selector) OrderBy(columns ...interface{}) db.Selector {
243 return sel.frame(func(sq *selectorQuery) error {
244
245 if len(columns) == 1 && columns[0] == nil {
246 sq.orderBy = nil
247 sq.orderByArgs = nil
248 return nil
249 }
250
251 var sortColumns exql.SortColumns
252
253 for i := range columns {
254 var sort *exql.SortColumn
255
256 switch value := columns[i].(type) {
257 case *adapter.RawExpr:
258 query, args := Preprocess(value.Raw(), value.Arguments())
259 sort = &exql.SortColumn{
260 Column: &exql.Raw{Value: query},
261 }
262 sq.orderByArgs = append(sq.orderByArgs, args...)
263 case *adapter.FuncExpr:
264 fnName, fnArgs := value.Name(), value.Arguments()
265 if len(fnArgs) == 0 {
266 fnName = fnName + "()"
267 } else {
268 fnName = fnName + "(?" + strings.Repeat(", ?", len(fnArgs)-1) + ")"
269 }
270 fnName, fnArgs = Preprocess(fnName, fnArgs)
271 sort = &exql.SortColumn{
272 Column: &exql.Raw{Value: fnName},
273 }
274 sq.orderByArgs = append(sq.orderByArgs, fnArgs...)
275 case string:
276 if strings.HasPrefix(value, "-") {
277 sort = &exql.SortColumn{
278 Column: exql.ColumnWithName(value[1:]),
279 Order: exql.Order_Descendent,
280 }
281 } else {
282 chunks := strings.SplitN(value, " ", 2)
283
284 order := exql.Order_Ascendent
285 if len(chunks) > 1 && strings.ToUpper(chunks[1]) == "DESC" {
286 order = exql.Order_Descendent
287 }
288
289 sort = &exql.SortColumn{
290 Column: exql.ColumnWithName(chunks[0]),
291 Order: order,
292 }
293 }
294 default:
295 return fmt.Errorf("Can't sort by type %T", value)
296 }
297 sortColumns.Columns = append(sortColumns.Columns, sort)
298 }
299

Callers

nothing calls this directly

Calls 7

frameMethod · 0.95
ColumnWithNameFunction · 0.92
PreprocessFunction · 0.85
RawMethod · 0.80
ArgumentsMethod · 0.65
NameMethod · 0.65
ErrorfMethod · 0.65

Tested by

no test coverage detected