/** * 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]); }