Skip to content

Commit 937d88c

Browse files
committed
CSHARP-3310: Add CompatibilityLevel to ExpressionTranslationOptions.
1 parent e31d67a commit 937d88c

File tree

78 files changed

+1414
-1463
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+1414
-1463
lines changed

src/MongoDB.Driver/AggregateExpressionDefinition.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,22 @@ public sealed class ExpressionAggregateExpressionDefinition<TSource, TResult> :
116116
// private fields
117117
private readonly TranslationContextData _contextData;
118118
private readonly Expression<Func<TSource, TResult>> _expression;
119-
private readonly ExpressionTranslationOptions _translationOptions;
120119

121120
// constructors
122121
/// <summary>
123122
/// Initializes a new instance of the <see cref="ExpressionAggregateExpressionDefinition{TSource, TResult}" /> class.
124123
/// </summary>
125124
/// <param name="expression">The expression.</param>
126-
/// <param name="translationOptions">The translation options.</param>
127-
public ExpressionAggregateExpressionDefinition(Expression<Func<TSource, TResult>> expression, ExpressionTranslationOptions translationOptions)
128-
: this(expression, translationOptions, null)
125+
public ExpressionAggregateExpressionDefinition(Expression<Func<TSource, TResult>> expression)
126+
: this(expression, null)
129127
{
130128
}
131129

132130
internal ExpressionAggregateExpressionDefinition(
133131
Expression<Func<TSource, TResult>> expression,
134-
ExpressionTranslationOptions translationOptions,
135132
TranslationContextData contextData)
136133
{
137134
_expression = Ensure.IsNotNull(expression, nameof(expression));
138-
_translationOptions = translationOptions; // can be null
139135
_contextData = contextData; // can be null
140136
}
141137

@@ -144,7 +140,7 @@ internal ExpressionAggregateExpressionDefinition(
144140
public override BsonValue Render(RenderArgs<TSource> args)
145141
{
146142
var contextData = _contextData?.With("SerializerRegistry", args.SerializerRegistry);
147-
return LinqProviderAdapter.TranslateExpressionToAggregateExpression(_expression, args.DocumentSerializer, args.SerializerRegistry, _translationOptions, contextData);
143+
return LinqProviderAdapter.TranslateExpressionToAggregateExpression(_expression, args.DocumentSerializer, args.SerializerRegistry, args.TranslationOptions, contextData);
148144
}
149145
}
150146

src/MongoDB.Driver/AggregateStringTranslationMode.cs

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

src/MongoDB.Driver/ChangeStreamHelper.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
using MongoDB.Bson.Serialization.Serializers;
1919
using MongoDB.Driver.Core.Operations;
2020
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
21-
using MongoDB.Driver.Linq;
2221

2322
namespace MongoDB.Driver
2423
{
@@ -30,9 +29,10 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
3029
ChangeStreamOptions options,
3130
ReadConcern readConcern,
3231
MessageEncoderSettings messageEncoderSettings,
33-
bool retryRequested)
32+
bool retryRequested,
33+
ExpressionTranslationOptions translationOptions)
3434
{
35-
var renderedPipeline = RenderPipeline(pipeline, BsonDocumentSerializer.Instance);
35+
var renderedPipeline = RenderPipeline(pipeline, BsonDocumentSerializer.Instance, translationOptions);
3636

3737
var operation = new ChangeStreamOperation<TResult>(
3838
renderedPipeline.Documents,
@@ -52,9 +52,10 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
5252
ChangeStreamOptions options,
5353
ReadConcern readConcern,
5454
MessageEncoderSettings messageEncoderSettings,
55-
bool retryRequested)
55+
bool retryRequested,
56+
ExpressionTranslationOptions translationOptions)
5657
{
57-
var renderedPipeline = RenderPipeline(pipeline, BsonDocumentSerializer.Instance);
58+
var renderedPipeline = RenderPipeline(pipeline, BsonDocumentSerializer.Instance, translationOptions);
5859

5960
var operation = new ChangeStreamOperation<TResult>(
6061
database.DatabaseNamespace,
@@ -76,9 +77,10 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
7677
ChangeStreamOptions options,
7778
ReadConcern readConcern,
7879
MessageEncoderSettings messageEncoderSettings,
79-
bool retryRequested)
80+
bool retryRequested,
81+
ExpressionTranslationOptions translationOptions)
8082
{
81-
var renderedPipeline = RenderPipeline(pipeline, documentSerializer);
83+
var renderedPipeline = RenderPipeline(pipeline, documentSerializer, translationOptions);
8284

8385
var operation = new ChangeStreamOperation<TResult>(
8486
collection.CollectionNamespace,
@@ -96,11 +98,12 @@ public static ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult
9698
// private static methods
9799
private static RenderedPipelineDefinition<TResult> RenderPipeline<TResult, TDocument>(
98100
PipelineDefinition<ChangeStreamDocument<TDocument>, TResult> pipeline,
99-
IBsonSerializer<TDocument> documentSerializer)
101+
IBsonSerializer<TDocument> documentSerializer,
102+
ExpressionTranslationOptions translationOptions)
100103
{
101104
var changeStreamDocumentSerializer = new ChangeStreamDocumentSerializer<TDocument>(documentSerializer);
102105
var serializerRegistry = BsonSerializer.SerializerRegistry;
103-
return pipeline.Render(new(changeStreamDocumentSerializer, serializerRegistry));
106+
return pipeline.Render(new(changeStreamDocumentSerializer, serializerRegistry, translationOptions: translationOptions));
104107
}
105108

106109
private static void SetOperationOptions<TResult>(

src/MongoDB.Driver/ClusteredIndexOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ public bool Unique
6464
set => _unique = value;
6565
}
6666

67-
internal BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
67+
internal BsonDocument Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
6868
{
6969
return new BsonDocument {
70-
{ "key", _key.Render(new(documentSerializer, serializerRegistry)) },
70+
{ "key", _key.Render(new(documentSerializer, serializerRegistry, translationOptions: translationOptions)) },
7171
{ "unique", _unique },
7272
{ "name", _name, _name != null }
7373
};

src/MongoDB.Driver/Core/Misc/SemanticVersion.cs

Lines changed: 85 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2013-present MongoDB Inc.
1+
/* Copyright 2010-present MongoDB Inc.
22
*
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@
1414
*/
1515

1616
using System;
17+
using System.Text;
1718
using System.Text.RegularExpressions;
1819

1920
namespace MongoDB.Driver.Core.Misc
@@ -39,9 +40,33 @@ private static void LookForPreReleaseNumericSuffix(string preRelease, out string
3940
preReleaseNumericSuffix = null;
4041
}
4142
}
43+
44+
private static bool TryParseInternalPreRelease(string preReleaseIn, out string preReleaseOut, out int? commitsAfterRelease, out string commitHash)
45+
{
46+
if (preReleaseIn != null)
47+
{
48+
var internalBuildPattern = @"^((?<preRelease>.+)-)?(?<commitsAfterRelease>\d+)-g(?<commitHash>[0-9a-fA-F]{4,40})$";
49+
var match = Regex.Match(preReleaseIn, internalBuildPattern);
50+
if (match.Success)
51+
{
52+
var preReleaseGroup = match.Groups["preRelease"];
53+
preReleaseOut = preReleaseGroup.Success ? preReleaseGroup.Value : null;
54+
commitsAfterRelease = int.Parse(match.Groups["commitsAfterRelease"].Value);
55+
commitHash = match.Groups["commitHash"].Value;
56+
return true;
57+
}
58+
}
59+
60+
preReleaseOut = preReleaseIn;
61+
commitsAfterRelease = null;
62+
commitHash = null;
63+
return false;
64+
}
4265
#endregion
4366

4467
// fields
68+
private readonly string _commitHash;
69+
private readonly int? _commitsAfterRelease;
4570
private readonly int _major;
4671
private readonly int _minor;
4772
private readonly int _patch;
@@ -73,7 +98,19 @@ public SemanticVersion(int major, int minor, int patch, string preRelease)
7398
_major = Ensure.IsGreaterThanOrEqualToZero(major, nameof(major));
7499
_minor = Ensure.IsGreaterThanOrEqualToZero(minor, nameof(minor));
75100
_patch = Ensure.IsGreaterThanOrEqualToZero(patch, nameof(patch));
76-
_preRelease = preRelease; // can be null
101+
102+
if (TryParseInternalPreRelease(preRelease, out var preReleaseOut, out var commitsAfterRelease, out var commitHash))
103+
{
104+
_preRelease = preReleaseOut; // can be null
105+
_commitsAfterRelease = commitsAfterRelease;
106+
_commitHash = commitHash;
107+
}
108+
else
109+
{
110+
_preRelease = preRelease; // can be null
111+
_commitsAfterRelease = null;
112+
_commitHash = null;
113+
}
77114

78115
if (_preRelease != null)
79116
{
@@ -82,6 +119,22 @@ public SemanticVersion(int major, int minor, int patch, string preRelease)
82119
}
83120

84121
// properties
122+
/// <summary>
123+
/// Gets the internal build commit hash.
124+
/// </summary>
125+
public string CommitHash
126+
{
127+
get { return _commitHash; }
128+
}
129+
130+
/// <summary>
131+
/// Gets the number of commits after release.
132+
/// </summary>
133+
public int? CommitsAfterRelease
134+
{
135+
get { return _commitsAfterRelease; }
136+
}
137+
85138
/// <summary>
86139
/// Gets the major version.
87140
/// </summary>
@@ -153,17 +206,19 @@ public int CompareTo(SemanticVersion other)
153206
return result;
154207
}
155208

156-
if (IsInternalServerBuild() || other.IsInternalServerBuild())
209+
result = ComparePreReleases();
210+
if (result != 0)
157211
{
158-
return this.AsServerVersion().CompareTo(other.AsServerVersion());
212+
return result;
159213
}
160214

161-
result = ComparePreReleases();
215+
result = CompareCommitsAfterRelease();
162216
if (result != 0)
163217
{
164218
return result;
165219
}
166220

221+
// ignore _commitHash for comparison purposes
167222
return 0;
168223

169224
int ComparePreReleases()
@@ -202,6 +257,24 @@ int ComparePreReleases()
202257

203258
return _preReleaseNumericSuffix.Value.CompareTo(other._preReleaseNumericSuffix.Value);
204259
}
260+
261+
int CompareCommitsAfterRelease()
262+
{
263+
if (_commitsAfterRelease == null && other._commitsAfterRelease == null)
264+
{
265+
return 0;
266+
}
267+
else if (_commitsAfterRelease == null)
268+
{
269+
return -1;
270+
}
271+
else if (other._commitsAfterRelease == null)
272+
{
273+
return 1;
274+
}
275+
276+
return _commitsAfterRelease.Value.CompareTo(other._commitsAfterRelease.Value);
277+
}
205278
}
206279

207280
/// <inheritdoc/>
@@ -225,14 +298,17 @@ public override int GetHashCode()
225298
/// <inheritdoc/>
226299
public override string ToString()
227300
{
228-
if (_preRelease == null)
301+
var sb = new StringBuilder($"{_major}.{_minor}.{_patch}");
302+
if (_preRelease != null)
229303
{
230-
return string.Format("{0}.{1}.{2}", _major, _minor, _patch);
304+
sb.Append($"-{_preRelease}");
231305
}
232-
else
306+
if (_commitsAfterRelease != null)
233307
{
234-
return string.Format("{0}.{1}.{2}-{3}", _major, _minor, _patch, _preRelease);
308+
sb.Append($"-{_commitsAfterRelease}-g{_commitHash}");
235309
}
310+
311+
return sb.ToString();
236312
}
237313

238314
/// <summary>
@@ -365,22 +441,5 @@ public static bool TryParse(string value, out SemanticVersion result)
365441
{
366442
return !(b < a);
367443
}
368-
369-
// private methods
370-
private ServerVersion AsServerVersion()
371-
{
372-
return new ServerVersion(_major, _minor, _patch, _preRelease);
373-
}
374-
375-
private bool IsInternalServerBuild()
376-
{
377-
if (_preRelease != null)
378-
{
379-
var internalBuildPattern = @"^(.+-)?\d+-g[0-9a-fA-F]{4,40}$";
380-
return Regex.IsMatch(_preRelease, internalBuildPattern);
381-
}
382-
383-
return false;
384-
}
385444
}
386445
}

0 commit comments

Comments
 (0)