absl::Status MergeCrossFeatureStatistics()

in tfx_bsl/cc/statistics/merge_util.cc [114:152]


absl::Status MergeCrossFeatureStatistics(
    const CrossFeatureStatistics& merge_from,
    CrossFeatureStatistics* merge_to) {
  if (!merge_to->has_path_x())
    *merge_to->mutable_path_x() = merge_from.path_x();
  if (!merge_to->has_path_y())
    *merge_to->mutable_path_y() = merge_from.path_y();
  // Set the count.
  if (DistinctNonzeroValues<uint64_t>(merge_from.count(), merge_to->count(),
                                      0)) {
    return absl::InvalidArgumentError(
        "CrossFeatureStatistics shards with different count");
  }
  if (merge_from.count() != 0) {
    merge_to->set_count(merge_from.count());
  }
  // Set the cross_stats oneof.
  if (DistinctNonzeroValues<CrossFeatureStatistics::CrossStatsCase>(
          merge_from.cross_stats_case(), merge_to->cross_stats_case(),
          CrossFeatureStatistics::CROSS_STATS_NOT_SET)) {
    return absl::InvalidArgumentError(
        "CrossFeatureStatistics shards with different cross_stats");
  }
  // TODO(b/202910677): Consider strictness here too.
  switch (merge_from.cross_stats_case()) {
    case CrossFeatureStatistics::CROSS_STATS_NOT_SET:
      break;
    case CrossFeatureStatistics::kNumCrossStats:
      merge_to->mutable_num_cross_stats()->MergeFrom(
          merge_from.num_cross_stats());
      break;
    case CrossFeatureStatistics::kCategoricalCrossStats:
      merge_to->mutable_categorical_cross_stats()->MergeFrom(
          merge_from.categorical_cross_stats());
      break;
  }

  return absl::OkStatus();
}