@@ -21,6 +21,7 @@ type getIter struct {
2121 logger Logger
2222 cmp Compare
2323 equal Equal
24+ split Split
2425 newIters tableNewIters
2526 snapshot uint64
2627 key []byte
@@ -159,13 +160,20 @@ func (g *getIter) Next() (*InternalKey, base.LazyValue) {
159160 files := g .l0 [n - 1 ].Iter ()
160161 g .l0 = g .l0 [:n - 1 ]
161162 iterOpts := IterOptions {logger : g .logger , snapshotForHideObsoletePoints : g .snapshot }
162- g .levelIter .init (context .Background (), iterOpts , g .cmp , nil /* split */ , g .newIters ,
163+ g .levelIter .init (context .Background (), iterOpts , g .cmp , g . split , g .newIters ,
163164 files , manifest .L0Sublevel (n ), internalIterOpts {})
164165 g .levelIter .initRangeDel (& g .rangeDelIter )
165166 bc := levelIterBoundaryContext {}
166167 g .levelIter .initBoundaryContext (& bc )
167168 g .iter = & g .levelIter
168- g .iterKey , g .iterValue = g .iter .SeekGE (g .key , base .SeekGEFlagsNone )
169+
170+ // Compute the key prefix for bloom filtering if split function is
171+ // specified, or use the user key as default.
172+ prefix := g .key
173+ if g .split != nil {
174+ prefix = g .key [:g .split (g .key )]
175+ }
176+ g .iterKey , g .iterValue = g .iter .SeekPrefixGE (prefix , g .key , base .SeekGEFlagsNone )
169177 if bc .isSyntheticIterBoundsKey || bc .isIgnorableBoundaryKey {
170178 g .iterKey = nil
171179 g .iterValue = base.LazyValue {}
@@ -184,14 +192,21 @@ func (g *getIter) Next() (*InternalKey, base.LazyValue) {
184192 }
185193
186194 iterOpts := IterOptions {logger : g .logger , snapshotForHideObsoletePoints : g .snapshot }
187- g .levelIter .init (context .Background (), iterOpts , g .cmp , nil /* split */ , g .newIters ,
195+ g .levelIter .init (context .Background (), iterOpts , g .cmp , g . split , g .newIters ,
188196 g .version .Levels [g .level ].Iter (), manifest .Level (g .level ), internalIterOpts {})
189197 g .levelIter .initRangeDel (& g .rangeDelIter )
190198 bc := levelIterBoundaryContext {}
191199 g .levelIter .initBoundaryContext (& bc )
192200 g .level ++
193201 g .iter = & g .levelIter
194- g .iterKey , g .iterValue = g .iter .SeekGE (g .key , base .SeekGEFlagsNone )
202+
203+ // Compute the key prefix for bloom filtering if split function is
204+ // specified, or use the user key as default.
205+ prefix := g .key
206+ if g .split != nil {
207+ prefix = g .key [:g .split (g .key )]
208+ }
209+ g .iterKey , g .iterValue = g .iter .SeekPrefixGE (prefix , g .key , base .SeekGEFlagsNone )
195210 if bc .isSyntheticIterBoundsKey || bc .isIgnorableBoundaryKey {
196211 g .iterKey = nil
197212 g .iterValue = base.LazyValue {}
0 commit comments