/
filter.go
114 lines (97 loc) · 2.55 KB
/
filter.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 msg
import (
"context"
"strings"
"github.com/uptrace/bun"
"github.com/uptrace/go-clickhouse/ch"
"github.com/tonindexer/anton/internal/core"
"github.com/tonindexer/anton/internal/core/filter"
)
func (r *Repository) filterMsg(ctx context.Context, req *filter.MessagesReq) (ret []*core.Message, err error) {
q := r.pg.NewSelect()
if req.DBTx != nil {
q = req.DBTx.NewSelect()
}
q = q.Model(&ret)
if len(req.Hash) > 0 {
q = q.Where("hash = ?", req.Hash)
}
if len(req.SrcAddresses) > 0 {
q = q.Where("src_address in (?)", bun.In(req.SrcAddresses))
}
if len(req.DstAddresses) > 0 {
q = q.Where("dst_address in (?)", bun.In(req.DstAddresses))
}
if req.OperationID != nil {
q = q.Where("operation_id = ?", *req.OperationID)
}
if len(req.SrcContracts) > 0 {
q = q.Where("src_contract IN (?)", bun.In(req.SrcContracts))
}
if len(req.DstContracts) > 0 {
q = q.Where("dst_contract IN (?)", bun.In(req.DstContracts))
}
if len(req.OperationNames) > 0 {
q = q.Where("operation_name IN (?)", bun.In(req.OperationNames))
}
if req.AfterTxLT != nil {
if req.Order == "ASC" {
q = q.Where("created_lt > ?", req.AfterTxLT)
} else {
q = q.Where("created_lt < ?", req.AfterTxLT)
}
}
if req.Order != "" {
q = q.Order("created_lt " + strings.ToUpper(req.Order))
}
if req.Limit == 0 {
req.Limit = 3
}
q = q.Limit(req.Limit)
err = q.Scan(ctx)
return ret, err
}
func (r *Repository) countMsg(ctx context.Context, req *filter.MessagesReq) (int, error) {
q := r.ch.NewSelect().
Model((*core.Message)(nil))
if len(req.Hash) > 0 {
q = q.Where("hash = ?", req.Hash)
}
if len(req.SrcAddresses) > 0 {
q = q.Where("src_address in (?)", ch.In(req.SrcAddresses))
}
if len(req.DstAddresses) > 0 {
q = q.Where("dst_address in (?)", ch.In(req.DstAddresses))
}
if req.OperationID != nil {
q = q.Where("operation_id = ?", *req.OperationID)
}
if len(req.SrcContracts) > 0 {
q = q.Where("src_contract IN (?)", ch.In(req.SrcContracts))
}
if len(req.DstContracts) > 0 {
q = q.Where("dst_contract IN (?)", ch.In(req.DstContracts))
}
if len(req.OperationNames) > 0 {
q = q.Where("operation_name IN (?)", ch.In(req.OperationNames))
}
return q.Count(ctx)
}
func (r *Repository) FilterMessages(ctx context.Context, req *filter.MessagesReq) (*filter.MessagesRes, error) {
var (
res = new(filter.MessagesRes)
err error
)
res.Rows, err = r.filterMsg(ctx, req)
if err != nil {
return res, err
}
if len(res.Rows) == 0 {
return res, nil
}
res.Total, err = r.countMsg(ctx, req)
if err != nil {
return res, err
}
return res, nil
}