Skip to content

Commit

Permalink
CSHARP-3977: Refactor GroupForLinq3 to return an explicit type. (#693)
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesKovacs committed Nov 23, 2021
1 parent ec4b2ce commit 2b37a1f
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
57 changes: 57 additions & 0 deletions src/MongoDB.Driver/GroupForLinq3Result.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using System.Linq;

namespace MongoDB.Driver
{
/// <summary>
/// Represents the return result from PipelineDefinitionBuilder.GroupForLinq3 method.
/// </summary>
/// <typeparam name="TInput">The type of the input documents.</typeparam>
/// <typeparam name="TValue">The type of the values.</typeparam>
/// <typeparam name="TOutput">The type of the output documents.</typeparam>
public class GroupForLinq3Result<TInput, TValue, TOutput>
{
internal GroupForLinq3Result(PipelineStageDefinition<TInput, IGrouping<TValue, TInput>> groupStage, PipelineStageDefinition<IGrouping<TValue, TInput>, TOutput> projectStage)
{
GroupStage = groupStage;
ProjectStage = projectStage;
}

/// <summary>
/// The resulting group stage.
/// </summary>
public PipelineStageDefinition<TInput, IGrouping<TValue, TInput>> GroupStage { get; }

/// <summary>
/// The resulting project stage.
/// </summary>
public PipelineStageDefinition<IGrouping<TValue, TInput>, TOutput> ProjectStage { get; }

/// <summary>
/// Deconstructs this class into its components.
/// </summary>
/// <param name="groupStage">The group stage.</param>
/// <param name="projectStage">The project stage.</param>
public void Deconstruct(
out PipelineStageDefinition<TInput, IGrouping<TValue, TInput>> groupStage,
out PipelineStageDefinition<IGrouping<TValue, TInput>, TOutput> projectStage)
{
groupStage = GroupStage;
projectStage = ProjectStage;
}
}
}
4 changes: 2 additions & 2 deletions src/MongoDB.Driver/PipelineStageDefinitionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -735,15 +735,15 @@ public static class PipelineStageDefinitionBuilder
/// <param name="translationOptions">The translation options.</param>
/// <returns>The stage.</returns>
/// <remarks>This method can only be used with LINQ3 but that can't be verified until Render is called.</remarks>
public static (PipelineStageDefinition<TInput, IGrouping<TValue, TInput>> GroupStage, PipelineStageDefinition<IGrouping<TValue, TInput>, TOutput> ProjectStage) GroupForLinq3<TInput, TValue, TOutput>(
public static GroupForLinq3Result<TInput, TValue, TOutput> GroupForLinq3<TInput, TValue, TOutput>(
Expression<Func<TInput, TValue>> value,
Expression<Func<IGrouping<TValue, TInput>, TOutput>> group,
ExpressionTranslationOptions translationOptions = null)
{
Ensure.IsNotNull(value, nameof(value));
Ensure.IsNotNull(group, nameof(group));
var stages = new Linq.Linq3Implementation.GroupExpressionStageDefinitions<TInput, TValue, TOutput>(value, group);
return (stages.GroupStage, stages.ProjectStage);
return new GroupForLinq3Result<TInput, TValue, TOutput>(stages.GroupStage, stages.ProjectStage);
}

/// <summary>
Expand Down

0 comments on commit 2b37a1f

Please sign in to comment.