@@ -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