@@ -7,18 +7,22 @@ import (
7
7
)
8
8
9
9
type DocsPositions struct {
10
- mu sync.RWMutex
11
- positions map[seq.ID]seq.DocPos
10
+ mu sync.RWMutex
11
+ idToPos map[seq.ID]seq.DocPos
12
+ lidToPos []seq.DocPos
12
13
}
13
14
14
15
func NewSyncDocsPositions() *DocsPositions {
15
- return &DocsPositions{
16
- positions: make(map[seq.ID]seq.DocPos),
16
+ dp := DocsPositions{
17
+ lidToPos: make([]seq.DocPos, 0),
18
+ idToPos: make(map[seq.ID]seq.DocPos),
17
19
}
20
+ dp.lidToPos = append(dp.lidToPos, 0) // systemID
21
+ return &dp
18
22
}
19
23
20
24
func (dp *DocsPositions) Get(id seq.ID) seq.DocPos {
21
- if val, ok := dp.positions [id]; ok {
25
+ if val, ok := dp.idToPos [id]; ok {
22
26
return val
23
27
}
24
28
return seq.DocPosNotFound
@@ -36,13 +40,22 @@ func (dp *DocsPositions) SetMultiple(ids []seq.ID, pos []seq.DocPos) []seq.ID {
36
40
dp.mu.Lock()
37
41
defer dp.mu.Unlock()
38
42
39
- appended := make([]seq.ID, 0)
43
+ appended := make([]seq.ID, 0, len(ids) )
40
44
for i, id := range ids {
41
- // Positions may be equal in case of nested index.
42
- if savedPos, ok := dp.positions[id]; !ok || savedPos == pos[i] {
43
- dp.positions[id] = pos[i]
44
- appended = append(appended, id)
45
+ p, ok := dp.idToPos[id]
46
+
47
+ if ok {
48
+ if p != pos[i] {
49
+ // same ID but different position
50
+ // this is a duplicate ID, we can't append it
51
+ continue
52
+ }
53
+ } else {
54
+ dp.idToPos[id] = pos[i]
45
55
}
56
+
57
+ dp.lidToPos = append(dp.lidToPos, pos[i])
58
+ appended = append(appended, id)
46
59
}
47
60
return appended
48
61
}
0 commit comments