Skip to content

Commit a33bf09

Browse files
authored
Always use insert for time series documents (#2728)
* Always use insert for time series documents * Skip time series tests on MongoDB < 6.3
1 parent b9069c6 commit a33bf09

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

lib/Doctrine/ODM/MongoDB/UnitOfWork.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,7 @@ private function persistNew(ClassMetadata $class, object $document): void
11291129
$upsert = false;
11301130
if ($class->identifier) {
11311131
$idValue = $class->getIdentifierValue($document);
1132-
$upsert = ! $class->isEmbeddedDocument && $idValue !== null;
1132+
$upsert = ! $class->isEmbeddedDocument && ! $class->timeSeriesOptions && $idValue !== null;
11331133

11341134
if ($class->generatorType === ClassMetadata::GENERATOR_TYPE_NONE && $idValue === null) {
11351135
throw new InvalidArgumentException(sprintf(

tests/Doctrine/ODM/MongoDB/Tests/BaseTestCase.php

+5
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ protected function requireMongoDB42(string $message): void
211211
$this->requireVersion($this->getServerVersion(), '4.2.0', '<', $message);
212212
}
213213

214+
protected function requireMongoDB63(string $message): void
215+
{
216+
$this->requireVersion($this->getServerVersion(), '6.3.0', '<', $message);
217+
}
218+
214219
protected static function getUri(bool $useMultipleMongoses = true): string
215220
{
216221
$uri = getenv('DOCTRINE_MONGODB_SERVER') ?: DOCTRINE_MONGODB_SERVER;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\ODM\MongoDB\Tests\Functional;
6+
7+
use DateTime;
8+
use Doctrine\ODM\MongoDB\Tests\BaseTestCase;
9+
use Documents\TimeSeries\TimeSeriesDocument;
10+
use MongoDB\BSON\ObjectId;
11+
12+
use function iterator_to_array;
13+
14+
class TimeSeriesTest extends BaseTestCase
15+
{
16+
public function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
$this->requireMongoDB63('Time series tests require MonogDB 6.3 or newer');
21+
}
22+
23+
public function testCreateTimeSeriesCollection(): void
24+
{
25+
$this->createTimeSeriesCollection(TimeSeriesDocument::class);
26+
27+
$indexes = iterator_to_array($this->dm->getDocumentCollection(TimeSeriesDocument::class)->listIndexes());
28+
29+
$this->assertCount(1, $indexes);
30+
31+
self::assertSame(['metadata' => 1, 'time' => 1], $indexes[0]['key']);
32+
}
33+
34+
public function testCreateTimeSeriesDocumentWithoutId(): void
35+
{
36+
$this->createTimeSeriesCollection(TimeSeriesDocument::class);
37+
38+
$document = new TimeSeriesDocument();
39+
$document->time = new DateTime('2025-02-05T08:53:12+00:00');
40+
$document->value = 9;
41+
$document->metadata = 'energy';
42+
43+
$this->dm->persist($document);
44+
$this->dm->flush();
45+
46+
$this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find());
47+
}
48+
49+
public function testCreateTimeSeriesDocumentWithId(): void
50+
{
51+
$this->createTimeSeriesCollection(TimeSeriesDocument::class);
52+
53+
$document = new TimeSeriesDocument();
54+
$document->id = (string) new ObjectId();
55+
$document->time = new DateTime('2025-02-05T08:53:12+00:00');
56+
$document->value = 9;
57+
$document->metadata = 'energy';
58+
59+
$this->dm->persist($document);
60+
$this->dm->flush();
61+
62+
$this->assertCount(1, $this->dm->getDocumentCollection(TimeSeriesDocument::class)->find());
63+
}
64+
65+
private function createTimeSeriesCollection(string $documentClass): void
66+
{
67+
$this->dm->getSchemaManager()->createDocumentCollection($documentClass);
68+
$this->dm->getSchemaManager()->ensureDocumentIndexes($documentClass);
69+
}
70+
}

0 commit comments

Comments
 (0)