| 62 | class JoinBenchmark { |
| 63 | public: |
| 64 | explicit JoinBenchmark(BenchmarkSettings& settings) { |
| 65 | SchemaBuilder l_schema_builder, r_schema_builder; |
| 66 | std::vector<FieldRef> left_keys, right_keys; |
| 67 | std::vector<JoinKeyCmp> key_cmp; |
| 68 | for (size_t i = 0; i < settings.key_types.size(); i++) { |
| 69 | std::string l_name = "lk" + std::to_string(i); |
| 70 | std::string r_name = "rk" + std::to_string(i); |
| 71 | |
| 72 | // For integers, selectivity is the proportion of the build interval that overlaps |
| 73 | // with the probe interval |
| 74 | uint64_t num_build_rows = settings.num_build_batches * settings.batch_size; |
| 75 | |
| 76 | uint64_t min_build_value = 0; |
| 77 | uint64_t max_build_value = |
| 78 | static_cast<uint64_t>(num_build_rows * settings.cardinality); |
| 79 | |
| 80 | uint64_t min_probe_value = |
| 81 | static_cast<uint64_t>((1.0 - settings.selectivity) * max_build_value); |
| 82 | uint64_t max_probe_value = min_probe_value + max_build_value; |
| 83 | |
| 84 | std::unordered_map<std::string, std::string> build_metadata; |
| 85 | build_metadata["null_probability"] = std::to_string(settings.null_percentage); |
| 86 | build_metadata["min"] = std::to_string(min_build_value); |
| 87 | build_metadata["max"] = std::to_string(max_build_value); |
| 88 | build_metadata["min_length"] = std::to_string(settings.var_length_min); |
| 89 | build_metadata["max_length"] = std::to_string(settings.var_length_max); |
| 90 | |
| 91 | std::unordered_map<std::string, std::string> probe_metadata; |
| 92 | probe_metadata["null_probability"] = std::to_string(settings.null_percentage); |
| 93 | probe_metadata["min"] = std::to_string(min_probe_value); |
| 94 | probe_metadata["max"] = std::to_string(max_probe_value); |
| 95 | |
| 96 | auto l_field = |
| 97 | field(l_name, settings.key_types[i], key_value_metadata(probe_metadata)); |
| 98 | auto r_field = |
| 99 | field(r_name, settings.key_types[i], key_value_metadata(build_metadata)); |
| 100 | |
| 101 | DCHECK_OK(l_schema_builder.AddField(l_field)); |
| 102 | DCHECK_OK(r_schema_builder.AddField(r_field)); |
| 103 | |
| 104 | left_keys.push_back(FieldRef(l_name)); |
| 105 | right_keys.push_back(FieldRef(r_name)); |
| 106 | key_cmp.push_back(JoinKeyCmp::EQ); |
| 107 | } |
| 108 | |
| 109 | for (size_t i = 0; i < settings.probe_payload_types.size(); i++) { |
| 110 | std::string name = "lp" + std::to_string(i); |
| 111 | DCHECK_OK(l_schema_builder.AddField(field(name, settings.probe_payload_types[i]))); |
| 112 | } |
| 113 | |
| 114 | for (size_t i = 0; i < settings.build_payload_types.size(); i++) { |
| 115 | std::string name = "rp" + std::to_string(i); |
| 116 | DCHECK_OK(r_schema_builder.AddField(field(name, settings.build_payload_types[i]))); |
| 117 | } |
| 118 | |
| 119 | auto l_schema = *l_schema_builder.Finish(); |
| 120 | auto r_schema = *r_schema_builder.Finish(); |
| 121 |
nothing calls this directly
no test coverage detected