-
Notifications
You must be signed in to change notification settings - Fork 0
/
query_select_funcs.go
79 lines (69 loc) · 1.79 KB
/
query_select_funcs.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
package dal
import (
"errors"
"math"
)
type ReaderOption = func(ro *readerOptions)
type ReaderOptions interface {
Limit() int
Offset() int
}
type readerOptions struct {
limit int
offset int
}
func WithLimit(limit int) func(ro *readerOptions) {
return func(ro *readerOptions) {
ro.limit = limit
}
}
func WithOffset(offset int) func(ro *readerOptions) {
return func(ro *readerOptions) {
ro.offset = offset
}
}
func newReaderOptions(options ...ReaderOption) *readerOptions {
ro := &readerOptions{}
for _, o := range options {
o(ro)
}
return ro
}
// SelectAll is a helper method that for a given reader returns all items as a slice.
func SelectAll[T any](reader Reader, getItem func(r Record) T, options ...ReaderOption) (items []T, err error) {
if reader == nil {
panic("reader is a required parameter, got nil")
}
ro := newReaderOptions(options...)
limit := ro.limit
if limit <= 0 {
items = make([]T, 0)
limit = math.MaxInt
} else {
items = make([]T, 0, limit)
}
for ; limit > 0; limit-- {
var record Record
if record, err = reader.Next(); err != nil {
if errors.Is(err, ErrNoMoreRecords) {
err = nil
}
return
}
item := getItem(record)
items = append(items, item)
}
return items, reader.Close()
}
// SelectAllIDs is a helper method that for a given reader returns all IDs as a strongly typed slice.
func SelectAllIDs[T comparable](reader Reader, options ...ReaderOption) (ids []T, err error) {
return SelectAll[T](reader, func(r Record) T {
return r.Key().ID.(T)
}, options...)
}
// SelectAllRecords is a helper method that for a given reader returns all records as a slice.
func SelectAllRecords(reader Reader, options ...ReaderOption) (records []Record, err error) {
return SelectAll[Record](reader, func(r Record) Record {
return r
}, options...)
}