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