use of oap.tree.Dimension.STRING in project oap by oaplatform.
the class TreePerformance method run.
public void run(double fillFactor, int arrayToTree, int dataCount) {
val bids = new ArrayList<ArrayList<Object>>();
val dimensions = new ArrayList<Dimension>();
addStringDimension(dimensions, 20, Dimension.OperationType.CONTAINS);
addLongDimension(dimensions, 5);
addStringDimension(dimensions, 30, NOT_CONTAINS);
addBooleanDimension(dimensions, 10, Dimension.OperationType.CONTAINS);
addBooleanDimension(dimensions, 10, NOT_CONTAINS);
addEnumDimension(dimensions, TestEnum1.class, TestEnum1.UNKNOWN1);
addEnumDimension(dimensions, TestEnum2.class, TestEnum2.Test21);
addArrayEnumDimension(dimensions, TestEnum3.class, TestEnum3.Test31, 2);
addArrayStringDimension(dimensions, 5, 300);
addArrayStringDimension(dimensions, 5, 3);
addArrayStringDimension(dimensions, 5, 4);
addArrayStringDimension(dimensions, 5, 5);
addArrayLongDimension(dimensions, 5, 4);
addArrayLongDimension(dimensions, 5, 10);
val data = new ArrayList<Tree.ValueData<String>>();
fill(dimensions, data, dataCount);
generateRequests(100, dimensions, bids, data);
final Tree<String> tree = Tree.<String>tree(dimensions).withHashFillFactor(fillFactor).withArrayToTree(arrayToTree).load(data);
benchmark("tree-" + fillFactor + "-" + dataCount, SAMPLES, (i) -> {
Assertions.assertThat(tree.find(bids.get(i % bids.size()))).isNotEmpty();
}).run();
System.out.println(tree.getMaxDepth());
}
use of oap.tree.Dimension.STRING in project oap by oaplatform.
the class TreePerformance method fill.
@SneakyThrows
private void fill(ArrayList<Dimension> dimensions, ArrayList<Tree.ValueData<String>> data, int count) {
val map = new HashMap<String, ArrayList<String>>();
val mapSize = new HashMap<String, Integer>();
val enums = new HashMap<String, ArrayList<Enum<?>>>();
for (int i = 0; i < count; i++) {
val selection = new ArrayList<Object>();
for (Dimension dimension : dimensions) {
if (dimension.name.startsWith("string")) {
val list = map.computeIfAbsent(dimension.name, (dn) -> new ArrayList<>());
if (list.isEmpty()) {
for (int r = 0; r < 100; r++) {
list.add(RandomStringUtils.randomAlphabetic(10) + i);
}
}
selection.add(Lists.random(list).get());
} else if (dimension.name.startsWith("long")) {
selection.add(RandomUtils.nextLong(0, 1000000));
} else if (dimension.name.startsWith("boolean")) {
selection.add(RandomUtils.nextBoolean());
} else if (dimension.name.startsWith("arrayString")) {
val size = mapSize.computeIfAbsent(dimension.name, ss -> {
final Matcher matcher = ARRAY_STRING_PATTERN.matcher(dimension.name);
assert matcher.find();
return Integer.parseInt(matcher.group(1));
});
val list = map.computeIfAbsent(dimension.name, (dn) -> new ArrayList<>());
if (list.isEmpty()) {
for (int r = 0; r < 100; r++) {
list.add(RandomStringUtils.randomAlphabetic(10) + i);
}
}
val array = new ArrayList<String>();
for (int s = 0; s < size; s++) {
array.add(Lists.random(list).get());
}
selection.add(new Tree.Array(array, true));
} else if (dimension.name.startsWith("arrayEnum")) {
val size = mapSize.computeIfAbsent(dimension.name, ss1 -> {
final Matcher matcher = ARRAY_ENUM_PATTERN.matcher(dimension.name);
assert matcher.find();
return Integer.parseInt(matcher.group(1));
});
val list = enums.computeIfAbsent(dimension.name, (dn) -> new ArrayList<>());
if (list.isEmpty()) {
final Matcher matcher = ARRAY_ENUM_PATTERN.matcher(dimension.name);
assert matcher.find();
final Class<Enum<?>> clazz = (Class<Enum<?>>) Class.forName(matcher.group(2));
final Enum<?>[] enumConstants = clazz.getEnumConstants();
list.addAll(asList(enumConstants));
}
val array = new ArrayList<Enum<?>>();
for (int s = 0; s < size; s++) {
array.add(Lists.random(list).get());
}
selection.add(new Tree.Array(array, true));
} else if (dimension.name.startsWith("arrayLong")) {
val array = new ArrayList<Long>();
val size = mapSize.computeIfAbsent(dimension.name, ss1 -> {
final Matcher matcher = ARRAY_LONG_PATTERN.matcher(dimension.name);
matcher.find();
return Integer.parseInt(matcher.group(1));
});
for (int s = 0; s < size; s++) {
array.add(RandomUtils.nextLong(0, size));
}
selection.add(new Tree.Array(array, true));
} else if (dimension.name.startsWith("enum")) {
val list = enums.computeIfAbsent(dimension.name, (dn) -> new ArrayList<>());
if (list.isEmpty()) {
final Matcher matcher = ENUM_PATTERN.matcher(dimension.name);
assert matcher.find();
final Class<Enum<?>> clazz = (Class<Enum<?>>) Class.forName(matcher.group(1));
final Enum<?>[] enumConstants = clazz.getEnumConstants();
list.addAll(asList(enumConstants));
}
selection.add(Lists.random(list).get());
} else {
throw new IllegalStateException("Unknown dimension type " + dimension.name);
}
}
data.add(new Tree.ValueData<>(selection, "data" + i));
}
}
Aggregations