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 java.util.*;
9 
10 public class MutableColumnFamilyOptions
11     extends AbstractMutableOptions {
12 
13   /**
14    * User must use builder pattern, or parser.
15    *
16    * @param keys the keys
17    * @param values the values
18    *
19    * See {@link #builder()} and {@link #parse(String)}.
20    */
MutableColumnFamilyOptions(final String[] keys, final String[] values)21   private MutableColumnFamilyOptions(final String[] keys,
22       final String[] values) {
23     super(keys, values);
24   }
25 
26   /**
27    * Creates a builder which allows you
28    * to set MutableColumnFamilyOptions in a fluent
29    * manner
30    *
31    * @return A builder for MutableColumnFamilyOptions
32    */
builder()33   public static MutableColumnFamilyOptionsBuilder builder() {
34     return new MutableColumnFamilyOptionsBuilder();
35   }
36 
37   /**
38    * Parses a String representation of MutableColumnFamilyOptions
39    *
40    * The format is: key1=value1;key2=value2;key3=value3 etc
41    *
42    * For int[] values, each int should be separated by a comma, e.g.
43    *
44    * key1=value1;intArrayKey1=1,2,3
45    *
46    * @param str The string representation of the mutable column family options
47    *
48    * @return A builder for the mutable column family options
49    */
parse(final String str)50   public static MutableColumnFamilyOptionsBuilder parse(final String str) {
51     Objects.requireNonNull(str);
52 
53     final MutableColumnFamilyOptionsBuilder builder =
54         new MutableColumnFamilyOptionsBuilder();
55 
56     final String[] options = str.trim().split(KEY_VALUE_PAIR_SEPARATOR);
57     for(final String option : options) {
58       final int equalsOffset = option.indexOf(KEY_VALUE_SEPARATOR);
59       if(equalsOffset <= 0) {
60         throw new IllegalArgumentException(
61             "options string has an invalid key=value pair");
62       }
63 
64       final String key = option.substring(0, equalsOffset);
65       if(key.isEmpty()) {
66         throw new IllegalArgumentException("options string is invalid");
67       }
68 
69       final String value = option.substring(equalsOffset + 1);
70       if(value.isEmpty()) {
71         throw new IllegalArgumentException("options string is invalid");
72       }
73 
74       builder.fromString(key, value);
75     }
76 
77     return builder;
78   }
79 
80   private interface MutableColumnFamilyOptionKey extends MutableOptionKey {}
81 
82   public enum MemtableOption implements MutableColumnFamilyOptionKey {
83     write_buffer_size(ValueType.LONG),
84     arena_block_size(ValueType.LONG),
85     memtable_prefix_bloom_size_ratio(ValueType.DOUBLE),
86     @Deprecated memtable_prefix_bloom_bits(ValueType.INT),
87     @Deprecated memtable_prefix_bloom_probes(ValueType.INT),
88     memtable_huge_page_size(ValueType.LONG),
89     max_successive_merges(ValueType.LONG),
90     @Deprecated filter_deletes(ValueType.BOOLEAN),
91     max_write_buffer_number(ValueType.INT),
92     inplace_update_num_locks(ValueType.LONG);
93 
94     private final ValueType valueType;
MemtableOption(final ValueType valueType)95     MemtableOption(final ValueType valueType) {
96       this.valueType = valueType;
97     }
98 
99     @Override
getValueType()100     public ValueType getValueType() {
101       return valueType;
102     }
103   }
104 
105   public enum CompactionOption implements MutableColumnFamilyOptionKey {
106     disable_auto_compactions(ValueType.BOOLEAN),
107     @Deprecated soft_rate_limit(ValueType.DOUBLE),
108     soft_pending_compaction_bytes_limit(ValueType.LONG),
109     @Deprecated hard_rate_limit(ValueType.DOUBLE),
110     hard_pending_compaction_bytes_limit(ValueType.LONG),
111     level0_file_num_compaction_trigger(ValueType.INT),
112     level0_slowdown_writes_trigger(ValueType.INT),
113     level0_stop_writes_trigger(ValueType.INT),
114     max_compaction_bytes(ValueType.LONG),
115     target_file_size_base(ValueType.LONG),
116     target_file_size_multiplier(ValueType.INT),
117     max_bytes_for_level_base(ValueType.LONG),
118     max_bytes_for_level_multiplier(ValueType.INT),
119     max_bytes_for_level_multiplier_additional(ValueType.INT_ARRAY),
120     ttl(ValueType.LONG);
121 
122     private final ValueType valueType;
CompactionOption(final ValueType valueType)123     CompactionOption(final ValueType valueType) {
124       this.valueType = valueType;
125     }
126 
127     @Override
getValueType()128     public ValueType getValueType() {
129       return valueType;
130     }
131   }
132 
133   public enum MiscOption implements MutableColumnFamilyOptionKey {
134     max_sequential_skip_in_iterations(ValueType.LONG),
135     paranoid_file_checks(ValueType.BOOLEAN),
136     report_bg_io_stats(ValueType.BOOLEAN),
137     compression_type(ValueType.ENUM);
138 
139     private final ValueType valueType;
MiscOption(final ValueType valueType)140     MiscOption(final ValueType valueType) {
141       this.valueType = valueType;
142     }
143 
144     @Override
getValueType()145     public ValueType getValueType() {
146       return valueType;
147     }
148   }
149 
150   public static class MutableColumnFamilyOptionsBuilder
151       extends AbstractMutableOptionsBuilder<MutableColumnFamilyOptions, MutableColumnFamilyOptionsBuilder, MutableColumnFamilyOptionKey>
152       implements MutableColumnFamilyOptionsInterface<MutableColumnFamilyOptionsBuilder> {
153 
154     private final static Map<String, MutableColumnFamilyOptionKey> ALL_KEYS_LOOKUP = new HashMap<>();
155     static {
156       for(final MutableColumnFamilyOptionKey key : MemtableOption.values()) {
key.name()157         ALL_KEYS_LOOKUP.put(key.name(), key);
158       }
159 
160       for(final MutableColumnFamilyOptionKey key : CompactionOption.values()) {
key.name()161         ALL_KEYS_LOOKUP.put(key.name(), key);
162       }
163 
164       for(final MutableColumnFamilyOptionKey key : MiscOption.values()) {
key.name()165         ALL_KEYS_LOOKUP.put(key.name(), key);
166       }
167     }
168 
MutableColumnFamilyOptionsBuilder()169     private MutableColumnFamilyOptionsBuilder() {
170       super();
171     }
172 
173     @Override
self()174     protected MutableColumnFamilyOptionsBuilder self() {
175       return this;
176     }
177 
178     @Override
allKeys()179     protected Map<String, MutableColumnFamilyOptionKey> allKeys() {
180       return ALL_KEYS_LOOKUP;
181     }
182 
183     @Override
build(final String[] keys, final String[] values)184     protected MutableColumnFamilyOptions build(final String[] keys,
185         final String[] values) {
186       return new MutableColumnFamilyOptions(keys, values);
187     }
188 
189     @Override
setWriteBufferSize( final long writeBufferSize)190     public MutableColumnFamilyOptionsBuilder setWriteBufferSize(
191         final long writeBufferSize) {
192       return setLong(MemtableOption.write_buffer_size, writeBufferSize);
193     }
194 
195     @Override
writeBufferSize()196     public long writeBufferSize() {
197       return getLong(MemtableOption.write_buffer_size);
198     }
199 
200     @Override
setArenaBlockSize( final long arenaBlockSize)201     public MutableColumnFamilyOptionsBuilder setArenaBlockSize(
202         final long arenaBlockSize) {
203       return setLong(MemtableOption.arena_block_size, arenaBlockSize);
204     }
205 
206     @Override
arenaBlockSize()207     public long arenaBlockSize() {
208       return getLong(MemtableOption.arena_block_size);
209     }
210 
211     @Override
setMemtablePrefixBloomSizeRatio( final double memtablePrefixBloomSizeRatio)212     public MutableColumnFamilyOptionsBuilder setMemtablePrefixBloomSizeRatio(
213         final double memtablePrefixBloomSizeRatio) {
214       return setDouble(MemtableOption.memtable_prefix_bloom_size_ratio,
215           memtablePrefixBloomSizeRatio);
216     }
217 
218     @Override
memtablePrefixBloomSizeRatio()219     public double memtablePrefixBloomSizeRatio() {
220       return getDouble(MemtableOption.memtable_prefix_bloom_size_ratio);
221     }
222 
223     @Override
setMemtableHugePageSize( final long memtableHugePageSize)224     public MutableColumnFamilyOptionsBuilder setMemtableHugePageSize(
225         final long memtableHugePageSize) {
226       return setLong(MemtableOption.memtable_huge_page_size,
227           memtableHugePageSize);
228     }
229 
230     @Override
memtableHugePageSize()231     public long memtableHugePageSize() {
232       return getLong(MemtableOption.memtable_huge_page_size);
233     }
234 
235     @Override
setMaxSuccessiveMerges( final long maxSuccessiveMerges)236     public MutableColumnFamilyOptionsBuilder setMaxSuccessiveMerges(
237         final long maxSuccessiveMerges) {
238       return setLong(MemtableOption.max_successive_merges, maxSuccessiveMerges);
239     }
240 
241     @Override
maxSuccessiveMerges()242     public long maxSuccessiveMerges() {
243       return getLong(MemtableOption.max_successive_merges);
244     }
245 
246     @Override
setMaxWriteBufferNumber( final int maxWriteBufferNumber)247     public MutableColumnFamilyOptionsBuilder setMaxWriteBufferNumber(
248         final int maxWriteBufferNumber) {
249       return setInt(MemtableOption.max_write_buffer_number,
250           maxWriteBufferNumber);
251     }
252 
253     @Override
maxWriteBufferNumber()254     public int maxWriteBufferNumber() {
255       return getInt(MemtableOption.max_write_buffer_number);
256     }
257 
258     @Override
setInplaceUpdateNumLocks( final long inplaceUpdateNumLocks)259     public MutableColumnFamilyOptionsBuilder setInplaceUpdateNumLocks(
260         final long inplaceUpdateNumLocks) {
261       return setLong(MemtableOption.inplace_update_num_locks,
262           inplaceUpdateNumLocks);
263     }
264 
265     @Override
inplaceUpdateNumLocks()266     public long inplaceUpdateNumLocks() {
267       return getLong(MemtableOption.inplace_update_num_locks);
268     }
269 
270     @Override
setDisableAutoCompactions( final boolean disableAutoCompactions)271     public MutableColumnFamilyOptionsBuilder setDisableAutoCompactions(
272         final boolean disableAutoCompactions) {
273       return setBoolean(CompactionOption.disable_auto_compactions,
274           disableAutoCompactions);
275     }
276 
277     @Override
disableAutoCompactions()278     public boolean disableAutoCompactions() {
279       return getBoolean(CompactionOption.disable_auto_compactions);
280     }
281 
282     @Override
setSoftPendingCompactionBytesLimit( final long softPendingCompactionBytesLimit)283     public MutableColumnFamilyOptionsBuilder setSoftPendingCompactionBytesLimit(
284         final long softPendingCompactionBytesLimit) {
285       return setLong(CompactionOption.soft_pending_compaction_bytes_limit,
286           softPendingCompactionBytesLimit);
287     }
288 
289     @Override
softPendingCompactionBytesLimit()290     public long softPendingCompactionBytesLimit() {
291       return getLong(CompactionOption.soft_pending_compaction_bytes_limit);
292     }
293 
294     @Override
setHardPendingCompactionBytesLimit( final long hardPendingCompactionBytesLimit)295     public MutableColumnFamilyOptionsBuilder setHardPendingCompactionBytesLimit(
296         final long hardPendingCompactionBytesLimit) {
297       return setLong(CompactionOption.hard_pending_compaction_bytes_limit,
298           hardPendingCompactionBytesLimit);
299     }
300 
301     @Override
hardPendingCompactionBytesLimit()302     public long hardPendingCompactionBytesLimit() {
303       return getLong(CompactionOption.hard_pending_compaction_bytes_limit);
304     }
305 
306     @Override
setLevel0FileNumCompactionTrigger( final int level0FileNumCompactionTrigger)307     public MutableColumnFamilyOptionsBuilder setLevel0FileNumCompactionTrigger(
308         final int level0FileNumCompactionTrigger) {
309       return setInt(CompactionOption.level0_file_num_compaction_trigger,
310           level0FileNumCompactionTrigger);
311     }
312 
313     @Override
level0FileNumCompactionTrigger()314     public int level0FileNumCompactionTrigger() {
315       return getInt(CompactionOption.level0_file_num_compaction_trigger);
316     }
317 
318     @Override
setLevel0SlowdownWritesTrigger( final int level0SlowdownWritesTrigger)319     public MutableColumnFamilyOptionsBuilder setLevel0SlowdownWritesTrigger(
320         final int level0SlowdownWritesTrigger) {
321       return setInt(CompactionOption.level0_slowdown_writes_trigger,
322           level0SlowdownWritesTrigger);
323     }
324 
325     @Override
level0SlowdownWritesTrigger()326     public int level0SlowdownWritesTrigger() {
327       return getInt(CompactionOption.level0_slowdown_writes_trigger);
328     }
329 
330     @Override
setLevel0StopWritesTrigger( final int level0StopWritesTrigger)331     public MutableColumnFamilyOptionsBuilder setLevel0StopWritesTrigger(
332         final int level0StopWritesTrigger) {
333       return setInt(CompactionOption.level0_stop_writes_trigger,
334           level0StopWritesTrigger);
335     }
336 
337     @Override
level0StopWritesTrigger()338     public int level0StopWritesTrigger() {
339       return getInt(CompactionOption.level0_stop_writes_trigger);
340     }
341 
342     @Override
setMaxCompactionBytes(final long maxCompactionBytes)343     public MutableColumnFamilyOptionsBuilder setMaxCompactionBytes(final long maxCompactionBytes) {
344       return setLong(CompactionOption.max_compaction_bytes, maxCompactionBytes);
345     }
346 
347     @Override
maxCompactionBytes()348     public long maxCompactionBytes() {
349       return getLong(CompactionOption.max_compaction_bytes);
350     }
351 
352 
353     @Override
setTargetFileSizeBase( final long targetFileSizeBase)354     public MutableColumnFamilyOptionsBuilder setTargetFileSizeBase(
355         final long targetFileSizeBase) {
356       return setLong(CompactionOption.target_file_size_base,
357           targetFileSizeBase);
358     }
359 
360     @Override
targetFileSizeBase()361     public long targetFileSizeBase() {
362       return getLong(CompactionOption.target_file_size_base);
363     }
364 
365     @Override
setTargetFileSizeMultiplier( final int targetFileSizeMultiplier)366     public MutableColumnFamilyOptionsBuilder setTargetFileSizeMultiplier(
367         final int targetFileSizeMultiplier) {
368       return setInt(CompactionOption.target_file_size_multiplier,
369           targetFileSizeMultiplier);
370     }
371 
372     @Override
targetFileSizeMultiplier()373     public int targetFileSizeMultiplier() {
374       return getInt(CompactionOption.target_file_size_multiplier);
375     }
376 
377     @Override
setMaxBytesForLevelBase( final long maxBytesForLevelBase)378     public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelBase(
379         final long maxBytesForLevelBase) {
380       return setLong(CompactionOption.max_bytes_for_level_base,
381           maxBytesForLevelBase);
382     }
383 
384     @Override
maxBytesForLevelBase()385     public long maxBytesForLevelBase() {
386       return getLong(CompactionOption.max_bytes_for_level_base);
387     }
388 
389     @Override
setMaxBytesForLevelMultiplier( final double maxBytesForLevelMultiplier)390     public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelMultiplier(
391         final double maxBytesForLevelMultiplier) {
392       return setDouble(CompactionOption.max_bytes_for_level_multiplier, maxBytesForLevelMultiplier);
393     }
394 
395     @Override
maxBytesForLevelMultiplier()396     public double maxBytesForLevelMultiplier() {
397       return getDouble(CompactionOption.max_bytes_for_level_multiplier);
398     }
399 
400     @Override
setMaxBytesForLevelMultiplierAdditional( final int[] maxBytesForLevelMultiplierAdditional)401     public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelMultiplierAdditional(
402         final int[] maxBytesForLevelMultiplierAdditional) {
403       return setIntArray(
404           CompactionOption.max_bytes_for_level_multiplier_additional,
405           maxBytesForLevelMultiplierAdditional);
406     }
407 
408     @Override
maxBytesForLevelMultiplierAdditional()409     public int[] maxBytesForLevelMultiplierAdditional() {
410       return getIntArray(
411           CompactionOption.max_bytes_for_level_multiplier_additional);
412     }
413 
414     @Override
setMaxSequentialSkipInIterations( final long maxSequentialSkipInIterations)415     public MutableColumnFamilyOptionsBuilder setMaxSequentialSkipInIterations(
416         final long maxSequentialSkipInIterations) {
417       return setLong(MiscOption.max_sequential_skip_in_iterations,
418           maxSequentialSkipInIterations);
419     }
420 
421     @Override
maxSequentialSkipInIterations()422     public long maxSequentialSkipInIterations() {
423       return getLong(MiscOption.max_sequential_skip_in_iterations);
424     }
425 
426     @Override
setParanoidFileChecks( final boolean paranoidFileChecks)427     public MutableColumnFamilyOptionsBuilder setParanoidFileChecks(
428         final boolean paranoidFileChecks) {
429       return setBoolean(MiscOption.paranoid_file_checks, paranoidFileChecks);
430     }
431 
432     @Override
paranoidFileChecks()433     public boolean paranoidFileChecks() {
434       return getBoolean(MiscOption.paranoid_file_checks);
435     }
436 
437     @Override
setCompressionType( final CompressionType compressionType)438     public MutableColumnFamilyOptionsBuilder setCompressionType(
439         final CompressionType compressionType) {
440       return setEnum(MiscOption.compression_type, compressionType);
441     }
442 
443     @Override
compressionType()444     public CompressionType compressionType() {
445       return (CompressionType)getEnum(MiscOption.compression_type);
446     }
447 
448     @Override
setReportBgIoStats( final boolean reportBgIoStats)449     public MutableColumnFamilyOptionsBuilder setReportBgIoStats(
450         final boolean reportBgIoStats) {
451       return setBoolean(MiscOption.report_bg_io_stats, reportBgIoStats);
452     }
453 
454     @Override
reportBgIoStats()455     public boolean reportBgIoStats() {
456       return getBoolean(MiscOption.report_bg_io_stats);
457     }
458 
459     @Override
setTtl(final long ttl)460     public MutableColumnFamilyOptionsBuilder setTtl(final long ttl) {
461       return setLong(CompactionOption.ttl, ttl);
462     }
463 
464     @Override
ttl()465     public long ttl() {
466       return getLong(CompactionOption.ttl);
467     }
468   }
469 }
470