diff --git a/src/HotChocolate/Data/src/Data/Filters/Convention/DataTypeExtensionHelper.cs b/src/HotChocolate/Data/src/Data/Filters/Convention/DataTypeExtensionHelper.cs index 338382a8762..235524eab76 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Convention/DataTypeExtensionHelper.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Convention/DataTypeExtensionHelper.cs @@ -97,6 +97,7 @@ private static void MergeFilterFieldDefinitions( filterTypeField.Handler ??= filterExtensionField.Handler; } + typeField.Ignore |= extensionField.Ignore; typeField.Description ??= extensionField.Description; typeField.RuntimeDefaultValue ??= extensionField.RuntimeDefaultValue; }); diff --git a/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs b/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs index 5e1ba897088..c1fd6919092 100644 --- a/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/FilterInputTypeDescriptor.cs @@ -77,14 +77,22 @@ protected override void OnCreateConfiguration(FilterInputTypeConfiguration confi var fields = new Dictionary(StringComparer.Ordinal); var handledProperties = new HashSet(); + var operationFields = Operations.Select(t => t.CreateConfiguration()).ToArray(); FieldDescriptorUtilities.AddExplicitFields( - Fields.Select(t => t.CreateConfiguration()) - .Concat(Operations.Select(t => t.CreateConfiguration())), + Fields.Select(t => t.CreateConfiguration()), f => f.Member, fields, handledProperties); + foreach (var operationField in operationFields) + { + if (!string.IsNullOrEmpty(operationField.Name)) + { + fields[operationField.Name] = operationField; + } + } + OnCompleteFields(fields, handledProperties); Configuration.Fields.AddRange(fields.Values); diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs index d37d45b4a27..ba56bcb3dd1 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/Convention/FilterConventionTests.cs @@ -411,6 +411,36 @@ public async Task FilterConvention_Should_NotAddOr() schema.MatchSnapshot(); } + [Fact] + public async Task FilterConvention_Should_Ignore_String_Operations() + { + // arrange + var convention = new FilterConvention( + descriptor => + { + descriptor.AddDefaults(); + descriptor.Configure( + d => d.Operation(DefaultFilterOperations.Contains).Ignore()); + descriptor.Configure( + d => d.Operation(DefaultFilterOperations.EndsWith).Ignore()); + }); + + var builder = new ServiceCollection() + .AddGraphQL() + .AddConvention(convention) + .AddFiltering() + .AddQueryType( + x => x.Name("Query").Field("foos").UseFiltering().Resolve(new List())); + + // act + var schema = await builder.BuildSchemaAsync(); + var stringOperations = schema.Types.GetType("StringOperationFilterInput"); + + // assert + Assert.DoesNotContain(stringOperations.Fields, t => t.Name.Equals("contains", StringComparison.Ordinal)); + Assert.DoesNotContain(stringOperations.Fields, t => t.Name.Equals("endsWith", StringComparison.Ordinal)); + } + protected Schema CreateSchemaWithTypes( IFilterInputType type, FilterConvention convention,