package org.apache.cassandra.stress.settings;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.cassandra.db.marshal.*;
import org.apache.cassandra.stress.generatedata.*;
/**
* For parsing column options
*/
public class SettingsColumn implements Serializable
{
public final int maxColumnsPerKey;
public final List<ByteBuffer> names;
public final String comparator;
public final boolean useTimeUUIDComparator;
public final int superColumns;
public final boolean useSuperColumns;
public final boolean variableColumnCount;
private final DistributionFactory sizeDistribution;
private final DistributionFactory countDistribution;
private final DataGenFactory dataGenFactory;
public SettingsColumn(GroupedOptions options)
{
this((Options) options,
options instanceof NameOptions ? (NameOptions) options : null,
options instanceof CountOptions ? (CountOptions) options : null
);
}
public SettingsColumn(Options options, NameOptions name, CountOptions count)
{
sizeDistribution = options.size.get();
superColumns = Integer.parseInt(options.superColumns.value());
dataGenFactory = options.generator.get();
useSuperColumns = superColumns > 0;
{
comparator = options.comparator.value();
AbstractType parsed = null;
try
{
parsed = TypeParser.parse(comparator);
}
catch (Exception e)
{
System.err.println(e.getMessage());
System.exit(1);
}
useTimeUUIDComparator = parsed instanceof TimeUUIDType;
if (!(parsed instanceof TimeUUIDType || parsed instanceof AsciiType || parsed instanceof UTF8Type))
{
System.err.println("Currently supported types are: TimeUUIDType, AsciiType, UTF8Type.");
System.exit(1);
}
}
if (name != null)
{
assert count == null;
AbstractType comparator;
try
{
comparator = TypeParser.parse(this.comparator);
} catch (Exception e)
{
throw new IllegalStateException(e);
}
final String[] names = name.name.value().split(",");
this.names = new ArrayList<>(names.length);
for (String columnName : names)
this.names.add(comparator.fromString(columnName));
final int nameCount = this.names.size();
countDistribution = new DistributionFactory()
{
@Override
public Distribution get()
{
return new DistributionFixed(nameCount);
}
};
}
else
{
this.countDistribution = count.count.get();
this.names = null;
}
maxColumnsPerKey = (int) countDistribution.get().maxValue();
variableColumnCount = countDistribution.get().minValue() < maxColumnsPerKey;
}
public RowGen newRowGen()
{
return new RowGenDistributedSize(dataGenFactory.get(), countDistribution.get(), sizeDistribution.get());
}
// Option Declarations
private static abstract class Options extends GroupedOptions
{
final OptionSimple superColumns = new OptionSimple("super=", "[0-9]+", "0", "Number of super columns to use (no super columns used if not specified)", false);
final OptionSimple comparator = new OptionSimple("comparator=", "TimeUUIDType|AsciiType|UTF8Type", "AsciiType", "Column Comparator to use", false);
final OptionDistribution size = new OptionDistribution("size=", "FIXED(34)");
final OptionDataGen generator = new OptionDataGen("data=", "REPEAT(50)");
}
private static final class NameOptions extends Options
{
final OptionSimple name = new OptionSimple("names=", ".*", null, "Column names", true);
@Override
public List<? extends Option> options()
{
return Arrays.asList(name, superColumns, comparator, size, generator);
}
}
private static final class CountOptions extends Options
{
final OptionDistribution count = new OptionDistribution("n=", "FIXED(5)");
@Override
public List<? extends Option> options()
{
return Arrays.asList(count, superColumns, comparator, size, generator);
}
}
// CLI Utility Methods
static SettingsColumn get(Map<String, String[]> clArgs)
{
String[] params = clArgs.remove("-col");
if (params == null)
return new SettingsColumn(new CountOptions());
GroupedOptions options = GroupedOptions.select(params, new NameOptions(), new CountOptions());
if (options == null)
{
printHelp();
System.out.println("Invalid -col options provided, see output for valid options");
System.exit(1);
}
return new SettingsColumn(options);
}
static void printHelp()
{
GroupedOptions.printOptions(System.out, "-col", new NameOptions(), new CountOptions());
}
static Runnable helpPrinter()
{
return new Runnable()
{
@Override
public void run()
{
printHelp();
}
};
}
}