static const std::vector parseTouchpointMetadata()

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;
}