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