Skip to content

Commit ba95c0c

Browse files
fix: envelope pagination page count w/ search
1 parent 792b369 commit ba95c0c

File tree

1 file changed

+43
-47
lines changed

1 file changed

+43
-47
lines changed

internal/repo/envelope.go

+43-47
Original file line numberDiff line numberDiff line change
@@ -88,24 +88,36 @@ func EnvelopeList(ctx context.Context, db database.Querier, page pagination.Page
8888
var res []models.Envelope
8989

9090
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
108111
}
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 {
109121
if req.Search != "" {
110122
var exp []BoolExpression
111123
if req.SearchText {
@@ -115,53 +127,37 @@ func EnvelopeList(ctx context.Context, db database.Querier, page pagination.Page
115127
exp = append(exp, Messages.Subject.LIKE(RawString("?", map[string]interface{}{"?": "%" + req.Search + "%"})))
116128
}
117129
if len(exp) > 0 {
118-
subQuery = subQuery.WHERE(OR(exp...))
130+
s = s.WHERE(OR(exp...))
119131
} else {
120132
// 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"))
122134
}
123135
}
124136

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
129142
if req.Ascending {
130143
if req.Order == models.DTOEnvelopeFieldSubject {
131-
query = query.ORDER_BY(Messages.Subject.ASC())
144+
s = s.ORDER_BY(Messages.Subject.ASC())
132145
} else if req.Order == models.DTOEnvelopeFieldFrom {
133-
query = query.ORDER_BY(Messages.From.ASC())
146+
s = s.ORDER_BY(Messages.From.ASC())
134147
} else {
135-
query = query.ORDER_BY(Messages.ID.ASC())
148+
s = s.ORDER_BY(Messages.ID.ASC())
136149
}
137150
} else {
138151
if req.Order == models.DTOEnvelopeFieldSubject {
139-
query = query.ORDER_BY(Messages.Subject.DESC())
152+
s = s.ORDER_BY(Messages.Subject.DESC())
140153
} else if req.Order == models.DTOEnvelopeFieldFrom {
141-
query = query.ORDER_BY(Messages.From.DESC())
154+
s = s.ORDER_BY(Messages.From.DESC())
142155
} else {
143-
query = query.ORDER_BY(Messages.ID.DESC())
156+
s = s.ORDER_BY(Messages.ID.DESC())
144157
}
145158
}
146159

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
165161
}
166162

167163
func EnvelopeGet(ctx context.Context, db database.Querier, id int64) (models.Envelope, error) {

0 commit comments

Comments
 (0)