@@ -19,12 +19,16 @@ namespace rocksdb {
19
19
namespace {
20
20
class ColumnFamilyHandleImplDummy : public ColumnFamilyHandleImpl {
21
21
public:
22
- explicit ColumnFamilyHandleImplDummy (int id)
23
- : ColumnFamilyHandleImpl(nullptr , nullptr , nullptr ), id_(id) {}
22
+ explicit ColumnFamilyHandleImplDummy (int id, const Comparator* comparator)
23
+ : ColumnFamilyHandleImpl(nullptr , nullptr , nullptr ),
24
+ id_(id),
25
+ comparator_(comparator) {}
24
26
uint32_t GetID () const override { return id_; }
27
+ const Comparator* user_comparator () const override { return comparator_; }
25
28
26
29
private:
27
30
uint32_t id_;
31
+ const Comparator* comparator_;
28
32
};
29
33
30
34
struct Entry {
@@ -90,8 +94,9 @@ TEST(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
90
94
index_map[e.value ].push_back (&e);
91
95
}
92
96
93
- WriteBatchWithIndex batch (BytewiseComparator (), 20 );
94
- ColumnFamilyHandleImplDummy data (6 ), index (8 );
97
+ WriteBatchWithIndex batch (nullptr , 20 );
98
+ ColumnFamilyHandleImplDummy data (6 , BytewiseComparator ());
99
+ ColumnFamilyHandleImplDummy index (8 , BytewiseComparator ());
95
100
for (auto & e : entries) {
96
101
if (e.type == kPutRecord ) {
97
102
batch.Put (&data, e.key , e.value );
@@ -230,6 +235,107 @@ TEST(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
230
235
}
231
236
}
232
237
238
+ class ReverseComparator : public Comparator {
239
+ public:
240
+ ReverseComparator () {}
241
+
242
+ virtual const char * Name () const override {
243
+ return " rocksdb.ReverseComparator" ;
244
+ }
245
+
246
+ virtual int Compare (const Slice& a, const Slice& b) const override {
247
+ return 0 - BytewiseComparator ()->Compare (a, b);
248
+ }
249
+
250
+ virtual void FindShortestSeparator (std::string* start,
251
+ const Slice& limit) const {}
252
+ virtual void FindShortSuccessor (std::string* key) const {}
253
+ };
254
+
255
+ TEST (WriteBatchWithIndexTest, TestComparatorForCF) {
256
+ ReverseComparator reverse_cmp;
257
+ ColumnFamilyHandleImplDummy cf1 (6 , nullptr );
258
+ ColumnFamilyHandleImplDummy reverse_cf (66 , &reverse_cmp);
259
+ ColumnFamilyHandleImplDummy cf2 (88 , BytewiseComparator ());
260
+ WriteBatchWithIndex batch (BytewiseComparator (), 20 );
261
+
262
+ batch.Put (&cf1, " ddd" , " " );
263
+ batch.Put (&cf2, " aaa" , " " );
264
+ batch.Put (&cf2, " eee" , " " );
265
+ batch.Put (&cf1, " ccc" , " " );
266
+ batch.Put (&reverse_cf, " a11" , " " );
267
+ batch.Put (&cf1, " bbb" , " " );
268
+ batch.Put (&reverse_cf, " a33" , " " );
269
+ batch.Put (&reverse_cf, " a22" , " " );
270
+
271
+ {
272
+ std::unique_ptr<WBWIIterator> iter (batch.NewIterator (&cf1));
273
+ iter->Seek (" " );
274
+ ASSERT_OK (iter->status ());
275
+ ASSERT_TRUE (iter->Valid ());
276
+ ASSERT_EQ (" bbb" , iter->Entry ().key .ToString ());
277
+ iter->Next ();
278
+ ASSERT_OK (iter->status ());
279
+ ASSERT_TRUE (iter->Valid ());
280
+ ASSERT_EQ (" ccc" , iter->Entry ().key .ToString ());
281
+ iter->Next ();
282
+ ASSERT_OK (iter->status ());
283
+ ASSERT_TRUE (iter->Valid ());
284
+ ASSERT_EQ (" ddd" , iter->Entry ().key .ToString ());
285
+ iter->Next ();
286
+ ASSERT_OK (iter->status ());
287
+ ASSERT_TRUE (!iter->Valid ());
288
+ }
289
+
290
+ {
291
+ std::unique_ptr<WBWIIterator> iter (batch.NewIterator (&cf2));
292
+ iter->Seek (" " );
293
+ ASSERT_OK (iter->status ());
294
+ ASSERT_TRUE (iter->Valid ());
295
+ ASSERT_EQ (" aaa" , iter->Entry ().key .ToString ());
296
+ iter->Next ();
297
+ ASSERT_OK (iter->status ());
298
+ ASSERT_TRUE (iter->Valid ());
299
+ ASSERT_EQ (" eee" , iter->Entry ().key .ToString ());
300
+ iter->Next ();
301
+ ASSERT_OK (iter->status ());
302
+ ASSERT_TRUE (!iter->Valid ());
303
+ }
304
+
305
+ {
306
+ std::unique_ptr<WBWIIterator> iter (batch.NewIterator (&reverse_cf));
307
+ iter->Seek (" " );
308
+ ASSERT_OK (iter->status ());
309
+ ASSERT_TRUE (!iter->Valid ());
310
+
311
+ iter->Seek (" z" );
312
+ ASSERT_OK (iter->status ());
313
+ ASSERT_TRUE (iter->Valid ());
314
+ ASSERT_EQ (" a33" , iter->Entry ().key .ToString ());
315
+ iter->Next ();
316
+ ASSERT_OK (iter->status ());
317
+ ASSERT_TRUE (iter->Valid ());
318
+ ASSERT_EQ (" a22" , iter->Entry ().key .ToString ());
319
+ iter->Next ();
320
+ ASSERT_OK (iter->status ());
321
+ ASSERT_TRUE (iter->Valid ());
322
+ ASSERT_EQ (" a11" , iter->Entry ().key .ToString ());
323
+ iter->Next ();
324
+ ASSERT_OK (iter->status ());
325
+ ASSERT_TRUE (!iter->Valid ());
326
+
327
+ iter->Seek (" a22" );
328
+ ASSERT_OK (iter->status ());
329
+ ASSERT_TRUE (iter->Valid ());
330
+ ASSERT_EQ (" a22" , iter->Entry ().key .ToString ());
331
+
332
+ iter->Seek (" a13" );
333
+ ASSERT_OK (iter->status ());
334
+ ASSERT_TRUE (iter->Valid ());
335
+ ASSERT_EQ (" a11" , iter->Entry ().key .ToString ());
336
+ }
337
+ }
338
+
233
339
} // namespace
234
340
235
341
int main (int argc, char ** argv) { return rocksdb::test::RunAllTests (); }
0 commit comments