Skip to content

Commit a83a6bb

Browse files
committed
CSHARP-4191: Support use of BsonValue.AsString in filters (and all other AsXyz properties also).
1 parent 20a640b commit a83a6bb

File tree

12 files changed

+646
-15
lines changed

12 files changed

+646
-15
lines changed

src/MongoDB.Bson/Serialization/Serializers/BooleanSerializer.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414
*/
1515

1616
using System;
17-
using System.IO;
1817
using MongoDB.Bson.IO;
19-
using MongoDB.Bson.Serialization.Attributes;
20-
using MongoDB.Bson.Serialization.Options;
2118

2219
namespace MongoDB.Bson.Serialization.Serializers
2320
{
@@ -26,6 +23,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2623
/// </summary>
2724
public class BooleanSerializer : StructSerializerBase<bool>, IRepresentationConfigurable<BooleanSerializer>
2825
{
26+
#region static
27+
private static readonly BooleanSerializer __instance = new BooleanSerializer();
28+
29+
/// <summary>
30+
/// Gets a cached instance of a BooleanSerializer.
31+
/// </summary>
32+
public static BooleanSerializer Instance => __instance;
33+
#endregion
34+
2935
// private fields
3036
private readonly BsonType _representation;
3137

src/MongoDB.Bson/Serialization/Serializers/ByteArraySerializer.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
using System;
1717
using System.Globalization;
18-
using System.Text;
1918

2019
namespace MongoDB.Bson.Serialization.Serializers
2120
{
@@ -24,6 +23,16 @@ namespace MongoDB.Bson.Serialization.Serializers
2423
/// </summary>
2524
public class ByteArraySerializer : SealedClassSerializerBase<byte[]>, IRepresentationConfigurable<ByteArraySerializer>
2625
{
26+
#region static
27+
private static readonly ByteArraySerializer __instance = new ByteArraySerializer();
28+
29+
// public static properties
30+
/// <summary>
31+
/// Gets a cached instance of a ByteArraySerializer.
32+
/// </summary>
33+
public static ByteArraySerializer Instance => __instance;
34+
#endregion
35+
2736
// private fields
2837
private readonly BsonType _representation;
2938

src/MongoDB.Bson/Serialization/Serializers/Decimal128Serializer.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2424
/// </summary>
2525
public class Decimal128Serializer : StructSerializerBase<Decimal128>, IRepresentationConfigurable<Decimal128Serializer>, IRepresentationConverterConfigurable<Decimal128Serializer>
2626
{
27+
#region static
28+
private static readonly Decimal128Serializer __decimal128Instance = new Decimal128Serializer(BsonType.Decimal128);
29+
30+
/// <summary>
31+
/// Gets a cached instance of a Decimal128Serializer with Decimal128 representation.
32+
/// </summary>
33+
public static Decimal128Serializer Decimal128Instance => __decimal128Instance;
34+
#endregion
35+
2736
// private fields
2837
private readonly BsonType _representation;
2938
private readonly RepresentationConverter _converter;

src/MongoDB.Bson/Serialization/Serializers/DecimalSerializer.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2424
/// </summary>
2525
public class DecimalSerializer : StructSerializerBase<decimal>, IRepresentationConfigurable<DecimalSerializer>, IRepresentationConverterConfigurable<DecimalSerializer>
2626
{
27+
#region static
28+
private static readonly DecimalSerializer __decimal128Instance = new DecimalSerializer(BsonType.Decimal128);
29+
30+
/// <summary>
31+
/// Gets a cached instance of a DecimalSerializer with Decimal128 representation.
32+
/// </summary>
33+
public static DecimalSerializer Decimal128Instance => __decimal128Instance;
34+
#endregion
35+
2736
// private fields
2837
private readonly BsonType _representation;
2938
private readonly RepresentationConverter _converter;

src/MongoDB.Bson/Serialization/Serializers/DoubleSerializer.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414
*/
1515

1616
using System;
17-
using System.Globalization;
18-
using System.IO;
1917
using MongoDB.Bson.IO;
20-
using MongoDB.Bson.Serialization.Attributes;
2118
using MongoDB.Bson.Serialization.Options;
2219

2320
namespace MongoDB.Bson.Serialization.Serializers
@@ -27,6 +24,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2724
/// </summary>
2825
public class DoubleSerializer : StructSerializerBase<double>, IRepresentationConfigurable<DoubleSerializer>, IRepresentationConverterConfigurable<DoubleSerializer>
2926
{
27+
#region static
28+
private static readonly DoubleSerializer __instance = new DoubleSerializer();
29+
30+
/// <summary>
31+
/// Gets a cached instance of DoubleSerializer;
32+
/// </summary>
33+
public static DoubleSerializer Instance => __instance;
34+
#endregion
35+
3036
// private fields
3137
private readonly BsonType _representation;
3238
private readonly RepresentationConverter _converter;

src/MongoDB.Bson/Serialization/Serializers/GuidSerializer.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2323
/// </summary>
2424
public class GuidSerializer : StructSerializerBase<Guid>, IRepresentationConfigurable<GuidSerializer>
2525
{
26+
#region static
27+
private static readonly GuidSerializer __standardInstance = new GuidSerializer(GuidRepresentation.Standard);
28+
29+
/// <summary>
30+
/// Gets a cached instance of a GuidSerializer with Standard representation.
31+
/// </summary>
32+
public static GuidSerializer StandardInstance => __standardInstance;
33+
#endregion
34+
2635
// private fields
2736
private readonly GuidRepresentation _guidRepresentation; // only relevant if _representation is Binary
2837
private readonly BsonType _representation;

src/MongoDB.Bson/Serialization/Serializers/Int32Serializer.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
*/
1515

1616
using System;
17-
using System.IO;
1817
using MongoDB.Bson.IO;
19-
using MongoDB.Bson.Serialization.Attributes;
2018
using MongoDB.Bson.Serialization.Options;
2119

2220
namespace MongoDB.Bson.Serialization.Serializers
@@ -26,6 +24,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2624
/// </summary>
2725
public class Int32Serializer : StructSerializerBase<int>, IRepresentationConfigurable<Int32Serializer>, IRepresentationConverterConfigurable<Int32Serializer>
2826
{
27+
#region static
28+
private static readonly Int32Serializer __instance = new Int32Serializer();
29+
30+
/// <summary>
31+
/// Gets a cached instance of an Int32Serializer;
32+
/// </summary>
33+
public static Int32Serializer Instance => __instance;
34+
#endregion
35+
2936
// private fields
3037
private readonly BsonType _representation;
3138
private readonly RepresentationConverter _converter;

src/MongoDB.Bson/Serialization/Serializers/Int64Serializer.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
*/
1515

1616
using System;
17-
using System.IO;
1817
using MongoDB.Bson.IO;
19-
using MongoDB.Bson.Serialization.Attributes;
2018
using MongoDB.Bson.Serialization.Options;
2119

2220
namespace MongoDB.Bson.Serialization.Serializers
@@ -26,6 +24,15 @@ namespace MongoDB.Bson.Serialization.Serializers
2624
/// </summary>
2725
public class Int64Serializer : StructSerializerBase<long>, IRepresentationConfigurable<Int64Serializer>, IRepresentationConverterConfigurable<Int64Serializer>
2826
{
27+
#region static
28+
private static readonly Int64Serializer __instance = new Int64Serializer();
29+
30+
/// <summary>
31+
/// Gets a cached instance of an Int64Serializer;
32+
/// </summary>
33+
public static Int64Serializer Instance => __instance;
34+
#endregion
35+
2936
// private fields
3037
private readonly BsonType _representation;
3138
private readonly RepresentationConverter _converter;

src/MongoDB.Bson/Serialization/Serializers/ObjectIdSerializer.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
*/
1515

1616
using System;
17-
using System.IO;
18-
using MongoDB.Bson.IO;
19-
using MongoDB.Bson.Serialization.Attributes;
20-
using MongoDB.Bson.Serialization.Options;
2117

2218
namespace MongoDB.Bson.Serialization.Serializers
2319
{
@@ -26,6 +22,16 @@ namespace MongoDB.Bson.Serialization.Serializers
2622
/// </summary>
2723
public class ObjectIdSerializer : StructSerializerBase<ObjectId>, IRepresentationConfigurable<ObjectIdSerializer>
2824
{
25+
#region static
26+
private static readonly ObjectIdSerializer __instance = new ObjectIdSerializer();
27+
28+
// public static properties
29+
/// <summary>
30+
/// Gets a cached instance of an ObjectId serializer.
31+
/// </summary>
32+
public static ObjectIdSerializer Instance => __instance;
33+
#endregion
34+
2935
// private fields
3036
private readonly BsonType _representation;
3137

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using System.Text.RegularExpressions;
18+
19+
namespace MongoDB.Bson.Serialization.Serializers
20+
{
21+
/// <summary>
22+
/// Represents a serializer for Regex.
23+
/// </summary>
24+
public class RegexSerializer : SealedClassSerializerBase<Regex>, IRepresentationConfigurable<RegexSerializer>
25+
{
26+
#region static
27+
private static readonly RegexSerializer __regularExpressionInstance = new RegexSerializer(BsonType.RegularExpression);
28+
29+
/// <summary>
30+
/// Gets a cached instance of a RegexSerializer with RegularExpression representation.
31+
/// </summary>
32+
public static RegexSerializer RegularExpressionInstance => __regularExpressionInstance;
33+
#endregion
34+
35+
// private fields
36+
private readonly BsonType _representation;
37+
38+
// constructors
39+
/// <summary>
40+
/// Initializes a new instance of the <see cref="RegexSerializer"/> class.
41+
/// </summary>
42+
public RegexSerializer()
43+
: this(BsonType.RegularExpression)
44+
{
45+
}
46+
47+
/// <summary>
48+
/// Initializes a new instance of the <see cref="RegexSerializer"/> class.
49+
/// </summary>
50+
/// <param name="representation">The representation.</param>
51+
public RegexSerializer(BsonType representation)
52+
{
53+
switch (representation)
54+
{
55+
case BsonType.RegularExpression:
56+
case BsonType.String:
57+
break;
58+
59+
default:
60+
var message = string.Format("{0} is not a valid representation for an RegexSerializer.", representation);
61+
throw new ArgumentException(message);
62+
}
63+
64+
_representation = representation;
65+
}
66+
67+
// public properties
68+
/// <summary>
69+
/// Gets the representation.
70+
/// </summary>
71+
/// <value>
72+
/// The representation.
73+
/// </value>
74+
public BsonType Representation
75+
{
76+
get { return _representation; }
77+
}
78+
79+
// public methods
80+
/// <summary>
81+
/// Deserializes a value.
82+
/// </summary>
83+
/// <param name="context">The deserialization context.</param>
84+
/// <param name="args">The deserialization args.</param>
85+
/// <returns>A deserialized value.</returns>
86+
public override Regex Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
87+
{
88+
var reader = context.Reader;
89+
90+
var bsonType = reader.GetCurrentBsonType();
91+
switch (bsonType)
92+
{
93+
case BsonType.RegularExpression:
94+
return reader.ReadRegularExpression().ToRegex();
95+
96+
case BsonType.String:
97+
return new Regex(reader.ReadString());
98+
99+
default:
100+
throw CreateCannotDeserializeFromBsonTypeException(bsonType);
101+
}
102+
}
103+
104+
/// <summary>
105+
/// Serializes a value.
106+
/// </summary>
107+
/// <param name="context">The serialization context.</param>
108+
/// <param name="args">The serialization args.</param>
109+
/// <param name="value">The object.</param>
110+
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Regex value)
111+
{
112+
var writer = context.Writer;
113+
114+
switch (_representation)
115+
{
116+
case BsonType.RegularExpression:
117+
writer.WriteRegularExpression(new BsonRegularExpression(value));
118+
break;
119+
120+
case BsonType.String:
121+
writer.WriteString(value.ToString());
122+
break;
123+
124+
default:
125+
var message = string.Format("'{0}' is not a valid Regex representation.", _representation);
126+
throw new BsonSerializationException(message);
127+
}
128+
}
129+
130+
/// <summary>
131+
/// Returns a serializer that has been reconfigured with the specified representation.
132+
/// </summary>
133+
/// <param name="representation">The representation.</param>
134+
/// <returns>The reconfigured serializer.</returns>
135+
public RegexSerializer WithRepresentation(BsonType representation)
136+
{
137+
if (representation == _representation)
138+
{
139+
return this;
140+
}
141+
else
142+
{
143+
return new RegexSerializer(representation);
144+
}
145+
}
146+
147+
// explicit interface implementations
148+
IBsonSerializer IRepresentationConfigurable.WithRepresentation(BsonType representation)
149+
{
150+
return WithRepresentation(representation);
151+
}
152+
}
153+
}

0 commit comments

Comments
 (0)