Skip to content

Commit 76209b0

Browse files
committed
CSHARP-1194: Refactor MongoCollectionImpl OfType method to use new OfType FilterDefinitionBuilder method.
1 parent 1e576ef commit 76209b0

File tree

2 files changed

+14
-21
lines changed

2 files changed

+14
-21
lines changed

src/MongoDB.Driver/FilterDefinitionBuilder.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,17 +1598,25 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
15981598
}
15991599

16001600
var discriminatorValue = discriminatorConvention.GetDiscriminator(typeof(TDocument), typeof(TDerived));
1601-
var renderedDiscriminatorFilter = new BsonDocument(discriminatorConvention.ElementName, discriminatorValue);
1601+
if (discriminatorValue == null)
1602+
{
1603+
throw new NotSupportedException($"OfType requires that documents of type {BsonUtils.GetFriendlyTypeName(typeof(TDerived))} have a discriminator value.");
1604+
}
1605+
if (discriminatorValue.IsBsonArray)
1606+
{
1607+
discriminatorValue = discriminatorValue.AsBsonArray.Last();
1608+
}
1609+
var renderedOfTypeFilter = new BsonDocument(discriminatorConvention.ElementName, discriminatorValue);
16021610

16031611
if (_derivedDocumentFilter == null)
16041612
{
1605-
return renderedDiscriminatorFilter;
1613+
return renderedOfTypeFilter;
16061614
}
16071615

16081616
var derivedDocumentSerializer = serializerRegistry.GetSerializer<TDerived>();
16091617
var renderedDerivedDocumentFilter = _derivedDocumentFilter.Render(derivedDocumentSerializer, serializerRegistry);
16101618
var combinedFilter = Builders<TDerived>.Filter.And(
1611-
new BsonDocumentFilterDefinition<TDerived>(renderedDiscriminatorFilter),
1619+
new BsonDocumentFilterDefinition<TDerived>(renderedOfTypeFilter),
16121620
new BsonDocumentFilterDefinition<TDerived>(renderedDerivedDocumentFilter));
16131621
return combinedFilter.Render(derivedDocumentSerializer, serializerRegistry);
16141622
}

src/MongoDB.Driver/MongoCollectionImpl.cs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -398,24 +398,9 @@ public override IFilteredMongoCollection<TDerivedDocument> OfType<TDerivedDocume
398398
var ofTypeSerializer = new OfTypeSerializer<TDocument, TDerivedDocument>(derivedDocumentSerializer);
399399
var derivedDocumentCollection = new MongoCollectionImpl<TDerivedDocument>(_database, _collectionNamespace, _settings, _cluster, _operationExecutor, ofTypeSerializer);
400400

401-
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(TDocument));
402-
var discriminator = discriminatorConvention.GetDiscriminator(typeof(TDocument), typeof(TDerivedDocument));
403-
if (discriminator == null)
404-
{
405-
throw new NotSupportedException("OfType requires that the root document type have a discriminator.");
406-
}
407-
408-
BsonValue filterValue;
409-
if (discriminator.IsBsonArray)
410-
{
411-
filterValue = discriminator[discriminator.AsBsonArray.Count - 1];
412-
}
413-
else
414-
{
415-
filterValue = discriminator;
416-
}
417-
var filterDocument = new BsonDocument(discriminatorConvention.ElementName, filterValue);
418-
var ofTypeFilter = new BsonDocumentFilterDefinition<TDerivedDocument>(filterDocument);
401+
var rootOfTypeFilter = Builders<TDocument>.Filter.OfType<TDerivedDocument>();
402+
var renderedOfTypeFilter = rootOfTypeFilter.Render(_documentSerializer, _settings.SerializerRegistry);
403+
var ofTypeFilter = new BsonDocumentFilterDefinition<TDerivedDocument>(renderedOfTypeFilter);
419404

420405
return new OfTypeMongoCollection<TDocument, TDerivedDocument>(this, derivedDocumentCollection, ofTypeFilter);
421406
}

0 commit comments

Comments
 (0)