forked from algolia/algoliasearch-client-go
/
rule_iterator.go
65 lines (56 loc) · 1.44 KB
/
rule_iterator.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
package algoliasearch
// RuleIterator is the exposed structure to iterate over all the rules of
// an index.
type RuleIterator struct {
index Index
rules []Rule
hitsPerPage int
page int
pos int
}
// NewRuleIterator returns a new RuleIterator that will iterate over all
// the rules of the declared index.
func NewRuleIterator(index Index) *RuleIterator {
return &RuleIterator{
index: index,
rules: nil,
hitsPerPage: 1000,
page: -1,
pos: -1,
}
}
// Next returns iterate to the next rule of the underlying index. Every call
// to Next should yield a different rule with a nil error until the
// algoliasearch.NoMoreRulesErr is returned which means that all the
// rules have been retrieved. If the error is of a different type, it means
// that the iteration could not have been done correctly.
func (it *RuleIterator) Next() (*Rule, error) {
if it.rules == nil || it.pos >= len(it.rules) {
if err := it.loadNextPage(); err != nil {
it.reset()
return nil, err
}
}
it.pos++
if it.pos >= len(it.rules) {
return nil, NoMoreRulesErr
}
rule := it.rules[it.pos]
rule.HighlightResult = nil
return &rule, nil
}
func (it *RuleIterator) loadNextPage() error {
it.pos = -1
it.page++
res, err := it.index.SearchRules(Map{"query": ""})
if err != nil {
return err
}
it.rules = res.Hits
return nil
}
func (it *RuleIterator) reset() {
it.rules = nil
it.page = -1
it.pos = 0
}