/**
* Allocate available IDs to a set of keys
*
* Keys MUST be in an incomplete state (i.e. including a kind but not an ID
* or name in their final pathElement).
*
* This method will execute a service request.
*
* @see https://cloud.google.com/datastore/reference/rest/v1/projects/allocateIds allocateIds
*
* @param Key[] $keys The incomplete keys.
* @param array $options [optional] Configuration Options.
* @return Key[]
* @throws InvalidArgumentException
*/
public function allocateIds(array $keys, array $options = [])
{
// Validate the given keys. First check types, then state of each.
// The API will throw a 400 if the key is complete, but it's an easy
// check we can handle before going to the API to save a request.
// @todo replace with json schema
$this->validateBatch($keys, Key::class, function ($key) {
if ($key->state() !== Key::STATE_INCOMPLETE) {
throw new InvalidArgumentException(sprintf('Given $key is in an invalid state. Can only allocate IDs for incomplete keys. ' . 'Given path was %s', (string) $key));
}
});
$res = $this->connection->allocateIds(['projectId' => $this->projectId, 'keys' => $keys] + $options);
if (isset($res['keys'])) {
foreach ($res['keys'] as $index => $key) {
$end = end($key['path']);
$id = $end['id'];
$keys[$index]->setLastElementIdentifier($id);
}
}
return $keys;
}