Skip to content

Commit

Permalink
Always use insert for time series documents (#2728)
Browse files Browse the repository at this point in the history
* Always use insert for time series documents

* Skip time series tests on MongoDB < 6.3
  • Loading branch information
alcaeus authored Feb 7, 2025
1 parent b9069c6 commit a33bf09
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Doctrine/ODM/MongoDB/UnitOfWork.php
Original file line number Diff line number Diff line change
Expand Up @@ -1129,7 +1129,7 @@ private function persistNew(ClassMetadata $class, object $document): void
$upsert = false;
if ($class->identifier) {
$idValue = $class->getIdentifierValue($document);
$upsert = ! $class->isEmbeddedDocument && $idValue !== null;
$upsert = ! $class->isEmbeddedDocument && ! $class->timeSeriesOptions && $idValue !== null;

if ($class->generatorType === ClassMetadata::GENERATOR_TYPE_NONE && $idValue === null) {
throw new InvalidArgumentException(sprintf(
Expand Down
5 changes: 5 additions & 0 deletions tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,11 @@ protected function requireMongoDB42(string $message): void
$this->requireVersion($this->getServerVersion(), '4.2.0', '<', $message);
}

protected function requireMongoDB63(string $message): void
{
$this->requireVersion($this->getServerVersion(), '6.3.0', '<', $message);
}

protected static function getUri(bool $useMultipleMongoses = true): string
{
$uri = getenv('DOCTRINE_MONGODB_SERVER') ?: DOCTRINE_MONGODB_SERVER;
Expand Down
70 changes: 70 additions & 0 deletions tests/Doctrine/ODM/MongoDB/Tests/Functional/TimeSeriesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);

namespace Doctrine\ODM\MongoDB\Tests\Functional;

use DateTime;
use Doctrine\ODM\MongoDB\Tests\BaseTestCase;
use Documents\TimeSeries\TimeSeriesDocument;
use MongoDB\BSON\ObjectId;

use function iterator_to_array;

class TimeSeriesTest extends BaseTestCase
{
public function setUp(): void
{
parent::setUp();

$this->requireMongoDB63('Time series tests require MonogDB 6.3 or newer');
}

public function testCreateTimeSeriesCollection(): void
{
$this->createTimeSeriesCollection(TimeSeriesDocument::class);

$indexes = iterator_to_array($this->dm->getDocumentCollection(TimeSeriesDocument::class)->listIndexes());

$this->assertCount(1, $indexes);

self::assertSame(['metadata' => 1, 'time' => 1], $indexes[0]['key']);
}

public function testCreateTimeSeriesDocumentWithoutId(): void
{
$this->createTimeSeriesCollection(TimeSeriesDocument::class);

$document = new TimeSeriesDocument();
$document->time = new DateTime('2025-02-05T08:53:12+00:00');
$document->value = 9;
$document->metadata = 'energy';

$this->dm->persist($document);
$this->dm->flush();

$this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find());
}

public function testCreateTimeSeriesDocumentWithId(): void
{
$this->createTimeSeriesCollection(TimeSeriesDocument::class);

$document = new TimeSeriesDocument();
$document->id = (string) new ObjectId();
$document->time = new DateTime('2025-02-05T08:53:12+00:00');
$document->value = 9;
$document->metadata = 'energy';

$this->dm->persist($document);
$this->dm->flush();

$this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find());
}

private function createTimeSeriesCollection(string $documentClass): void
{
$this->dm->getSchemaManager()->createDocumentCollection($documentClass);
$this->dm->getSchemaManager()->ensureDocumentIndexes($documentClass);
}
}

0 comments on commit a33bf09

Please sign in to comment.