/
model.go
103 lines (93 loc) · 2.25 KB
/
model.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package schema
import (
"errors"
"fmt"
"strings"
)
type Model struct {
Type string
Table string
IDColumn string
IDGenerator func(Context) string
DefaultOrder string
Attributes []Attribute
Relationships []Relationship
Manager Manager
}
func (m Model) DirectFields() ([]string, []interface{}) {
var allColumns []string
var allVars []interface{}
for _, attribute := range m.Attributes {
columns, vars := attribute.GetSelectDirect()
allColumns = append(allColumns, columns...)
allVars = append(allVars, vars...)
}
return allColumns, allVars
}
func (m Model) ExtraFields() ([]string, [][]interface{}) {
var allColumns []string
var allVars [][]interface{}
for _, relationship := range m.Relationships {
columns, vars := relationship.GetSelectExtra()
allColumns = append(allColumns, columns...)
allVars = append(allVars, vars)
}
return allColumns, allVars
}
func (m Model) GetOrderQuery(asParam string) (string, string, error) {
validParam := ""
validOrders := map[string]string{
"id": m.IDColumn,
}
for _, attribute := range m.Attributes {
attrOrders := attribute.GetOrderMap()
for key, arg := range attrOrders {
validOrders[key] = arg
}
}
queryArgs := []string{}
splitOrders := strings.Split(asParam, ",")
orderedColumns := map[string]bool{}
for _, order := range splitOrders {
cleanOrder := strings.ToLower(strings.TrimSpace(order))
if len(cleanOrder) == 0 {
continue
}
posCleanOrder := strings.TrimPrefix(cleanOrder, "-")
column, exists := validOrders[posCleanOrder]
if !exists {
return "", "", errors.New(fmt.Sprintf(
"Cannot order by unknown field '%s'.",
cleanOrder,
))
}
_, exists = orderedColumns[column]
if exists {
return "", "", errors.New(fmt.Sprintf(
"Cannot order by column '%s' twice.",
cleanOrder,
))
}
orderedColumns[column] = true
query := column
if posCleanOrder != cleanOrder {
query += " desc"
}
queryArgs = append(queryArgs, query)
if len(validParam) != 0 {
validParam += ","
}
validParam += cleanOrder
}
query := ""
if len(queryArgs) > 0 {
query = fmt.Sprintf(
"order by %s",
strings.Join(queryArgs, ", "),
)
}
if validParam == m.DefaultOrder {
validParam = ""
}
return query, validParam, nil
}