1 // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 package org.rocksdb; 3 4 import org.junit.Rule; 5 import org.junit.Test; 6 import org.junit.rules.TemporaryFolder; 7 8 import java.util.ArrayList; 9 import java.util.Arrays; 10 import java.util.List; 11 12 import static java.nio.charset.StandardCharsets.UTF_8; 13 import static org.assertj.core.api.Assertions.assertThat; 14 15 public class TableFilterTest { 16 17 @Rule 18 public TemporaryFolder dbFolder = new TemporaryFolder(); 19 20 @Test readOptions()21 public void readOptions() throws RocksDBException { 22 try (final DBOptions opt = new DBOptions(). 23 setCreateIfMissing(true). 24 setCreateMissingColumnFamilies(true); 25 final ColumnFamilyOptions new_cf_opts = new ColumnFamilyOptions() 26 ) { 27 final List<ColumnFamilyDescriptor> columnFamilyDescriptors = 28 Arrays.asList( 29 new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY), 30 new ColumnFamilyDescriptor("new_cf".getBytes(), new_cf_opts) 31 ); 32 33 final List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>(); 34 35 // open database 36 try (final RocksDB db = RocksDB.open(opt, 37 dbFolder.getRoot().getAbsolutePath(), 38 columnFamilyDescriptors, 39 columnFamilyHandles)) { 40 41 try (final CfNameCollectionTableFilter cfNameCollectingTableFilter = 42 new CfNameCollectionTableFilter(); 43 final FlushOptions flushOptions = 44 new FlushOptions().setWaitForFlush(true); 45 final ReadOptions readOptions = 46 new ReadOptions().setTableFilter(cfNameCollectingTableFilter)) { 47 48 db.put(columnFamilyHandles.get(0), 49 "key1".getBytes(UTF_8), "value1".getBytes(UTF_8)); 50 db.put(columnFamilyHandles.get(0), 51 "key2".getBytes(UTF_8), "value2".getBytes(UTF_8)); 52 db.put(columnFamilyHandles.get(0), 53 "key3".getBytes(UTF_8), "value3".getBytes(UTF_8)); 54 db.put(columnFamilyHandles.get(1), 55 "key1".getBytes(UTF_8), "value1".getBytes(UTF_8)); 56 db.put(columnFamilyHandles.get(1), 57 "key2".getBytes(UTF_8), "value2".getBytes(UTF_8)); 58 db.put(columnFamilyHandles.get(1), 59 "key3".getBytes(UTF_8), "value3".getBytes(UTF_8)); 60 61 db.flush(flushOptions, columnFamilyHandles); 62 63 try (final RocksIterator iterator = 64 db.newIterator(columnFamilyHandles.get(0), readOptions)) { 65 iterator.seekToFirst(); 66 while (iterator.isValid()) { 67 iterator.key(); 68 iterator.value(); 69 iterator.next(); 70 } 71 } 72 73 try (final RocksIterator iterator = 74 db.newIterator(columnFamilyHandles.get(1), readOptions)) { 75 iterator.seekToFirst(); 76 while (iterator.isValid()) { 77 iterator.key(); 78 iterator.value(); 79 iterator.next(); 80 } 81 } 82 83 assertThat(cfNameCollectingTableFilter.cfNames.size()).isEqualTo(2); 84 assertThat(cfNameCollectingTableFilter.cfNames.get(0)) 85 .isEqualTo(RocksDB.DEFAULT_COLUMN_FAMILY); 86 assertThat(cfNameCollectingTableFilter.cfNames.get(1)) 87 .isEqualTo("new_cf".getBytes(UTF_8)); 88 } finally { 89 for (final ColumnFamilyHandle columnFamilyHandle : columnFamilyHandles) { 90 columnFamilyHandle.close(); 91 } 92 } 93 } 94 } 95 } 96 97 private static class CfNameCollectionTableFilter extends AbstractTableFilter { 98 private final List<byte[]> cfNames = new ArrayList<>(); 99 100 @Override filter(final TableProperties tableProperties)101 public boolean filter(final TableProperties tableProperties) { 102 cfNames.add(tableProperties.getColumnFamilyName()); 103 return true; 104 } 105 } 106 } 107