/**
* Enqueue a mutation
*
* A mutation is a change to the datastore. Create, Update and Delete are
* examples of mutations, while Read is not.
*
* Google Cloud Datastore supports multiple mutations in a single API call,
* subject to the limits of the service. Adding mutations separately from
* committing the changes allows you to create complex operations, both
* inside a transaction and not.
*
* @see https://cloud.google.com/datastore/docs/concepts/limits Limits
*
* @param string $operation The operation to execute. "Insert", "Upsert",
* "Update" or "Delete".
* @param Entity|Key $input The entity or key to mutate.
* @param string $type The type of the input array.
* @param string $baseVersion [optional] The version of the entity that this mutation
* is being applied to. If this does not match the current version on
* the server, the mutation conflicts.
* @return array [Mutation](https://cloud.google.com/datastore/docs/reference/rest/v1/projects/commit#Mutation).
* @throws InvalidArgumentException
*/
public function mutation($operation, $input, $type, $baseVersion = null)
{
// If the given element is an Entity, it will use that baseVersion.
if ($input instanceof Entity) {
$baseVersion = $input->baseVersion();
$data = $this->entityMapper->objectToRequest($input);
} elseif ($input instanceof Key) {
$data = $input->keyObject();
} else {
throw new InvalidArgumentException(sprintf('Input must be a Key or Entity, %s given', get_class($input)));
}
return array_filter([$operation => $data, 'baseVersion' => $baseVersion]);
}