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

CSHARP-4684: Make part of IMongoQueryProvider public. #1325

Merged
merged 1 commit into from
May 23, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 20 additions & 14 deletions src/MongoDB.Driver/Linq/IMongoQueryProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,32 @@ namespace MongoDB.Driver.Linq
/// <summary>
/// An implementation of <see cref="IQueryProvider" /> for MongoDB.
/// </summary>
internal interface IMongoQueryProvider : IQueryProvider
public interface IMongoQueryProvider : IQueryProvider
{
/// <summary>
/// Gets the collection namespace.
/// Gets the most recently logged stages.
/// </summary>
CollectionNamespace CollectionNamespace { get; }
BsonDocument[] LoggedStages { get; }

/// <summary>
/// Gets the most recently logged stages.
/// Executes the strongly-typed query represented by a specified expression tree.
/// </summary>
BsonDocument[] LoggedStages { get; }
/// <typeparam name="TResult">The type of the result.</typeparam>
/// <param name="expression">An expression tree that represents a LINQ query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The value that results from executing the specified query.</returns>
Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken = default(CancellationToken));
}

/// <summary>
/// The internal IMongoQueryProvider interface.
/// </summary>
internal interface IMongoQueryProviderInternal : IMongoQueryProvider
{
/// <summary>
/// Gets the collection namespace.
/// </summary>
CollectionNamespace CollectionNamespace { get; }

/// <summary>
/// Gets the pipeline input serializer (the DocumentSerializer for collection queries and NoPipelineInputSerializer for database queries).
Expand All @@ -48,14 +63,5 @@ internal interface IMongoQueryProvider : IQueryProvider
/// <param name="expression">The expression.</param>
/// <returns>The execution model.</returns>
QueryableExecutionModel GetExecutionModel(Expression expression);

/// <summary>
/// Executes the strongly-typed query represented by a specified expression tree.
/// </summary>
/// <typeparam name="TResult">The type of the result.</typeparam>
/// <param name="expression">An expression tree that represents a LINQ query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The value that results from executing the specified query.</returns>
Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken = default(CancellationToken));
}
}
5 changes: 5 additions & 0 deletions src/MongoDB.Driver/Linq/IMongoQueryable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public interface IMongoQueryable : IQueryable
/// </summary>
BsonDocument[] LoggedStages { get; }

/// <summary>
/// Gets the IMongoQueryProvider for this queryable.
/// </summary>
new IMongoQueryProvider Provider { get; }

/// <summary>
/// Gets the execution model.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

namespace MongoDB.Driver.Linq.Linq2Implementation
{
internal sealed class MongoQueryProviderImpl<TDocument> : IMongoQueryProvider
internal sealed class MongoQueryProviderImpl<TDocument> : IMongoQueryProviderInternal
{
private readonly IMongoCollection<TDocument> _collection;
private readonly AggregateOptions _options;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@ namespace MongoDB.Driver.Linq.Linq2Implementation
{
internal sealed class MongoQueryableImpl<TInput, TOutput> : IOrderedMongoQueryable<TOutput>
{
private readonly IMongoQueryProvider _queryProvider;
private readonly IMongoQueryProviderInternal _queryProvider;
private readonly Expression _expression;

public MongoQueryableImpl(IMongoQueryProvider queryProvider)
public MongoQueryableImpl(IMongoQueryProviderInternal queryProvider)
{
_queryProvider = Ensure.IsNotNull(queryProvider, nameof(queryProvider));
_expression = Expression.Constant(this, typeof(IMongoQueryable<TOutput>));
}

public MongoQueryableImpl(IMongoQueryProvider queryProvider, Expression expression)
public MongoQueryableImpl(IMongoQueryProviderInternal queryProvider, Expression expression)
{
_queryProvider = Ensure.IsNotNull(queryProvider, nameof(queryProvider));
_expression = Ensure.IsNotNull(expression, nameof(expression));
Expand All @@ -53,7 +53,12 @@ public Expression Expression

public BsonDocument[] LoggedStages => _queryProvider.LoggedStages;

public IQueryProvider Provider
public IMongoQueryProvider Provider
{
get { return _queryProvider; }
}

IQueryProvider IQueryable.Provider
{
get { return _queryProvider; }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ protected override Expression BindNonMethodCall(Expression node)
node.Type.GetGenericTypeDefinition() == typeof(IMongoQueryable<>))
{
var queryable = (IMongoQueryable)((ConstantExpression)node).Value;
var provider = (IMongoQueryProvider)queryable.Provider;
var provider = (IMongoQueryProviderInternal)queryable.Provider;
return new PipelineExpression(
new CollectionExpression(provider.CollectionNamespace, provider.PipelineInputSerializer),
new DocumentExpression(provider.PipelineInputSerializer));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ protected override Expression VisitConstant(ConstantExpression node)
node.Type.GetGenericTypeDefinition() == typeof(IMongoQueryable<>))
{
var queryable = (IMongoQueryable)node.Value;
var provider = (IMongoQueryProvider)queryable.Provider;
var provider = (IMongoQueryProviderInternal)queryable.Provider;
return new CollectionExpression(
provider.CollectionNamespace,
provider.PipelineInputSerializer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public static (string CollectionName, IBsonSerializer DocumentSerializer) GetCol
{
if (innerExpression is ConstantExpression constantExpression &&
constantExpression.Value is IMongoQueryable mongoQueryable &&
mongoQueryable.Provider is IMongoQueryProvider mongoQueryProvider &&
mongoQueryable.Provider is IMongoQueryProviderInternal mongoQueryProvider &&
mongoQueryProvider.CollectionNamespace != null)
{
return (mongoQueryProvider.CollectionNamespace.CollectionName, mongoQueryProvider.PipelineInputSerializer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public MongoQuery(MongoQueryProvider<TDocument> provider, Expression expression)

public BsonDocument[] LoggedStages => _provider.LoggedStages;

public MongoQueryProvider<TDocument> Provider => _provider;
public IMongoQueryProvider Provider => _provider;

IQueryProvider IQueryable.Provider => _provider;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

namespace MongoDB.Driver.Linq.Linq3Implementation
{
internal abstract class MongoQueryProvider : IMongoQueryProvider
internal abstract class MongoQueryProvider : IMongoQueryProviderInternal
{
// protected fields
protected readonly AggregateOptions _options;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static AstPipeline Translate(TranslationContext context, Expression expre
if (expression.NodeType == ExpressionType.Constant)
{
var query = (IQueryable)((ConstantExpression)expression).Value;
var provider = (IMongoQueryProvider)query.Provider;
var provider = (IMongoQueryProviderInternal)query.Provider;
return AstPipeline.Empty(provider.PipelineInputSerializer);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static AstPipeline Translate(TranslationContext context, MethodCallExpres
var secondValue = secondExpression.Evaluate();
if (secondValue is IMongoQueryable secondQueryable)
{
var secondProvider = (IMongoQueryProvider)secondQueryable.Provider;
var secondProvider = (IMongoQueryProviderInternal)secondQueryable.Provider;
var secondCollectionName = secondProvider.CollectionNamespace.CollectionName;
var secondPipelineInputSerializer = secondProvider.PipelineInputSerializer;
var secondContext = TranslationContext.Create(secondQueryable.Expression, secondPipelineInputSerializer);
Expand Down
Loading