From 014784c2d517c24b4149c7170e073cf74012fe3f Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Sun, 18 Oct 2020 20:01:36 +0200 Subject: [PATCH] Integrated projections into new configuration API --- ...otChocolateDataRequestBuilderExtensions.cs | 63 +++++++++++++++++++ .../FilterFieldDescriptorExtensions.cs | 3 +- .../Extensions/FilterFieldExtensions.cs | 23 ------- .../FilterObjectFieldDescriptorExtensions.cs | 2 +- ...ns.cs => FilterSchemaBuilderExtensions.cs} | 5 +- .../Types/ComparableOperationFilterInput.cs | 1 + .../Filters/Types/EnumOperationFilterInput.cs | 1 + ... => ProjectionsSchemaBuilderExtensions.cs} | 5 +- ...electionObjectFieldDescriptorExtensions.cs | 45 ------------- .../Data/Projections/ProjectionOptimizer.cs | 48 ++++++++++++++ .../Sorting/Extensions/SortFieldExtensions.cs | 24 ------- .../SortObjectFieldDescriptorExtensions.cs | 3 +- ...s.cs => SortingSchemaBuilderExtensions.cs} | 5 +- 13 files changed, 126 insertions(+), 102 deletions(-) delete mode 100644 src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldExtensions.cs rename src/HotChocolate/Data/src/Data/Filters/Extensions/{SchemaBuilderExtensions.cs => FilterSchemaBuilderExtensions.cs} (95%) rename src/HotChocolate/Data/src/Data/Projections/Extensions/{SchemaBuilderExtensions.cs => ProjectionsSchemaBuilderExtensions.cs} (95%) create mode 100644 src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs delete mode 100644 src/HotChocolate/Data/src/Data/Sorting/Extensions/SortFieldExtensions.cs rename src/HotChocolate/Data/src/Data/Sorting/Extensions/{SchemaBuilderExtensions.cs => SortingSchemaBuilderExtensions.cs} (95%) diff --git a/src/HotChocolate/Data/src/Data/Extensions/HotChocolateDataRequestBuilderExtensions.cs b/src/HotChocolate/Data/src/Data/Extensions/HotChocolateDataRequestBuilderExtensions.cs index 890ba1d57c7..ff55d591bdd 100644 --- a/src/HotChocolate/Data/src/Data/Extensions/HotChocolateDataRequestBuilderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Extensions/HotChocolateDataRequestBuilderExtensions.cs @@ -1,5 +1,7 @@ using System; +using HotChocolate; using HotChocolate.Data.Filters; +using HotChocolate.Data.Projections; using HotChocolate.Data.Sorting; using HotChocolate.Execution.Configuration; @@ -119,5 +121,66 @@ public static class HotChocolateDataRequestBuilderExtensions string? name = null) where TConvention : class, ISortConvention => builder.ConfigureSchema(s => s.AddSorting(name)); + + /// + /// Adds filtering support. + /// + /// + /// The . + /// + /// + /// Returns the . + /// + public static IRequestExecutorBuilder AddProjections( + this IRequestExecutorBuilder builder) => + AddProjections(builder, x => x.AddDefaults()); + + /// + /// Adds filtering support. + /// + /// + /// The . + /// + /// + /// Configures the convention. + /// + /// + /// The filter convention name. + /// + /// + /// Returns the . + /// + public static IRequestExecutorBuilder AddProjections( + this IRequestExecutorBuilder builder, + Action configure, + string? name = null) => + builder.ConfigureSchema(s => s + .TryAddTypeInterceptor() + .TryAddConvention( + sp => new ProjectionConvention(configure), + name)); + + /// + /// Adds filtering support. + /// + /// + /// The . + /// + /// + /// The filter convention name. + /// + /// + /// The concrete filter convention type. + /// + /// + /// Returns the . + /// + public static IRequestExecutorBuilder AddProjections( + this IRequestExecutorBuilder builder, + string? name = null) + where TConvention : class, IProjectionConvention => + builder.ConfigureSchema(s => s + .TryAddTypeInterceptor() + .TryAddConvention(name)); } } diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldDescriptorExtensions.cs index d46d6f941ae..fe2d2167821 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldDescriptorExtensions.cs @@ -1,9 +1,10 @@ using System; +using HotChocolate.Data.Filters; using HotChocolate.Language; using HotChocolate.Types; using HotChocolate.Types.Descriptors; -namespace HotChocolate.Data.Filters +namespace HotChocolate.Types { public static class FilterFieldDescriptorExtensions { diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldExtensions.cs deleted file mode 100644 index f2842d2365c..00000000000 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterFieldExtensions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Reflection; - -namespace HotChocolate.Data.Filters -{ - public static class FilterFieldExtensions - { - public static Type GetReturnType( - this IFilterField field) - { - if (field.Member is PropertyInfo propertyInfo) - { - return propertyInfo.PropertyType; - } - else if (field.Member is MethodInfo methodInfo) - { - return methodInfo.ReturnType; - } - - throw new InvalidOperationException(); - } - } -} \ No newline at end of file diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterObjectFieldDescriptorExtensions.cs index 4ceb0ceee55..5740d6dea53 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterObjectFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterObjectFieldDescriptorExtensions.cs @@ -11,7 +11,7 @@ using static HotChocolate.Data.DataResources; using static HotChocolate.Data.ThrowHelper; -namespace HotChocolate.Data +namespace HotChocolate.Types { public static class FilterObjectFieldDescriptorExtensions { diff --git a/src/HotChocolate/Data/src/Data/Filters/Extensions/SchemaBuilderExtensions.cs b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterSchemaBuilderExtensions.cs similarity index 95% rename from src/HotChocolate/Data/src/Data/Filters/Extensions/SchemaBuilderExtensions.cs rename to src/HotChocolate/Data/src/Data/Filters/Extensions/FilterSchemaBuilderExtensions.cs index 4be5173f4b1..34f9c291e05 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Extensions/SchemaBuilderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Extensions/FilterSchemaBuilderExtensions.cs @@ -1,11 +1,12 @@ using System; +using HotChocolate.Data.Filters; -namespace HotChocolate.Data.Filters +namespace HotChocolate { /// /// Provides filtering extensions for the . /// - public static class SchemaBuilderExtensions + public static class FilterSchemaBuilderExtensions { /// /// Adds filtering support. diff --git a/src/HotChocolate/Data/src/Data/Filters/Types/ComparableOperationFilterInput.cs b/src/HotChocolate/Data/src/Data/Filters/Types/ComparableOperationFilterInput.cs index f3c5dc6c263..5e1e8f03838 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Types/ComparableOperationFilterInput.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Types/ComparableOperationFilterInput.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using HotChocolate.Types; namespace HotChocolate.Data.Filters { diff --git a/src/HotChocolate/Data/src/Data/Filters/Types/EnumOperationFilterInput.cs b/src/HotChocolate/Data/src/Data/Filters/Types/EnumOperationFilterInput.cs index 4f2df836f20..5dfb6376c61 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Types/EnumOperationFilterInput.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Types/EnumOperationFilterInput.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using HotChocolate.Types; namespace HotChocolate.Data.Filters { diff --git a/src/HotChocolate/Data/src/Data/Projections/Extensions/SchemaBuilderExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionsSchemaBuilderExtensions.cs similarity index 95% rename from src/HotChocolate/Data/src/Data/Projections/Extensions/SchemaBuilderExtensions.cs rename to src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionsSchemaBuilderExtensions.cs index a1931393b80..7358602b7df 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Extensions/SchemaBuilderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Extensions/ProjectionsSchemaBuilderExtensions.cs @@ -1,11 +1,12 @@ using System; +using HotChocolate.Data.Projections; -namespace HotChocolate.Data.Projections +namespace HotChocolate { /// /// Provides filtering extensions for the . /// - public static class SchemaBuilderExtensions + public static class ProjectionsSchemaBuilderExtensions { /// /// Adds filtering support. diff --git a/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionObjectFieldDescriptorExtensions.cs index f0e86d72827..b54c7c90685 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionObjectFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Extensions/SelectionObjectFieldDescriptorExtensions.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Reflection; using HotChocolate.Configuration; @@ -9,55 +8,11 @@ using HotChocolate.Types.Descriptors.Definitions; using HotChocolate.Data.Projections; using HotChocolate.Execution; -using HotChocolate.Execution.Processing; -using HotChocolate.Language; using static HotChocolate.Data.Projections.ProjectionProvider; using static HotChocolate.Execution.Processing.SelectionOptimizerHelper; namespace HotChocolate.Types { - public class ProjectionOptimizer : ISelectionOptimizer - { - private readonly IProjectionProvider _convention; - - public ProjectionOptimizer( - IProjectionProvider convention) - { - _convention = convention; - } - - public void OptimizeSelectionSet(SelectionOptimizerContext context) - { - var processedFields = new HashSet(); - while (!processedFields.SetEquals(context.Fields.Keys)) - { - var fieldsToProcess = new HashSet(context.Fields.Keys); - fieldsToProcess.ExceptWith(processedFields); - foreach (var field in fieldsToProcess) - { - context.Fields[field] = - _convention.RewriteSelection(context, context.Fields[field]); - processedFields.Add(field); - } - } - } - - public bool AllowFragmentDeferral( - SelectionOptimizerContext context, - InlineFragmentNode fragment) - { - return false; - } - - public bool AllowFragmentDeferral( - SelectionOptimizerContext context, - FragmentSpreadNode fragmentSpread, - FragmentDefinitionNode fragmentDefinition) - { - return false; - } - } - public static class ProjectionObjectFieldDescriptorExtensions { private static readonly MethodInfo _factoryTemplate = diff --git a/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs b/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs new file mode 100644 index 00000000000..dd0a58b7fe4 --- /dev/null +++ b/src/HotChocolate/Data/src/Data/Projections/ProjectionOptimizer.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using HotChocolate.Execution.Processing; +using HotChocolate.Language; + +namespace HotChocolate.Data.Projections +{ + public class ProjectionOptimizer : ISelectionOptimizer + { + private readonly IProjectionProvider _convention; + + public ProjectionOptimizer( + IProjectionProvider convention) + { + _convention = convention; + } + + public void OptimizeSelectionSet(SelectionOptimizerContext context) + { + var processedFields = new HashSet(); + while (!processedFields.SetEquals(context.Fields.Keys)) + { + var fieldsToProcess = new HashSet(context.Fields.Keys); + fieldsToProcess.ExceptWith(processedFields); + foreach (var field in fieldsToProcess) + { + context.Fields[field] = + _convention.RewriteSelection(context, context.Fields[field]); + processedFields.Add(field); + } + } + } + + public bool AllowFragmentDeferral( + SelectionOptimizerContext context, + InlineFragmentNode fragment) + { + return false; + } + + public bool AllowFragmentDeferral( + SelectionOptimizerContext context, + FragmentSpreadNode fragmentSpread, + FragmentDefinitionNode fragmentDefinition) + { + return false; + } + } +} diff --git a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortFieldExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortFieldExtensions.cs deleted file mode 100644 index b34ec3d3da1..00000000000 --- a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortFieldExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Reflection; - -namespace HotChocolate.Data.Sorting -{ - public static class SortFieldExtensions - { - public static Type GetReturnType( - this ISortField field) - { - if (field.Member is PropertyInfo propertyInfo) - { - return propertyInfo.PropertyType; - } - - if (field.Member is MethodInfo methodInfo) - { - return methodInfo.ReturnType; - } - - throw new InvalidOperationException(); - } - } -} diff --git a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortObjectFieldDescriptorExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortObjectFieldDescriptorExtensions.cs index ec50e257e81..70f3a359c47 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortObjectFieldDescriptorExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortObjectFieldDescriptorExtensions.cs @@ -5,13 +5,12 @@ using HotChocolate.Data.Sorting; using HotChocolate.Internal; using HotChocolate.Resolvers; -using HotChocolate.Types; using HotChocolate.Types.Descriptors; using HotChocolate.Types.Descriptors.Definitions; using static HotChocolate.Data.DataResources; using static HotChocolate.Data.ThrowHelper; -namespace HotChocolate.Data +namespace HotChocolate.Types { public static class SortObjectFieldDescriptorExtensions { diff --git a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SchemaBuilderExtensions.cs b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingSchemaBuilderExtensions.cs similarity index 95% rename from src/HotChocolate/Data/src/Data/Sorting/Extensions/SchemaBuilderExtensions.cs rename to src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingSchemaBuilderExtensions.cs index 1770dc32dae..4eb4331de4b 100644 --- a/src/HotChocolate/Data/src/Data/Sorting/Extensions/SchemaBuilderExtensions.cs +++ b/src/HotChocolate/Data/src/Data/Sorting/Extensions/SortingSchemaBuilderExtensions.cs @@ -1,11 +1,12 @@ using System; +using HotChocolate.Data.Sorting; -namespace HotChocolate.Data.Sorting +namespace HotChocolate { /// /// Provides Sorting extensions for the . /// - public static class SchemaBuilderExtensions + public static class SortingSchemaBuilderExtensions { /// /// Adds Sorting support.