in phoenix-pherf/src/main/java/org/apache/phoenix/pherf/rules/RulesApplier.java [203:341]
public DataValue getDataValue(Column column) throws Exception {
DataValue data = null;
String prefix = "";
int length = column.getLength();
int nullChance = column.getNullChance();
List<DataValue> dataValues = column.getDataValues();
// Return an empty value if we fall within the configured probability of null
if ((nullChance != Integer.MIN_VALUE) && (isValueNull(nullChance))) {
return new DataValue(column.getType(), "");
}
if (column.getPrefix() != null) {
prefix = column.getPrefix();
}
if ((prefix.length() >= length) && (length > 0)) {
LOGGER.warn("You are attempting to generate data with a prefix (" + prefix + ") "
+ "That is longer than expected overall field length (" + length + "). "
+ "This will certainly lead to unexpected data values.");
}
switch (column.getType()) {
case VARCHAR:
case VARBINARY:
case JSON:
case BSON:
case CHAR:
// Use the specified data values from configs if they exist
if (DataSequence.SEQUENTIAL.equals(column.getDataSequence())) {
RuleBasedDataGenerator generator = getRuleBasedDataGeneratorForColumn(column);
data = generator.getDataValue();
} else if ((column.getDataValues() != null) && (column.getDataValues().size() > 0)) {
data = pickDataValueFromList(dataValues);
} else {
Preconditions.checkArgument(length > 0, "length needs to be > 0");
data = getRandomDataValue(column);
}
break;
case VARCHAR_ARRAY:
//only list datavalues are supported
String arr = "";
for (DataValue dv : dataValues) {
arr += "," + dv.getValue();
}
if (arr.startsWith(",")) {
arr = arr.replaceFirst(",", "");
}
data = new DataValue(column.getType(), arr);
break;
case DECIMAL:
if ((column.getDataValues() != null) && (column.getDataValues().size() > 0)) {
data = pickDataValueFromList(dataValues);
} else {
int precision = column.getPrecision();
double minDbl = column.getMinValue();
Preconditions.checkArgument((precision > 0) && (precision <= 18),
"Precision must be between 0 and 18");
Preconditions.checkArgument(minDbl >= 0,
"minvalue must be set in configuration for decimal");
Preconditions.checkArgument(column.getMaxValue() > 0,
"maxValue must be set in configuration decimal");
StringBuilder maxValueStr = new StringBuilder();
for (int i = 0; i < precision; i++) {
maxValueStr.append(9);
}
double maxDbl =
Math.min(column.getMaxValue(), Double.parseDouble(maxValueStr.toString()));
final double dbl = RandomUtils.nextDouble(minDbl, maxDbl);
data = new DataValue(column.getType(), String.valueOf(dbl));
}
break;
case TINYINT:
case INTEGER:
if ((column.getDataValues() != null) && (column.getDataValues().size() > 0)) {
data = pickDataValueFromList(dataValues);
} else if (DataSequence.SEQUENTIAL.equals(column.getDataSequence())) {
RuleBasedDataGenerator generator = getRuleBasedDataGeneratorForColumn(column);
data = generator.getDataValue();
} else {
int minInt = (int) column.getMinValue();
int maxInt = (int) column.getMaxValue();
if (column.getType() == DataTypeMapping.TINYINT) {
Preconditions.checkArgument((minInt >= -128) && (minInt <= 128),
"min value need to be set in configuration for tinyints " + column.getName());
Preconditions.checkArgument((maxInt >= -128) && (maxInt <= 128),
"max value need to be set in configuration for tinyints " + column.getName());
}
int intVal = ThreadLocalRandom.current().nextInt(minInt, maxInt + 1);
data = new DataValue(column.getType(), String.valueOf(intVal));
}
break;
case BIGINT:
case UNSIGNED_LONG:
if ((column.getDataValues() != null) && (column.getDataValues().size() > 0)) {
data = pickDataValueFromList(dataValues);
} else {
long minLong = column.getMinValue();
long maxLong = column.getMaxValue();
if (column.getType() == DataTypeMapping.UNSIGNED_LONG)
Preconditions.checkArgument((minLong > 0) && (maxLong > 0),
"min and max values need to be set in configuration for unsigned_longs " + column.getName());
long longVal = RandomUtils.nextLong(minLong, maxLong);
data = new DataValue(column.getType(), String.valueOf(longVal));
}
break;
case DATE:
case TIMESTAMP:
if ((column.getDataValues() != null) && (column.getDataValues().size() > 0)) {
data = pickDataValueFromList(dataValues);
// Check if date has right format or not
data.setValue(checkDatePattern(data.getValue()));
} else if (DataSequence.SEQUENTIAL.equals(column.getDataSequence())) {
RuleBasedDataGenerator generator = getRuleBasedDataGeneratorForColumn(column);
data = generator.getDataValue();
} else if (column.getUseCurrentDate() != true) {
int minYear = (int) column.getMinValue();
int maxYear = (int) column.getMaxValue();
Preconditions.checkArgument((minYear > 0) && (maxYear > 0),
"min and max values need to be set in configuration for date/timestamps " + column.getName());
String dt = generateRandomDate(minYear, maxYear);
data = new DataValue(column.getType(), dt);
data.setMaxValue(String.valueOf(minYear));
data.setMinValue(String.valueOf(maxYear));
} else {
String dt = getCurrentDate();
data = new DataValue(column.getType(), dt);
}
break;
default:
break;
}
Preconditions.checkArgument(data != null,
"Data value could not be generated for some reason. Please check configs");
return data;
}