private MetadataChange remove(MetadataDatasetContext context, MetadataMutation.Remove remove) {
MetadataEntity entity = remove.getEntity();
MetadataDataset.Change userChange, systemChange;
if (remove.getRemovals() != null) {
Set<String> userTagsToRemove = new HashSet<>();
Set<String> systemTagsToRemove = new HashSet<>();
Set<String> userPropertiesToRemove = new HashSet<>();
Set<String> systemPropertiesToRemove = new HashSet<>();
remove.getRemovals().forEach(removal -> (TAG == removal.getKind()
? USER == removal.getScope() ? userTagsToRemove : systemTagsToRemove
: USER == removal.getScope() ? userPropertiesToRemove : systemPropertiesToRemove)
.add(removal.getName()));
userChange = removeInScope(context, USER, entity, userTagsToRemove, userPropertiesToRemove);
systemChange = removeInScope(context, SYSTEM, entity, systemTagsToRemove, systemPropertiesToRemove);
} else {
Set<MetadataScope> scopes = remove.getScopes();
Set<MetadataKind> kinds = remove.getKinds();
userChange = removeScope(context, USER, entity, scopes, kinds);
systemChange = removeScope(context, SYSTEM, entity, scopes, kinds);
}
return combineChanges(entity, userChange, systemChange);
}