174 std::unique_ptr<RDataFrame>&
right)
final
176 std::vector<std::pair<ULong64_t, ULong64_t>> ranges;
177 std::vector<INDEX_TYPE> leftCategories;
178 std::vector<INDEX_TYPE> rightCategories;
179 std::vector<Association> leftPairs;
180 std::vector<Association> rightPairs;
182 computePairsAndCategories(
left, leftCategories, leftPairs, fLeftCategoryColumn);
185 rightCategories = leftCategories;
186 rightPairs = leftPairs;
188 computePairsAndCategories(
right, rightCategories, rightPairs, fRightCategoryColumn);
191 auto same = [](std::pair<ULong64_t, ULong64_t>
const&
a, std::pair<ULong64_t, ULong64_t>
const&
b) {
192 return a.first <
b.first;
198 int startSize = fAssociations.size();
199 for (
auto categoryValue : leftCategories) {
200 std::pair<ULong64_t, ULong64_t> p{categoryValue, 0};
201 auto outerRange = std::equal_range(leftPairs.begin(), leftPairs.end(), p, same);
202 decltype(outerRange) innerRange;
204 innerRange = outerRange;
206 innerRange = std::equal_range(rightPairs.begin(), rightPairs.end(), p, same);
209 switch (fCombinationType) {
211 for (
auto out = outerRange.first; out != outerRange.second; ++out) {
212 for (
auto in = innerRange.first; in != innerRange.second; ++in) {
213 fAssociations.emplace_back(Association{out->second, in->second});
219 for (
auto out = outerRange.first; out != outerRange.second; ++out) {
220 if (innerRange.first == innerRange.second) {
223 for (
auto in = innerRange.first +
offset; in != innerRange.second; ++in) {
224 fAssociations.emplace_back(Association{out->second, in->second});
231 for (
auto out = outerRange.first; out != outerRange.second; ++out) {
232 if (innerRange.first == innerRange.second || innerRange.first + 1 == innerRange.second) {
235 for (
auto in = innerRange.first +
offset; in != innerRange.second; ++in) {
236 fAssociations.emplace_back(Association{out->second, in->second});
242 for (
auto out = outerRange.first; out != outerRange.second; ++out) {
243 for (
auto in = innerRange.first; in != innerRange.second; ++in) {
244 if (std::distance(innerRange.first, in) == std::distance(outerRange.first, out)) {
247 fAssociations.emplace_back(Association{out->second, in->second});
253 auto sizeRow = std::distance(outerRange.first, outerRange.second);
254 auto sizeCol = std::distance(innerRange.first, innerRange.second);
255 for (
size_t i = 0, e = std::min(sizeRow, sizeCol);
i < e; ++
i) {
256 fAssociations.emplace_back(Association{(outerRange.first +
i)->second, (innerRange.first +
i)->second});
260 auto rangeFirst = startSize;
261 auto rangeSecond = fAssociations.size();
262 startSize = fAssociations.size();
263 ranges.emplace_back(std::make_pair<ULong64_t, ULong64_t>(rangeFirst, rangeSecond));