(columns ...interface{})
| 240 | } |
| 241 | |
| 242 | func (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 |
nothing calls this directly
no test coverage detected