/**
  * @param CommitId $commitId
  * @param Contract $aggregateType
  * @param string $aggregateId
  * @param int $expectedAggregateVersion
  * @param EventEnvelope[] $eventEnvelopes
  */
 public function commit(CommitId $commitId, Contract $aggregateType, $aggregateId, $expectedAggregateVersion, array $eventEnvelopes)
 {
     $aggregateVersion = $this->versionFor($aggregateType, $aggregateId);
     if ($aggregateVersion !== $expectedAggregateVersion) {
         throw new OptimisticConcurrencyFailed();
     }
     $utcCommittedTime = new \DateTimeImmutable('now');
     foreach ($eventEnvelopes as $eventEnvelope) {
         $metadata = $eventEnvelope->getMetadataType() ? json_encode($this->metadataSerializer->serialize($eventEnvelope->getMetadataType(), $eventEnvelope->getMetadata())) : null;
         $values = ['commit_id' => $commitId, 'utc_committed_time' => $utcCommittedTime->format('Y-m-d H:i:s'), 'aggregate_type' => $aggregateType->getContractName(), 'aggregate_id' => $aggregateId, 'aggregate_version' => ++$aggregateVersion, 'event_type' => $eventEnvelope->getEventType()->getContractName(), 'event_id' => $eventEnvelope->getEventId(), 'event' => json_encode($this->eventSerializer->serialize($eventEnvelope->getEventType(), $eventEnvelope->getEvent())), '`when`' => $eventEnvelope->getWhen()->format('Y-m-d H:i:s'), 'metadata_type' => $eventEnvelope->getMetadataType() ? $eventEnvelope->getMetadataType()->getContractName() : null, 'metadata' => $metadata];
         $this->connection->insert($this->tableName, $values);
     }
 }
 /**
  * @param CommitId $commitId
  * @param Contract $aggregateType
  * @param string $aggregateId
  * @param int $expectedAggregateVersion
  * @param EventEnvelope[] $eventEnvelopes
  */
 public function commit(CommitId $commitId, Contract $aggregateType, $aggregateId, $expectedAggregateVersion, array $eventEnvelopes)
 {
     $aggregateVersion = $this->versionFor($aggregateType, $aggregateId);
     if ($aggregateVersion !== $expectedAggregateVersion) {
         throw new OptimisticConcurrencyFailed();
     }
     foreach ($eventEnvelopes as $eventEnvelope) {
         $metadata = $eventEnvelope->getMetadataType() ? $this->metadataSerializer->serialize($eventEnvelope->getMetadataType(), $eventEnvelope->getMetadata()) : null;
         $record = new InMemoryPersistenceRecord();
         $record->commitId = $commitId;
         $record->utcCommittedTime = new \DateTimeImmutable('now');
         $record->aggregateType = $aggregateType;
         $record->aggregateId = $aggregateId;
         $record->aggregateVersion = ++$aggregateVersion;
         $record->eventType = $eventEnvelope->getEventType();
         $record->eventId = $eventEnvelope->getEventId();
         $record->event = $this->eventSerializer->serialize($eventEnvelope->getEventType(), $eventEnvelope->getEvent());
         $record->version = $eventEnvelope->getVersion();
         $record->when = $eventEnvelope->getWhen();
         $record->metadataType = $eventEnvelope->getMetadataType();
         $record->metadata = $metadata;
         $this->records[] = $record;
     }
 }