Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrates MongoDb to file scoped namespaces #4972

Merged
merged 2 commits into from
Apr 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions format.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ rootDir=$(dirname "$0")
$rootDir/src/HotChocolate/AspNetCore/format.sh
$rootDir/src/HotChocolate/ApolloFederation/format.sh
$rootDir/src/HotChocolate/Data/format.sh
$rootDir/src/HotChocolate/MongoDb/format.sh
$rootDir/src/HotChocolate/Language/format.sh
$rootDir/src/HotChocolate/Stitching/format.sh
$rootDir/src/HotChocolate/Spatial/format.sh
13 changes: 13 additions & 0 deletions src/HotChocolate/MongoDb/format.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash

BASEDIR=$(dirname "$0")
src=$BASEDIR/src
test=$BASEDIR/test

dotnet format $src/Data
dotnet format $src/Types
dotnet format $test/Data.MongoDb.Filters.Tests
dotnet format $test/Data.MongoDb.Projections.Tests
dotnet format $test/Data.MongoDb.Paging.Tests
dotnet format $test/Data.MongoDb.Sorting.Tests
dotnet format $test/Types.MongoDb
141 changes: 70 additions & 71 deletions src/HotChocolate/MongoDb/src/Data/Driver/AndFilterDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,114 +4,113 @@
using MongoDB.Bson.Serialization;
using MongoDB.Driver.Linq;

namespace HotChocolate.Data.MongoDb
namespace HotChocolate.Data.MongoDb;

/// <summary>
/// This class was ported over from the official mongo db driver
/// </summary>
public sealed class AndFilterDefinition : MongoDbFilterDefinition
{
/// <summary>
/// This class was ported over from the official mongo db driver
/// </summary>
public sealed class AndFilterDefinition : MongoDbFilterDefinition
private static readonly string[] __operatorsThatCannotBeCombined = new[]
{
private static readonly string[] __operatorsThatCannotBeCombined = new[]
{
"$geoWithin",
"$near",
"$geoIntersects",
"$nearSphere"
};

private readonly MongoDbFilterDefinition[] _filters;
private readonly MongoDbFilterDefinition[] _filters;

public AndFilterDefinition(params MongoDbFilterDefinition[] filters)
{
_filters = filters;
}
public AndFilterDefinition(params MongoDbFilterDefinition[] filters)
{
_filters = filters;
}

public AndFilterDefinition(IEnumerable<MongoDbFilterDefinition> filters)
{
_filters = filters.ToArray();
}

public AndFilterDefinition(IEnumerable<MongoDbFilterDefinition> filters)
public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
{
if (_filters.Length == 0)
{
_filters = filters.ToArray();
return new BsonDocument("$and", new BsonArray(0));
}

public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
var document = new BsonDocument();

foreach (var filter in _filters)
{
if (_filters.Length == 0)
BsonDocument renderedFilter = filter.Render(documentSerializer, serializerRegistry);
foreach (BsonElement clause in renderedFilter)
{
return new BsonDocument("$and", new BsonArray(0));
AddClause(document, clause);
}
}

var document = new BsonDocument();
return document;
}

foreach (var filter in _filters)
private static void AddClause(BsonDocument document, BsonElement clause)
{
if (clause.Name == "$and")
{
// flatten out nested $and
foreach (var item in (BsonArray)clause.Value)
{
BsonDocument renderedFilter = filter.Render(documentSerializer, serializerRegistry);
foreach (BsonElement clause in renderedFilter)
foreach (BsonElement element in (BsonDocument)item)
{
AddClause(document, clause);
AddClause(document, element);
}
}

return document;
}

private static void AddClause(BsonDocument document, BsonElement clause)
else if (document.ElementCount == 1 && document.GetElement(0).Name == "$and")
{
if (clause.Name == "$and")
{
// flatten out nested $and
foreach (var item in (BsonArray)clause.Value)
{
foreach (BsonElement element in (BsonDocument)item)
{
AddClause(document, element);
}
}
}
else if (document.ElementCount == 1 && document.GetElement(0).Name == "$and")
{
((BsonArray)document[0]).Add(new BsonDocument(clause));
}
else if (document.Contains(clause.Name))
((BsonArray)document[0]).Add(new BsonDocument(clause));
}
else if (document.Contains(clause.Name))
{
BsonElement existingClause = document.GetElement(clause.Name);
if (existingClause.Value is BsonDocument existingClauseValue &&
clause.Value is BsonDocument clauseValue)
{
BsonElement existingClause = document.GetElement(clause.Name);
if (existingClause.Value is BsonDocument existingClauseValue &&
clause.Value is BsonDocument clauseValue)
var clauseOperator = clauseValue.ElementCount > 0
? clauseValue.GetElement(0).Name
: null;
if (clauseValue.Names.Any(op => existingClauseValue.Contains(op)) ||
__operatorsThatCannotBeCombined.Contains(clauseOperator))
{
var clauseOperator = clauseValue.ElementCount > 0
? clauseValue.GetElement(0).Name
: null;
if (clauseValue.Names.Any(op => existingClauseValue.Contains(op)) ||
__operatorsThatCannotBeCombined.Contains(clauseOperator))
{
PromoteFilterToDollarForm(document, clause);
}
else
{
existingClauseValue.AddRange(clauseValue);
}
PromoteFilterToDollarForm(document, clause);
}
else
{
PromoteFilterToDollarForm(document, clause);
existingClauseValue.AddRange(clauseValue);
}
}
else
{
document.Add(clause);
PromoteFilterToDollarForm(document, clause);
}
}

private static void PromoteFilterToDollarForm(BsonDocument document, BsonElement clause)
else
{
var clauses = new BsonArray();
foreach (BsonElement queryElement in document)
{
clauses.Add(new BsonDocument(queryElement));
}
document.Add(clause);
}
}

clauses.Add(new BsonDocument(clause));
document.Clear();
document.Add("$and", clauses);
private static void PromoteFilterToDollarForm(BsonDocument document, BsonElement clause)
{
var clauses = new BsonArray();
foreach (BsonElement queryElement in document)
{
clauses.Add(new BsonDocument(queryElement));
}

clauses.Add(new BsonDocument(clause));
document.Clear();
document.Add("$and", clauses);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,35 @@
using MongoDB.Bson.Serialization;
using MongoDB.Driver;

namespace HotChocolate.Data.MongoDb
namespace HotChocolate.Data.MongoDb;

public static class FilterDefinitionExtensions
{
public static class FilterDefinitionExtensions
public static MongoDbFilterDefinition Wrap<T>(
this FilterDefinition<T> filterDefinition) =>
new FilterDefinitionWrapper<T>(filterDefinition);

private sealed class FilterDefinitionWrapper<TDocument> : MongoDbFilterDefinition
{
public static MongoDbFilterDefinition Wrap<T>(
this FilterDefinition<T> filterDefinition) =>
new FilterDefinitionWrapper<T>(filterDefinition);
private readonly FilterDefinition<TDocument> _filter;

private sealed class FilterDefinitionWrapper<TDocument> : MongoDbFilterDefinition
public FilterDefinitionWrapper(FilterDefinition<TDocument> filter)
{
private readonly FilterDefinition<TDocument> _filter;
_filter = filter;
}

public FilterDefinitionWrapper(FilterDefinition<TDocument> filter)
public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
{
if (documentSerializer is IBsonSerializer<TDocument> typedSerializer)
{
_filter = filter;
return _filter.Render(typedSerializer, serializerRegistry);
}

public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
{
if (documentSerializer is IBsonSerializer<TDocument> typedSerializer)
{
return _filter.Render(typedSerializer, serializerRegistry);
}

return _filter.Render(
serializerRegistry.GetSerializer<TDocument>(),
serializerRegistry);
}
return _filter.Render(
serializerRegistry.GetSerializer<TDocument>(),
serializerRegistry);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,46 @@
using MongoDB.Bson.Serialization;
using MongoDB.Driver.Core.Misc;

namespace HotChocolate.Data.MongoDb
namespace HotChocolate.Data.MongoDb;

/// <summary>
/// This class was ported over from the official mongo db driver
/// </summary>
public sealed class MongoDbCombinedProjectionDefinition : MongoDbProjectionDefinition
{
/// <summary>
/// This class was ported over from the official mongo db driver
/// </summary>
public sealed class MongoDbCombinedProjectionDefinition : MongoDbProjectionDefinition
private readonly MongoDbProjectionDefinition[] _projections;

public MongoDbCombinedProjectionDefinition(
params MongoDbProjectionDefinition[] projections)
{
private readonly MongoDbProjectionDefinition[] _projections;
_projections = projections;
}

public MongoDbCombinedProjectionDefinition(
params MongoDbProjectionDefinition[] projections)
{
_projections = projections;
}
public MongoDbCombinedProjectionDefinition(
IEnumerable<MongoDbProjectionDefinition> projections)
{
_projections = Ensure.IsNotNull(projections, nameof(projections)).ToArray();
}

public MongoDbCombinedProjectionDefinition(
IEnumerable<MongoDbProjectionDefinition> projections)
{
_projections = Ensure.IsNotNull(projections, nameof(projections)).ToArray();
}
public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
{
var document = new BsonDocument();

public override BsonDocument Render(
IBsonSerializer documentSerializer,
IBsonSerializerRegistry serializerRegistry)
foreach (var sort in _projections)
{
var document = new BsonDocument();
BsonDocument renderedProjection = sort.Render(
documentSerializer,
serializerRegistry);

foreach (var sort in _projections)
foreach (BsonElement element in renderedProjection.Elements)
{
BsonDocument renderedProjection = sort.Render(
documentSerializer,
serializerRegistry);

foreach (BsonElement element in renderedProjection.Elements)
{
document.Remove(element.Name);
document.Add(element);
}
document.Remove(element.Name);
document.Add(element);
}

return document;
}

return document;
}
}