Skip to content

Commit

Permalink
Adds ProjectionExtensions & rename OnComplete to Complete (#2546)
Browse files Browse the repository at this point in the history
  • Loading branch information
PascalSenn committed Nov 9, 2020
1 parent 8f9b03c commit 5d21f31
Show file tree
Hide file tree
Showing 27 changed files with 454 additions and 36 deletions.
1 change: 1 addition & 0 deletions src/HotChocolate/Core/src/Types/InternalsVisibleTo.cs
Expand Up @@ -13,3 +13,4 @@
[assembly: InternalsVisibleTo("HotChocolate.AspNetCore.Tests")]
[assembly: InternalsVisibleTo("HotChocolate.Data.Filters.Tests")]
[assembly: InternalsVisibleTo("HotChocolate.Data.Sorting.Tests")]
[assembly: InternalsVisibleTo("HotChocolate.Data.Projections.Tests")]
Expand Up @@ -33,7 +33,7 @@ protected internal virtual void Initialize(IConventionContext context)
MarkInitialized();
}

protected internal virtual void OnComplete(IConventionContext context)
protected internal virtual void Complete(IConventionContext context)
{
}

Expand Down
Expand Up @@ -6,9 +6,9 @@ public abstract class ConventionExtension
{
public abstract void Merge(IConventionContext context, Convention convention);

protected internal sealed override void OnComplete(IConventionContext context)
protected internal sealed override void Complete(IConventionContext context)
{
base.OnComplete(context);
base.Complete(context);
}
}
}
Expand Up @@ -27,7 +27,7 @@ protected internal sealed override void Initialize(IConventionContext context)
MarkInitialized();
}

protected internal override void OnComplete(IConventionContext context)
protected internal override void Complete(IConventionContext context)
{
_definition = null;
}
Expand Down
Expand Up @@ -117,7 +117,7 @@ public ITypeInspector TypeInspector

init.Initialize(conventionContext);
MergeExtensions(conventionContext, init, extensions);
init.OnComplete(conventionContext);
init.Complete(conventionContext);
}

if (createdConvention is T createdConventionOfT)
Expand Down Expand Up @@ -176,7 +176,7 @@ public ITypeInspector TypeInspector
{
extensionConvention.Initialize(context);
extensions[m].Merge(context, convention);
extensionConvention.OnComplete(context);
extensionConvention.Complete(context);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/HotChocolate/Core/test/Types.Tests/SchemaBuilderTests.cs
Expand Up @@ -2169,10 +2169,10 @@ protected override MockConventionDefinition CreateDefinition(IConventionContext
return new MockConventionDefinition();
}

protected internal override void OnComplete(IConventionContext context)
protected internal override void Complete(IConventionContext context)
{
IsExtended = Definition.IsExtended;
base.OnComplete(context);
base.Complete(context);
}
}

Expand Down
15 changes: 15 additions & 0 deletions src/HotChocolate/Data/HotChocolate.Data.sln
Expand Up @@ -80,6 +80,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotChocolate.Data.Tests", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotChocolate.StarWars", "..\Core\test\StarWars\HotChocolate.StarWars.csproj", "{6B8B8B28-EE74-49A9-BC68-C42CB217BB54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotChocolate.Data.Projections.Tests", "test\Data.Projections.Tests\HotChocolate.Data.Projections.Tests.csproj", "{5B36B9E9-BC55-4A4D-B58F-9311581C008B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -123,6 +125,7 @@ Global
{16FB6511-AE94-46C4-9652-2665C6816546} = {4EE990B2-C327-46DA-8FE8-F95AC228E47F}
{256DC401-40F1-4632-BB68-A336D1C518D9} = {4EE990B2-C327-46DA-8FE8-F95AC228E47F}
{6B8B8B28-EE74-49A9-BC68-C42CB217BB54} = {882EC02D-5E1D-41F5-AD9F-AA06E31D133A}
{5B36B9E9-BC55-4A4D-B58F-9311581C008B} = {4EE990B2-C327-46DA-8FE8-F95AC228E47F}
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D68A0AB9-871A-487B-8D12-1A7544D81B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -475,5 +478,17 @@ Global
{6B8B8B28-EE74-49A9-BC68-C42CB217BB54}.Release|x64.Build.0 = Release|Any CPU
{6B8B8B28-EE74-49A9-BC68-C42CB217BB54}.Release|x86.ActiveCfg = Release|Any CPU
{6B8B8B28-EE74-49A9-BC68-C42CB217BB54}.Release|x86.Build.0 = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|x64.ActiveCfg = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|x64.Build.0 = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|x86.ActiveCfg = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Debug|x86.Build.0 = Debug|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|Any CPU.Build.0 = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|x64.ActiveCfg = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|x64.Build.0 = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|x86.ActiveCfg = Release|Any CPU
{5B36B9E9-BC55-4A4D-B58F-9311581C008B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
Expand Up @@ -68,7 +68,7 @@ protected virtual void Configure(IFilterConventionDescriptor descriptor)
{
}

protected override void OnComplete(IConventionContext context)
protected override void Complete(IConventionContext context)
{
if (Definition?.Provider is null)
{
Expand Down Expand Up @@ -100,14 +100,14 @@ protected override void OnComplete(IConventionContext context)
CollectExtensions(context.Services, Definition);
init.Initialize(context, this);
MergeExtensions(context, init, extensions);
init.OnComplete(context);
init.Complete(context);
}

_typeInspector = context.DescriptorContext.TypeInspector;

// It is important to always call base to continue the cleanup and the disposal of the
// definition
base.OnComplete(context);
base.Complete(context);
}


Expand Down Expand Up @@ -295,7 +295,7 @@ public NameString GetOperationName(int operation)
{
extensionConvention.Initialize(context, this);
extensions[m].Merge(context, providerConvention);
extensionConvention.OnComplete(context);
extensionConvention.Complete(context);
}
}
}
Expand Down
Expand Up @@ -60,12 +60,12 @@ protected override FilterProviderDefinition CreateDefinition(IConventionContext
base.Initialize(context);
}

void IFilterProviderConvention.OnComplete(IConventionContext context)
void IFilterProviderConvention.Complete(IConventionContext context)
{
OnComplete(context);
Complete(context);
}

protected override void OnComplete(IConventionContext context)
protected override void Complete(IConventionContext context)
{
if (Definition.Handlers.Count == 0)
{
Expand Down
Expand Up @@ -30,9 +30,9 @@ public FilterProviderExtensions(Action<IFilterProviderDescriptor<TContext>> conf
base.Initialize(context);
}

void IFilterProviderConvention.OnComplete(IConventionContext context)
void IFilterProviderConvention.Complete(IConventionContext context)
{
OnComplete(context);
Complete(context);
}

protected override FilterProviderDefinition CreateDefinition(IConventionContext context)
Expand Down
Expand Up @@ -6,6 +6,6 @@ internal interface IFilterProviderConvention
{
internal void Initialize(IConventionContext context, IFilterConvention convention);

internal void OnComplete(IConventionContext context);
internal void Complete(IConventionContext context);
}
}
Expand Up @@ -24,5 +24,22 @@ IProjectionConventionDescriptor Provider<TProvider>(TProvider provider)
/// </summary>
/// <param name="provider">The projection provider type.</param>
IProjectionConventionDescriptor Provider(Type provider);

/// <summary>
/// Add a extensions that is applied to <see cref="ProjectionProvider"/>
/// </summary>
/// <typeparam name="TExtension">The filter provider extension type.</typeparam>
IProjectionConventionDescriptor AddProviderExtension<TExtension>()
where TExtension : class, IProjectionProviderExtension;

/// <summary>
/// Add a extensions that is applied to <see cref="ProjectionProvider"/>
/// </summary>
/// <param name="provider">
/// The concrete filter provider extension that shall be used.
/// </param>
/// <typeparam name="TExtension">The filter provider extension type.</typeparam>
IProjectionConventionDescriptor AddProviderExtension<TExtension>(TExtension provider)
where TExtension : class, IProjectionProviderExtension;
}
}
Expand Up @@ -6,6 +6,6 @@ internal interface IProjectionProviderConvention
{
internal void Initialize(IConventionContext context);

internal void OnComplete(IConventionContext context);
internal void Complete(IConventionContext context);
}
}
@@ -0,0 +1,9 @@
using HotChocolate.Types.Descriptors;

namespace HotChocolate.Data.Projections
{
public interface IProjectionProviderExtension
: IConventionExtension
{
}
}
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using HotChocolate.Execution.Processing;
using HotChocolate.Resolvers;
using HotChocolate.Types.Descriptors;
Expand Down Expand Up @@ -28,6 +29,8 @@ public ProjectionConvention(Action<IProjectionConventionDescriptor> configure)
throw new ArgumentNullException(nameof(configure));
}

internal new ProjectionConventionDefinition? Definition => base.Definition;

protected override ProjectionConventionDefinition CreateDefinition(
IConventionContext context)
{
Expand All @@ -51,7 +54,7 @@ protected virtual void Configure(IProjectionConventionDescriptor descriptor)
{
}

protected override void OnComplete(IConventionContext context)
protected override void Complete(IConventionContext context)
{
if (Definition.Provider is null)
{
Expand All @@ -62,7 +65,7 @@ protected override void OnComplete(IConventionContext context)
{
_provider =
context.Services.GetOrCreateService<IProjectionProvider>(Definition.Provider) ??
throw ProjectionConvention_NoProviderFound(GetType(), Definition.Scope);
throw ProjectionConvention_NoProviderFound(GetType(), Definition.Scope);
}
else
{
Expand All @@ -71,8 +74,11 @@ protected override void OnComplete(IConventionContext context)

if (_provider is IProjectionProviderConvention init)
{
IReadOnlyList<IProjectionProviderExtension> extensions =
CollectExtensions(context.Services, Definition);
init.Initialize(context);
init.OnComplete(context);
MergeExtensions(context, init, extensions);
init.Complete(context);
}
}

Expand All @@ -81,5 +87,44 @@ protected override void OnComplete(IConventionContext context)

public ISelectionOptimizer CreateOptimizer() =>
new ProjectionOptimizer(_provider);

private static IReadOnlyList<IProjectionProviderExtension> CollectExtensions(
IServiceProvider serviceProvider,
ProjectionConventionDefinition definition)
{
List<IProjectionProviderExtension> extensions = new List<IProjectionProviderExtension>();
extensions.AddRange(definition.ProviderExtensions);
foreach (var extensionType in definition.ProviderExtensionsTypes)
{
if (serviceProvider.TryGetOrCreateService<IProjectionProviderExtension>(
extensionType,
out var createdExtension))
{
extensions.Add(createdExtension);
}
}

return extensions;
}

private static void MergeExtensions(
IConventionContext context,
IProjectionProviderConvention provider,
IReadOnlyList<IProjectionProviderExtension> extensions)
{
if (provider is Convention providerConvention)
{
for (var m = 0; m < extensions.Count; m++)
{
if (extensions[m] is IProjectionProviderConvention extensionConvention)
{
extensionConvention.Initialize(context);
extensions[m].Merge(context, providerConvention);
extensionConvention.Complete(context);
}
}
}
}
}
}

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using HotChocolate.Types;

namespace HotChocolate.Data.Projections
Expand All @@ -10,5 +11,10 @@ public class ProjectionConventionDefinition : IHasScope
public Type? Provider { get; set; }

public IProjectionProvider? ProviderInstance { get; set; }

public List<IProjectionProviderExtension> ProviderExtensions { get; } =
new List<IProjectionProviderExtension>();

public List<Type> ProviderExtensionsTypes { get; } = new List<Type>();
}
}
Expand Up @@ -57,6 +57,22 @@ public IProjectionConventionDescriptor Provider(Type provider)
return this;
}

/// <inheritdoc />
public IProjectionConventionDescriptor AddProviderExtension<TExtension>()
where TExtension : class, IProjectionProviderExtension
{
Definition.ProviderExtensionsTypes.Add(typeof(TExtension));
return this;
}

/// <inheritdoc />
public IProjectionConventionDescriptor AddProviderExtension<TExtension>(TExtension provider)
where TExtension : class, IProjectionProviderExtension
{
Definition.ProviderExtensions.Add(provider);
return this;
}

/// <summary>
/// Creates a new descriptor for <see cref="ProjectionConvention"/>
/// </summary>
Expand Down

0 comments on commit 5d21f31

Please sign in to comment.