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