in fbpcs/emp_games/attribution/decoupled_aggregation/AggregationMetrics.cpp [35:87]
static const std::vector<TouchpointMetadata> parseTouchpointMetadata(
const int lineNo,
const std::vector<std::string>& header,
const std::vector<std::string>& parts) {
std::vector<int64_t> originalAdIds;
std::vector<int64_t> timestamps;
std::vector<int64_t> isClicks;
std::vector<int64_t> campaignMetadata;
for (std::vector<std::string>::size_type i = 0; i < header.size(); ++i) {
auto column = header[i];
auto value = parts[i];
if (column == "ad_ids") {
originalAdIds = getInnerArray<int64_t>(value);
} else if (column == "timestamps") {
timestamps = getInnerArray<int64_t>(value);
} else if (column == "is_click") {
isClicks = getInnerArray<int64_t>(value);
} else if (column == "campaign_metadata") {
campaignMetadata = getInnerArray<int64_t>(value);
}
}
CHECK_EQ(originalAdIds.size(), timestamps.size())
<< "Ad ids and timestamps arrays are not the same length.";
CHECK_EQ(originalAdIds.size(), isClicks.size())
<< "Ad ids and is_click arrays are not the same length.";
CHECK_EQ(originalAdIds.size(), campaignMetadata.size())
<< "Ad ids and campaign_metadata arrays are not the same length.";
std::vector<int64_t> unique_ids;
for (std::vector<int64_t>::size_type i = 0; i < timestamps.size(); i++) {
unique_ids.push_back(static_cast<int64_t>(i));
}
const std::unordered_set<int64_t> idSet{unique_ids.begin(), unique_ids.end()};
CHECK_EQ(idSet.size(), timestamps.size())
<< "Found non-unique id for line " << lineNo << ". "
<< "This implementation currently only supports unique touchpoint ids per user.";
std::vector<TouchpointMetadata> tpms;
for (std::vector<int64_t>::size_type i = 0; i < originalAdIds.size(); i++) {
tpms.push_back(TouchpointMetadata{
/* original Ad Id */ originalAdIds.at(i),
/* ts */ timestamps.at(i),
/* isClick */ isClicks.at(i) == 1,
/* campaignMetadata */ campaignMetadata.at(i),
/* compressed Ad Id */ 0});
}
std::sort(tpms.begin(), tpms.end());
return tpms;
}