@@ -88,24 +88,36 @@ func EnvelopeList(ctx context.Context, db database.Querier, page pagination.Page
88
88
var res []models.Envelope
89
89
90
90
subQuery := Messages .SELECT (Messages .ID )
91
- // This is what peak performance looks like
92
- if req .Ascending {
93
- if req .Order == models .DTOEnvelopeFieldSubject {
94
- subQuery = subQuery .ORDER_BY (Messages .Subject .ASC ())
95
- } else if req .Order == models .DTOEnvelopeFieldFrom {
96
- subQuery = subQuery .ORDER_BY (Messages .From .ASC ())
97
- } else {
98
- subQuery = subQuery .ORDER_BY (Messages .ID .ASC ())
99
- }
100
- } else {
101
- if req .Order == models .DTOEnvelopeFieldSubject {
102
- subQuery = subQuery .ORDER_BY (Messages .Subject .DESC ())
103
- } else if req .Order == models .DTOEnvelopeFieldFrom {
104
- subQuery = subQuery .ORDER_BY (Messages .From .DESC ())
105
- } else {
106
- subQuery = subQuery .ORDER_BY (Messages .ID .DESC ())
107
- }
91
+ subQuery = envelopeListOrder (subQuery , req )
92
+ subQuery = envelopeListWhere (subQuery , req )
93
+
94
+ query := SELECT (messagePJ , attachmentPJ ).
95
+ FROM (Messages .LEFT_JOIN (Attachments , Attachments .MessageID .EQ (Messages .ID ))).
96
+ WHERE (Messages .ID .IN (subQuery .LIMIT (int64 (page .Limit ())).OFFSET (int64 (page .Offset ()))))
97
+ query = envelopeListOrder (query , req )
98
+
99
+ err := query .QueryContext (ctx , db , & res )
100
+ if err != nil {
101
+ return models.DTOEnvelopeListResult {}, err
102
+ }
103
+
104
+ countQuery := Messages .SELECT (COUNT (Raw ("*" )).AS ("count" ))
105
+ countQuery = envelopeListWhere (countQuery , req )
106
+
107
+ var resCount struct { Count int }
108
+ err = countQuery .QueryContext (ctx , db , & resCount )
109
+ if err != nil {
110
+ return models.DTOEnvelopeListResult {}, err
108
111
}
112
+ pageResult := pagination .NewPageResult (page , resCount .Count )
113
+
114
+ return models.DTOEnvelopeListResult {
115
+ PageResult : pageResult ,
116
+ Envelopes : res ,
117
+ }, nil
118
+ }
119
+
120
+ func envelopeListWhere (s SelectStatement , req models.DTOEnvelopeListRequest ) SelectStatement {
109
121
if req .Search != "" {
110
122
var exp []BoolExpression
111
123
if req .SearchText {
@@ -115,53 +127,37 @@ func EnvelopeList(ctx context.Context, db database.Querier, page pagination.Page
115
127
exp = append (exp , Messages .Subject .LIKE (RawString ("?" , map [string ]interface {}{"?" : "%" + req .Search + "%" })))
116
128
}
117
129
if len (exp ) > 0 {
118
- subQuery = subQuery .WHERE (OR (exp ... ))
130
+ s = s .WHERE (OR (exp ... ))
119
131
} else {
120
132
// Invalid state where the caller wants to search but has defined no fields to search
121
- subQuery = subQuery .WHERE (RawBool ("1=0" ))
133
+ s = s .WHERE (RawBool ("1=0" ))
122
134
}
123
135
}
124
136
125
- query := SELECT (messagePJ , attachmentPJ ).
126
- FROM (Messages .LEFT_JOIN (Attachments , Attachments .MessageID .EQ (Messages .ID ))).
127
- WHERE (Messages .ID .IN (subQuery .LIMIT (int64 (page .Limit ())).OFFSET (int64 (page .Offset ()))))
128
- // s/subQuery/query/g
137
+ return s
138
+ }
139
+
140
+ func envelopeListOrder (s SelectStatement , req models.DTOEnvelopeListRequest ) SelectStatement {
141
+ // This is what peak performance looks like
129
142
if req .Ascending {
130
143
if req .Order == models .DTOEnvelopeFieldSubject {
131
- query = query .ORDER_BY (Messages .Subject .ASC ())
144
+ s = s .ORDER_BY (Messages .Subject .ASC ())
132
145
} else if req .Order == models .DTOEnvelopeFieldFrom {
133
- query = query .ORDER_BY (Messages .From .ASC ())
146
+ s = s .ORDER_BY (Messages .From .ASC ())
134
147
} else {
135
- query = query .ORDER_BY (Messages .ID .ASC ())
148
+ s = s .ORDER_BY (Messages .ID .ASC ())
136
149
}
137
150
} else {
138
151
if req .Order == models .DTOEnvelopeFieldSubject {
139
- query = query .ORDER_BY (Messages .Subject .DESC ())
152
+ s = s .ORDER_BY (Messages .Subject .DESC ())
140
153
} else if req .Order == models .DTOEnvelopeFieldFrom {
141
- query = query .ORDER_BY (Messages .From .DESC ())
154
+ s = s .ORDER_BY (Messages .From .DESC ())
142
155
} else {
143
- query = query .ORDER_BY (Messages .ID .DESC ())
156
+ s = s .ORDER_BY (Messages .ID .DESC ())
144
157
}
145
158
}
146
159
147
- err := query .QueryContext (ctx , db , & res )
148
- if err != nil {
149
- return models.DTOEnvelopeListResult {}, err
150
- }
151
-
152
- var resCount struct { Count int }
153
- err = Messages .
154
- SELECT (COUNT (Raw ("*" )).AS ("count" )).
155
- QueryContext (ctx , db , & resCount )
156
- if err != nil {
157
- return models.DTOEnvelopeListResult {}, err
158
- }
159
- pageResult := pagination .NewPageResult (page , resCount .Count )
160
-
161
- return models.DTOEnvelopeListResult {
162
- PageResult : pageResult ,
163
- Envelopes : res ,
164
- }, nil
160
+ return s
165
161
}
166
162
167
163
func EnvelopeGet (ctx context.Context , db database.Querier , id int64 ) (models.Envelope , error ) {
0 commit comments