@@ -137,7 +137,8 @@ class BlockBasedTable::IndexReader {
137
137
// Create an iterator for index access.
138
138
// An iter is passed in, if it is not null, update this one and return it
139
139
// If it is null, create a new Iterator
140
- virtual Iterator* NewIterator (BlockIter* iter = nullptr ) = 0;
140
+ virtual Iterator* NewIterator (
141
+ BlockIter* iter = nullptr , bool total_order_seek = true ) = 0;
141
142
142
143
// The size of the index.
143
144
virtual size_t size () const = 0;
@@ -174,8 +175,9 @@ class BinarySearchIndexReader : public IndexReader {
174
175
return s;
175
176
}
176
177
177
- virtual Iterator* NewIterator (BlockIter* iter = nullptr ) override {
178
- return index_block_->NewIterator (comparator_, iter);
178
+ virtual Iterator* NewIterator (
179
+ BlockIter* iter = nullptr , bool dont_care = true ) override {
180
+ return index_block_->NewIterator (comparator_, iter, true );
179
181
}
180
182
181
183
virtual size_t size () const override { return index_block_->size (); }
@@ -295,8 +297,9 @@ class HashIndexReader : public IndexReader {
295
297
return Status::OK ();
296
298
}
297
299
298
- virtual Iterator* NewIterator (BlockIter* iter = nullptr ) override {
299
- return index_block_->NewIterator (comparator_, iter);
300
+ virtual Iterator* NewIterator (
301
+ BlockIter* iter = nullptr , bool total_order_seek = true ) override {
302
+ return index_block_->NewIterator (comparator_, iter, total_order_seek);
300
303
}
301
304
302
305
virtual size_t size () const override { return index_block_->size (); }
@@ -818,7 +821,8 @@ Iterator* BlockBasedTable::NewIndexIterator(const ReadOptions& read_options,
818
821
BlockIter* input_iter) {
819
822
// index reader has already been pre-populated.
820
823
if (rep_->index_reader ) {
821
- return rep_->index_reader ->NewIterator (input_iter);
824
+ return rep_->index_reader ->NewIterator (
825
+ input_iter, read_options.total_order_seek );
822
826
}
823
827
824
828
bool no_io = read_options.read_tier == kBlockCacheTier ;
@@ -866,10 +870,9 @@ Iterator* BlockBasedTable::NewIndexIterator(const ReadOptions& read_options,
866
870
}
867
871
868
872
assert (cache_handle);
869
- Iterator * iter;
870
- iter = index_reader-> NewIterator ( input_iter);
873
+ auto * iter = index_reader-> NewIterator (
874
+ input_iter, read_options. total_order_seek );
871
875
iter->RegisterCleanup (&ReleaseCachedEntry, block_cache, cache_handle);
872
-
873
876
return iter;
874
877
}
875
878
@@ -988,6 +991,9 @@ class BlockBasedTable::BlockEntryIteratorState : public TwoLevelIteratorState {
988
991
}
989
992
990
993
bool PrefixMayMatch (const Slice& internal_key) override {
994
+ if (read_options_.total_order_seek ) {
995
+ return true ;
996
+ }
991
997
return table_->PrefixMayMatch (internal_key);
992
998
}
993
999
0 commit comments