-
Notifications
You must be signed in to change notification settings - Fork 37
/
select.go
114 lines (96 loc) · 2.55 KB
/
select.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
104
105
106
107
108
109
110
111
112
113
114
package dialect
import (
"io"
"github.com/stephenafamo/bob"
"github.com/stephenafamo/bob/clause"
)
// Trying to represent the select query structure as documented in
// https://www.sqlite.org/lang_select.html
type SelectQuery struct {
clause.With
clause.SelectList
Distinct bool
clause.From
clause.Where
clause.GroupBy
clause.Having
clause.Windows
clause.Combine
clause.OrderBy
clause.Limit
clause.Offset
bob.Load[*SelectQuery]
}
func (s SelectQuery) WriteSQL(w io.Writer, d bob.Dialect, start int) ([]any, error) {
var args []any
withArgs, err := bob.ExpressIf(w, d, start+len(args), s.With,
len(s.With.CTEs) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, withArgs...)
w.Write([]byte("SELECT "))
if s.Distinct {
w.Write([]byte("DISTINCT "))
}
selArgs, err := bob.ExpressIf(w, d, start+len(args), s.SelectList, true, "\n", "")
if err != nil {
return nil, err
}
args = append(args, selArgs...)
fromArgs, err := bob.ExpressIf(w, d, start+len(args), s.From, true, "\nFROM ", "")
if err != nil {
return nil, err
}
args = append(args, fromArgs...)
whereArgs, err := bob.ExpressIf(w, d, start+len(args), s.Where,
len(s.Where.Conditions) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, whereArgs...)
groupByArgs, err := bob.ExpressIf(w, d, start+len(args), s.GroupBy,
len(s.GroupBy.Groups) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, groupByArgs...)
havingArgs, err := bob.ExpressIf(w, d, start+len(args), s.Having,
len(s.Having.Conditions) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, havingArgs...)
windowArgs, err := bob.ExpressIf(w, d, start+len(args), s.Windows,
len(s.Windows.Windows) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, windowArgs...)
combineArgs, err := bob.ExpressIf(w, d, start+len(args), s.Combine,
s.Combine.Query != nil, "\n", "")
if err != nil {
return nil, err
}
args = append(args, combineArgs...)
orderArgs, err := bob.ExpressIf(w, d, start+len(args), s.OrderBy,
len(s.OrderBy.Expressions) > 0, "\n", "")
if err != nil {
return nil, err
}
args = append(args, orderArgs...)
limitArgs, err := bob.ExpressIf(w, d, start+len(args), s.Limit,
s.Limit.Count != nil, "\n", "")
if err != nil {
return nil, err
}
args = append(args, limitArgs...)
offsetArgs, err := bob.ExpressIf(w, d, start+len(args), s.Offset,
s.Offset.Count != nil, "\n", "")
if err != nil {
return nil, err
}
args = append(args, offsetArgs...)
w.Write([]byte("\n"))
return args, nil
}