Having just complained about using friends, I'm going to... suggest using friends.

If BulkUpsertOperation should only really be constructed with args by the BulkOperationBuilder, consider making this constructor private, and being friends with BulkOperationBuilder.

The rationale here is that BulkUpsertOperation is logically a facet of the builder, and it only make sense for the builder to construct them.