Skip to content

Commit 764a524

Browse files
committed
pr
1 parent 7833e67 commit 764a524

File tree

10 files changed

+40
-76
lines changed

10 files changed

+40
-76
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Ast/Expressions/AstCreateObjectIdExpression.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,22 @@
1616
using MongoDB.Bson;
1717
using MongoDB.Driver.Linq.Linq3Implementation.Ast.Visitors;
1818

19-
namespace MongoDB.Driver.Linq.Linq3Implementation.Ast.Expressions
19+
namespace MongoDB.Driver.Linq.Linq3Implementation.Ast.Expressions;
20+
21+
internal sealed class AstCreateObjectIdExpression : AstExpression
2022
{
21-
internal sealed class AstCreateObjectIdExpression : AstExpression
22-
{
23-
public override AstNodeType NodeType => AstNodeType.CreateObjectIdExpression;
23+
public override AstNodeType NodeType => AstNodeType.CreateObjectIdExpression;
2424

25-
public override AstNode Accept(AstNodeVisitor visitor)
26-
{
27-
return visitor.VisitCreateObjectIdExpression(this);
28-
}
25+
public override AstNode Accept(AstNodeVisitor visitor)
26+
{
27+
return visitor.VisitCreateObjectIdExpression(this);
28+
}
2929

30-
public override BsonValue Render()
30+
public override BsonValue Render()
31+
{
32+
return new BsonDocument
3133
{
32-
return new BsonDocument
33-
{
34-
{ "$createObjectId", new BsonDocument() }
35-
};
36-
}
34+
{ "$createObjectId", new BsonDocument() }
35+
};
3736
}
3837
}

src/MongoDB.Driver/Linq/Linq3Implementation/Misc/PartialEvaluator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,7 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
325325

326326
var method = node.Method;
327327
if (IsCustomLinqExtensionMethod(method) ||
328-
method.Is(QueryableMethod.AsQueryable) ||
329-
method.Is(ObjectIdMethod.GenerateNewIdMethod))
328+
method.Is(QueryableMethod.AsQueryable))
330329
{
331330
_cannotBeEvaluated = true;
332331
}

src/MongoDB.Driver/Linq/Linq3Implementation/Reflection/MqlMethod.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ internal static class MqlMethod
2727
private static readonly MethodInfo __constantWithRepresentation;
2828
private static readonly MethodInfo __constantWithSerializer;
2929
private static readonly MethodInfo __convert;
30+
private static readonly MethodInfo __createObjectId;
3031
private static readonly MethodInfo __dateFromString;
3132
private static readonly MethodInfo __dateFromStringWithFormat;
3233
private static readonly MethodInfo __dateFromStringWithFormatAndTimezone;
@@ -51,6 +52,7 @@ static MqlMethod()
5152
__constantWithRepresentation = ReflectionInfo.Method((object value, BsonType representation) => Mql.Constant(value, representation));
5253
__constantWithSerializer = ReflectionInfo.Method((object value, IBsonSerializer<object> serializer) => Mql.Constant(value, serializer));
5354
__convert = ReflectionInfo.Method((object value, ConvertOptions<object> options) => Mql.Convert(value, options));
55+
__createObjectId = ReflectionInfo.Method(() => Mql.CreateObjectId());
5456
__dateFromString = ReflectionInfo.Method((string dateStringl) => Mql.DateFromString(dateStringl));
5557
__dateFromStringWithFormat = ReflectionInfo.Method((string dateString, string format) => Mql.DateFromString(dateString, format));
5658
__dateFromStringWithFormatAndTimezone = ReflectionInfo.Method((string dateString, string format, string timezone) => Mql.DateFromString(dateString, format, timezone));
@@ -106,6 +108,7 @@ static MqlMethod()
106108
public static MethodInfo ConstantWithRepresentation => __constantWithRepresentation;
107109
public static MethodInfo ConstantWithSerializer => __constantWithSerializer;
108110
public static MethodInfo Convert => __convert;
111+
public static MethodInfo CreateObjectId => __createObjectId;
109112
public static MethodInfo DateFromString => __dateFromString;
110113
public static MethodInfo DateFromStringWithFormat => __dateFromStringWithFormat;
111114
public static MethodInfo DateFromStringWithFormatAndTimezone => __dateFromStringWithFormatAndTimezone;

src/MongoDB.Driver/Linq/Linq3Implementation/Reflection/ObjectIdMethod.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/MongoDB.Driver/Linq/Linq3Implementation/SerializerFinders/SerializerFinderVisitMethodCall.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ void DeduceMethodCallSerializers()
100100
case "ContainsValue": DeduceContainsValueMethodSerializers(); break;
101101
case "Convert": DeduceConvertMethodSerializers(); break;
102102
case "Create": DeduceCreateMethodSerializers(); break;
103+
case "CreateObjectId": DeduceCreateObjectIdMethodSerializers(); break;
103104
case "DateFromString": DeduceDateFromStringMethodSerializers(); break;
104105
case "DefaultIfEmpty": DeduceDefaultIfEmptyMethodSerializers(); break;
105106
case "DegreesToRadians": DeduceDegreesToRadiansMethodSerializers(); break;
@@ -113,7 +114,6 @@ void DeduceMethodCallSerializers()
113114
case "Exp": DeduceExpMethodSerializers(); break;
114115
case "ExponentialMovingAverage": DeduceExponentialMovingAverageMethodSerializers(); break;
115116
case "Field": DeduceFieldMethodSerializers(); break;
116-
case "GenerateNewId": DeduceGenerateNewIdMethodSerializers(); break;
117117
case "get_Item": DeduceGetItemMethodSerializers(); break;
118118
case "get_Chars": DeduceGetCharsMethodSerializers(); break;
119119
case "GroupBy": DeduceGroupByMethodSerializers(); break;
@@ -1370,9 +1370,9 @@ void DeduceFieldMethodSerializers()
13701370
}
13711371
}
13721372

1373-
void DeduceGenerateNewIdMethodSerializers()
1373+
void DeduceCreateObjectIdMethodSerializers()
13741374
{
1375-
if (method.Is(ObjectIdMethod.GenerateNewIdMethod))
1375+
if (method.Is(MqlMethod.CreateObjectId))
13761376
{
13771377
if (IsNotKnown(node))
13781378
{

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodCallExpressionToAggregationExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public static TranslatedExpression Translate(TranslationContext context, MethodC
4242
case "CovariancePopulation": return CovariancePopulationMethodToAggregationExpressionTranslator.Translate(context, expression);
4343
case "CovarianceSample": return CovarianceSampleMethodToAggregationExpressionTranslator.Translate(context, expression);
4444
case "Create": return CreateMethodToAggregationExpressionTranslator.Translate(context, expression);
45+
case "CreateObjectId": return CreateObjectIdMethodToAggregationExpressionTranslator.Translate(context, expression);
4546
case "DateFromString": return DateFromStringMethodToAggregationExpressionTranslator.Translate(context, expression);
4647
case "DefaultIfEmpty": return DefaultIfEmptyMethodToAggregationExpressionTranslator.Translate(context, expression);
4748
case "DenseRank": return DenseRankMethodToAggregationExpressionTranslator.Translate(context, expression);
@@ -55,7 +56,6 @@ public static TranslatedExpression Translate(TranslationContext context, MethodC
5556
case "ExponentialMovingAverage": return ExponentialMovingAverageMethodToAggregationExpressionTranslator.Translate(context, expression);
5657
case "Field": return FieldMethodToAggregationExpressionTranslator.Translate(context, expression);
5758
case "Floor": return FloorMethodToAggregationExpressionTranslator.Translate(context, expression);
58-
case "GenerateNewId": return GenerateNewIdMethodToAggregationExpressionTranslator.Translate(context, expression);
5959
case "get_Item": return GetItemMethodToAggregationExpressionTranslator.Translate(context, expression);
6060
case "Integral": return IntegralMethodToAggregationExpressionTranslator.Translate(context, expression);
6161
case "Intersect": return IntersectMethodToAggregationExpressionTranslator.Translate(context, expression);

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/GenerateNewIdMethodToAggregationExpressionTranslator.cs renamed to src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/CreateObjectIdMethodToAggregationExpressionTranslator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020

2121
namespace MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MethodTranslators
2222
{
23-
internal static class GenerateNewIdMethodToAggregationExpressionTranslator
23+
internal static class CreateObjectIdMethodToAggregationExpressionTranslator
2424
{
2525
public static TranslatedExpression Translate(TranslationContext context, MethodCallExpression expression)
2626
{
2727
var method = expression.Method;
2828

29-
if (method.Is(ObjectIdMethod.GenerateNewIdMethod))
29+
if (method.Is(MqlMethod.CreateObjectId))
3030
{
3131
var ast = AstExpression.CreateObjectId();
3232
var serializer = context.GetSerializer(expression);

src/MongoDB.Driver/Mql.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ public static TTo Convert<TFrom, TTo>(TFrom value, ConvertOptions<TTo> options)
6464
throw CustomLinqExtensionMethodHelper.CreateNotSupportedException();
6565
}
6666

67+
/// <summary>
68+
/// Represents the creation of a new ObjectId, translates to $createObjectId in MQL.
69+
/// </summary>
70+
/// <returns>A ObjectId.</returns>
71+
public static ObjectId CreateObjectId() =>
72+
throw CustomLinqExtensionMethodHelper.CreateNotSupportedException();
73+
6774
/// <summary>
6875
/// Converts a string to a DateTime using the $dateFromString aggregation operator.
6976
/// </summary>

tests/MongoDB.Driver.Tests/Linq/Integration/ObjectIdGenerateNewIdTests.cs renamed to tests/MongoDB.Driver.Tests/Linq/Integration/MqlCreateObjectIdTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424

2525
namespace MongoDB.Driver.Tests.Linq.Integration;
2626

27-
public class ObjectIdGenerateNewIdTests : LinqIntegrationTest<ObjectIdGenerateNewIdTests.ClassFixture>
27+
public class MqlCreateObjectIdTests : LinqIntegrationTest<MqlCreateObjectIdTests.ClassFixture>
2828
{
29-
public ObjectIdGenerateNewIdTests(ClassFixture fixture)
29+
public MqlCreateObjectIdTests(ClassFixture fixture)
3030
: base(fixture, server => server.Supports(Feature.CreateObjectIdExpression))
3131
{
3232
}
@@ -36,7 +36,7 @@ public void ObjectIdGenerateNewId_in_where()
3636
{
3737
var collection = Fixture.Collection;
3838
var queryable = collection.AsQueryable()
39-
.Where(d => d.Id == ObjectId.GenerateNewId());
39+
.Where(d => d.Id == Mql.CreateObjectId());
4040

4141
var renderedStages = Translate(collection, queryable);
4242
AssertStages(renderedStages, "{ $match : { $expr : { $eq : ['$_id', { $createObjectId : {} }] } } }");
@@ -50,7 +50,7 @@ public void ObjectIdGenerateNewId_in_select()
5050
{
5151
var collection = Fixture.Collection;
5252
var queryable = collection.AsQueryable()
53-
.Select(d => new { NewId = ObjectId.GenerateNewId() });
53+
.Select(d => new { NewId = Mql.CreateObjectId() });
5454

5555
var renderedStages = Translate(collection, queryable);
5656
AssertStages(renderedStages, "{ $project : { 'NewId' : { $createObjectId : {} }, '_id' : 0 } }");
@@ -69,7 +69,7 @@ public async Task ObjectIdGenerateNewId_in_filter_builder()
6969
{
7070
var collection = Fixture.Collection;
7171

72-
var filter = Builders<C>.Filter.Where(d => d.Id == ObjectId.GenerateNewId());
72+
var filter = Builders<C>.Filter.Where(d => d.Id == Mql.CreateObjectId());
7373
var result = await collection.Find(filter).ToListAsync();
7474

7575
var renderedFilter = Translate(collection, filter);
@@ -82,7 +82,7 @@ public async Task ObjectIdGenerateNewId_in_projection_builder()
8282
{
8383
var collection = Fixture.Collection;
8484

85-
var projection = Builders<C>.Projection.Expression(c => new { NewId = ObjectId.GenerateNewId() });
85+
var projection = Builders<C>.Projection.Expression(c => new { NewId = Mql.CreateObjectId() });
8686
var result = await collection.Find(Builders<C>.Filter.Empty).Project(projection).ToListAsync();
8787

8888
var renderedProjection = TranslateFindProjection(collection, projection, null);
@@ -103,7 +103,7 @@ public async Task ObjectIdGenerateNewId_in_aggregate()
103103

104104
var pipeline = new EmptyPipelineDefinition<C>()
105105
.Match(d => d.Id != ObjectId.GenerateNewId())
106-
.Project(d => new { NewId = ObjectId.GenerateNewId() });
106+
.Project(d => new { NewId = Mql.CreateObjectId() });
107107

108108
var result = await collection.Aggregate(pipeline).ToListAsync();
109109

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/GenerateNewIdMethodToAggregationExpressionTranslatorTests.cs renamed to tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/MethodTranslators/CreateObjectIdMethodToAggregationExpressionTranslatorTests.cs

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,28 @@
1313
* limitations under the License.
1414
*/
1515

16-
using System;
17-
using System.Collections.Generic;
1816
using System.Linq.Expressions;
1917
using FluentAssertions;
2018
using MongoDB.Bson;
2119
using MongoDB.Bson.Serialization.Serializers;
22-
using MongoDB.Driver.Linq;
2320
using MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MethodTranslators;
2421
using Xunit;
2522

2623
namespace MongoDB.Driver.Tests.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators.MethodTranslators;
2724

28-
public class GenerateNewIdMethodToAggregationExpressionTranslatorTests
25+
public class CreateObjectIdMethodToAggregationExpressionTranslatorTests
2926
{
3027
[Fact]
3128
public void Translate_should_produce_proper_ast()
3229
{
33-
var expression = TestHelpers.MakeLambda<MyModel, ObjectId>(model => ObjectId.GenerateNewId());
30+
var expression = TestHelpers.MakeLambda<MyModel, ObjectId>(model => Mql.CreateObjectId());
3431
var translationContext = TestHelpers.CreateTranslationContext(expression);
35-
var translation = GenerateNewIdMethodToAggregationExpressionTranslator.Translate(translationContext, (MethodCallExpression)expression.Body);
32+
var translation = CreateObjectIdMethodToAggregationExpressionTranslator.Translate(translationContext, (MethodCallExpression)expression.Body);
3633

3734
translation.Serializer.Should().BeOfType<ObjectIdSerializer>();
3835
translation.Ast.Render().Should().Be(BsonDocument.Parse("{ $createObjectId: { } }"));
3936
}
4037

41-
[Theory]
42-
[MemberData(nameof(NonSupportedTestCases))]
43-
public void Translate_should_throw_on_non_supported_expressions(LambdaExpression expression)
44-
{
45-
var translationContext = TestHelpers.CreateTranslationContext(expression);
46-
var exception = Record.Exception(() => GenerateNewIdMethodToAggregationExpressionTranslator.Translate(translationContext, (MethodCallExpression)expression.Body));
47-
48-
exception.Should().BeOfType<ExpressionNotSupportedException>();
49-
}
50-
51-
public static IEnumerable<object[]> NonSupportedTestCases =
52-
[
53-
[TestHelpers.MakeLambda<MyModel, ObjectId>(model => ObjectId.GenerateNewId(42))],
54-
[TestHelpers.MakeLambda<MyModel, ObjectId>(model => ObjectId.GenerateNewId(DateTime.Parse("2026-01-01T00:00:00Z")))],
55-
];
56-
5738
public class MyModel
5839
{
5940
}

0 commit comments

Comments
 (0)