1 // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2 //  This source code is licensed under both the GPLv2 (found in the
3 //  COPYING file in the root directory) and Apache 2.0 License
4 //  (found in the LICENSE.Apache file in the root directory).
5 
6 package org.rocksdb;
7 
8 import org.junit.ClassRule;
9 import org.junit.Rule;
10 import org.junit.Test;
11 import org.junit.rules.TemporaryFolder;
12 
13 import static org.assertj.core.api.Assertions.assertThat;
14 
15 public class BuiltinComparatorTest {
16 
17   @ClassRule
18   public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE =
19       new RocksNativeLibraryResource();
20 
21   @Rule
22   public TemporaryFolder dbFolder = new TemporaryFolder();
23 
24   @Test
25   public void builtinForwardComparator()
26       throws RocksDBException {
27     try (final Options options = new Options()
28         .setCreateIfMissing(true)
29         .setComparator(BuiltinComparator.BYTEWISE_COMPARATOR);
30          final RocksDB rocksDb = RocksDB.open(options,
31              dbFolder.getRoot().getAbsolutePath())
32     ) {
33       rocksDb.put("abc1".getBytes(), "abc1".getBytes());
34       rocksDb.put("abc2".getBytes(), "abc2".getBytes());
35       rocksDb.put("abc3".getBytes(), "abc3".getBytes());
36 
37       try(final RocksIterator rocksIterator = rocksDb.newIterator()) {
38         // Iterate over keys using a iterator
39         rocksIterator.seekToFirst();
40         assertThat(rocksIterator.isValid()).isTrue();
41         assertThat(rocksIterator.key()).isEqualTo(
42             "abc1".getBytes());
43         assertThat(rocksIterator.value()).isEqualTo(
44             "abc1".getBytes());
45         rocksIterator.next();
46         assertThat(rocksIterator.isValid()).isTrue();
47         assertThat(rocksIterator.key()).isEqualTo(
48             "abc2".getBytes());
49         assertThat(rocksIterator.value()).isEqualTo(
50             "abc2".getBytes());
51         rocksIterator.next();
52         assertThat(rocksIterator.isValid()).isTrue();
53         assertThat(rocksIterator.key()).isEqualTo(
54             "abc3".getBytes());
55         assertThat(rocksIterator.value()).isEqualTo(
56             "abc3".getBytes());
57         rocksIterator.next();
58         assertThat(rocksIterator.isValid()).isFalse();
59         // Get last one
60         rocksIterator.seekToLast();
61         assertThat(rocksIterator.isValid()).isTrue();
62         assertThat(rocksIterator.key()).isEqualTo(
63             "abc3".getBytes());
64         assertThat(rocksIterator.value()).isEqualTo(
65             "abc3".getBytes());
66         // Seek for abc
67         rocksIterator.seek("abc".getBytes());
68         assertThat(rocksIterator.isValid()).isTrue();
69         assertThat(rocksIterator.key()).isEqualTo(
70             "abc1".getBytes());
71         assertThat(rocksIterator.value()).isEqualTo(
72             "abc1".getBytes());
73       }
74     }
75   }
76 
77   @Test
78   public void builtinReverseComparator()
79       throws RocksDBException {
80     try (final Options options = new Options()
81         .setCreateIfMissing(true)
82         .setComparator(BuiltinComparator.REVERSE_BYTEWISE_COMPARATOR);
83          final RocksDB rocksDb = RocksDB.open(options,
84              dbFolder.getRoot().getAbsolutePath())
85     ) {
86 
87       rocksDb.put("abc1".getBytes(), "abc1".getBytes());
88       rocksDb.put("abc2".getBytes(), "abc2".getBytes());
89       rocksDb.put("abc3".getBytes(), "abc3".getBytes());
90 
91       try (final RocksIterator rocksIterator = rocksDb.newIterator()) {
92         // Iterate over keys using a iterator
93         rocksIterator.seekToFirst();
94         assertThat(rocksIterator.isValid()).isTrue();
95         assertThat(rocksIterator.key()).isEqualTo(
96             "abc3".getBytes());
97         assertThat(rocksIterator.value()).isEqualTo(
98             "abc3".getBytes());
99         rocksIterator.next();
100         assertThat(rocksIterator.isValid()).isTrue();
101         assertThat(rocksIterator.key()).isEqualTo(
102             "abc2".getBytes());
103         assertThat(rocksIterator.value()).isEqualTo(
104             "abc2".getBytes());
105         rocksIterator.next();
106         assertThat(rocksIterator.isValid()).isTrue();
107         assertThat(rocksIterator.key()).isEqualTo(
108             "abc1".getBytes());
109         assertThat(rocksIterator.value()).isEqualTo(
110             "abc1".getBytes());
111         rocksIterator.next();
112         assertThat(rocksIterator.isValid()).isFalse();
113         // Get last one
114         rocksIterator.seekToLast();
115         assertThat(rocksIterator.isValid()).isTrue();
116         assertThat(rocksIterator.key()).isEqualTo(
117             "abc1".getBytes());
118         assertThat(rocksIterator.value()).isEqualTo(
119             "abc1".getBytes());
120         // Will be invalid because abc is after abc1
121         rocksIterator.seek("abc".getBytes());
122         assertThat(rocksIterator.isValid()).isFalse();
123         // Will be abc3 because the next one after abc999
124         // is abc3
125         rocksIterator.seek("abc999".getBytes());
126         assertThat(rocksIterator.key()).isEqualTo(
127             "abc3".getBytes());
128         assertThat(rocksIterator.value()).isEqualTo(
129             "abc3".getBytes());
130       }
131     }
132   }
133 
134   @Test
135   public void builtinComparatorEnum(){
136     assertThat(BuiltinComparator.BYTEWISE_COMPARATOR.ordinal())
137         .isEqualTo(0);
138     assertThat(
139         BuiltinComparator.REVERSE_BYTEWISE_COMPARATOR.ordinal())
140         .isEqualTo(1);
141     assertThat(BuiltinComparator.values().length).isEqualTo(2);
142     assertThat(BuiltinComparator.valueOf("BYTEWISE_COMPARATOR")).
143         isEqualTo(BuiltinComparator.BYTEWISE_COMPARATOR);
144   }
145 }
146