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

Reworked Filter Naming Conventions #2618

Merged
merged 10 commits into from
Nov 21, 2020
12 changes: 12 additions & 0 deletions src/HotChocolate/Data/src/Data/DataResources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/HotChocolate/Data/src/Data/DataResources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@
<data name="FilterConvention_TypeOfMemberIsUnknown" xml:space="preserve">
<value>The type of the member {0} of the declaring type {1} is unknown</value>
</data>
<data name="FilterConvention_TypeIsUnknown" xml:space="preserve">
<value>The type {0} is unknown. No `FilterType` could be created</value>
</data>
<data name="SortConvention_OperationNameNotFound" xml:space="preserve">
<value>Operation with identifier {0} has no name defined. Add a name to the sort convention</value>
</data>
Expand All @@ -143,6 +146,9 @@
<data name="FilterInterceptor_NoHandlerFoundForField" xml:space="preserve">
<value>For the field {0} of type {1} was no handler found.</value>
</data>
<data name="FilterInterceptor_OperationHasNoTypeSpecified" xml:space="preserve">
<value>For the operation {0} of type {1} was no type specified found.</value>
</data>
<data name="ErrorHelper_CreateNonNullError" xml:space="preserve">
<value>The provided value for filter `{0}` of type {1} is invalid. Null values are not supported.</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,31 @@ public static class FilterConventionDescriptorExtensions
throw new ArgumentNullException(nameof(descriptor));
}

descriptor.Operation(DefaultOperations.Equals).Name("eq");
descriptor.Operation(DefaultOperations.NotEquals).Name("neq");
descriptor.Operation(DefaultOperations.GreaterThan).Name("gt");
descriptor.Operation(DefaultOperations.NotGreaterThan).Name("ngt");
descriptor.Operation(DefaultOperations.GreaterThanOrEquals).Name("gte");
descriptor.Operation(DefaultOperations.NotGreaterThanOrEquals).Name("ngte");
descriptor.Operation(DefaultOperations.LowerThan).Name("lt");
descriptor.Operation(DefaultOperations.NotLowerThan).Name("nlt");
descriptor.Operation(DefaultOperations.LowerThanOrEquals).Name("lte");
descriptor.Operation(DefaultOperations.NotLowerThanOrEquals).Name("nlte");
descriptor.Operation(DefaultOperations.Contains).Name("contains");
descriptor.Operation(DefaultOperations.NotContains).Name("ncontains");
descriptor.Operation(DefaultOperations.In).Name("in");
descriptor.Operation(DefaultOperations.NotIn).Name("nin");
descriptor.Operation(DefaultOperations.StartsWith).Name("startsWith");
descriptor.Operation(DefaultOperations.NotStartsWith).Name("nstartsWith");
descriptor.Operation(DefaultOperations.EndsWith).Name("endsWith");
descriptor.Operation(DefaultOperations.NotEndsWith).Name("nendsWith");
descriptor.Operation(DefaultOperations.All).Name("all");
descriptor.Operation(DefaultOperations.None).Name("none");
descriptor.Operation(DefaultOperations.Some).Name("some");
descriptor.Operation(DefaultOperations.Any).Name("any");
descriptor.Operation(DefaultOperations.And).Name("and");
descriptor.Operation(DefaultOperations.Or).Name("or");
descriptor.Operation(DefaultOperations.Data).Name("data");
descriptor.Operation(DefaultFilterOperations.Equals).Name("eq");
descriptor.Operation(DefaultFilterOperations.NotEquals).Name("neq");
descriptor.Operation(DefaultFilterOperations.GreaterThan).Name("gt");
descriptor.Operation(DefaultFilterOperations.NotGreaterThan).Name("ngt");
descriptor.Operation(DefaultFilterOperations.GreaterThanOrEquals).Name("gte");
descriptor.Operation(DefaultFilterOperations.NotGreaterThanOrEquals).Name("ngte");
descriptor.Operation(DefaultFilterOperations.LowerThan).Name("lt");
descriptor.Operation(DefaultFilterOperations.NotLowerThan).Name("nlt");
descriptor.Operation(DefaultFilterOperations.LowerThanOrEquals).Name("lte");
descriptor.Operation(DefaultFilterOperations.NotLowerThanOrEquals).Name("nlte");
descriptor.Operation(DefaultFilterOperations.Contains).Name("contains");
descriptor.Operation(DefaultFilterOperations.NotContains).Name("ncontains");
descriptor.Operation(DefaultFilterOperations.In).Name("in");
descriptor.Operation(DefaultFilterOperations.NotIn).Name("nin");
descriptor.Operation(DefaultFilterOperations.StartsWith).Name("startsWith");
descriptor.Operation(DefaultFilterOperations.NotStartsWith).Name("nstartsWith");
descriptor.Operation(DefaultFilterOperations.EndsWith).Name("endsWith");
descriptor.Operation(DefaultFilterOperations.NotEndsWith).Name("nendsWith");
descriptor.Operation(DefaultFilterOperations.All).Name("all");
descriptor.Operation(DefaultFilterOperations.None).Name("none");
descriptor.Operation(DefaultFilterOperations.Some).Name("some");
descriptor.Operation(DefaultFilterOperations.Any).Name("any");
descriptor.Operation(DefaultFilterOperations.And).Name("and");
descriptor.Operation(DefaultFilterOperations.Or).Name("or");
descriptor.Operation(DefaultFilterOperations.Data).Name("data");

return descriptor;
}
Expand All @@ -54,31 +54,33 @@ public static class FilterConventionDescriptorExtensions
}

descriptor
.BindRuntimeType<string, StringOperationFilterInput>()
.BindRuntimeType<bool, BooleanOperationFilterInput>()
.BindRuntimeType<byte, ComparableOperationFilterInput<byte>>()
.BindRuntimeType<short, ComparableOperationFilterInput<short>>()
.BindRuntimeType<int, ComparableOperationFilterInput<int>>()
.BindRuntimeType<long, ComparableOperationFilterInput<long>>()
.BindRuntimeType<float, ComparableOperationFilterInput<float>>()
.BindRuntimeType<double, ComparableOperationFilterInput<double>>()
.BindRuntimeType<decimal, ComparableOperationFilterInput<decimal>>()
.BindRuntimeType<Guid, ComparableOperationFilterInput<Guid>>()
.BindRuntimeType<DateTime, ComparableOperationFilterInput<DateTime>>()
.BindRuntimeType<DateTimeOffset, ComparableOperationFilterInput<DateTimeOffset>>()
.BindRuntimeType<TimeSpan, ComparableOperationFilterInput<TimeSpan>>()
.BindRuntimeType<bool?, BooleanOperationFilterInput>()
.BindRuntimeType<byte?, ComparableOperationFilterInput<byte?>>()
.BindRuntimeType<short?, ComparableOperationFilterInput<short?>>()
.BindRuntimeType<int?, ComparableOperationFilterInput<int?>>()
.BindRuntimeType<long?, ComparableOperationFilterInput<long?>>()
.BindRuntimeType<float?, ComparableOperationFilterInput<float?>>()
.BindRuntimeType<double?, ComparableOperationFilterInput<double?>>()
.BindRuntimeType<decimal?, ComparableOperationFilterInput<decimal?>>()
.BindRuntimeType<Guid?, ComparableOperationFilterInput<Guid?>>()
.BindRuntimeType<DateTime?, ComparableOperationFilterInput<DateTime?>>()
.BindRuntimeType<DateTimeOffset?, ComparableOperationFilterInput<DateTimeOffset?>>()
.BindRuntimeType<TimeSpan?, ComparableOperationFilterInput<TimeSpan?>>();
.BindRuntimeType<string, StringOperationFilterInputType>()
.BindRuntimeType<bool, BooleanOperationFilterInputType>()
.BindRuntimeType<byte, ComparableOperationFilterInputType<byte>>()
.BindRuntimeType<short, ComparableOperationFilterInputType<short>>()
.BindRuntimeType<int, ComparableOperationFilterInputType<int>>()
.BindRuntimeType<long, ComparableOperationFilterInputType<long>>()
.BindRuntimeType<float, ComparableOperationFilterInputType<float>>()
.BindRuntimeType<double, ComparableOperationFilterInputType<double>>()
.BindRuntimeType<decimal, ComparableOperationFilterInputType<decimal>>()
.BindRuntimeType<Guid, ComparableOperationFilterInputType<Guid>>()
.BindRuntimeType<DateTime, ComparableOperationFilterInputType<DateTime>>()
.BindRuntimeType<DateTimeOffset,
ComparableOperationFilterInputType<DateTimeOffset>>()
.BindRuntimeType<TimeSpan, ComparableOperationFilterInputType<TimeSpan>>()
.BindRuntimeType<bool?, BooleanOperationFilterInputType>()
.BindRuntimeType<byte?, ComparableOperationFilterInputType<byte?>>()
.BindRuntimeType<short?, ComparableOperationFilterInputType<short?>>()
.BindRuntimeType<int?, ComparableOperationFilterInputType<int?>>()
.BindRuntimeType<long?, ComparableOperationFilterInputType<long?>>()
.BindRuntimeType<float?, ComparableOperationFilterInputType<float?>>()
.BindRuntimeType<double?, ComparableOperationFilterInputType<double?>>()
.BindRuntimeType<decimal?, ComparableOperationFilterInputType<decimal?>>()
.BindRuntimeType<Guid?, ComparableOperationFilterInputType<Guid?>>()
.BindRuntimeType<DateTime?, ComparableOperationFilterInputType<DateTime?>>()
.BindRuntimeType<DateTimeOffset?,
ComparableOperationFilterInputType<DateTimeOffset?>>()
.BindRuntimeType<TimeSpan?, ComparableOperationFilterInputType<TimeSpan?>>();

return descriptor;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using HotChocolate.Types;
using HotChocolate.Types.Descriptors;
using HotChocolate.Utilities;
using static HotChocolate.Data.DataResources;
using static HotChocolate.Data.ThrowHelper;

namespace HotChocolate.Data.Filters
Expand All @@ -21,7 +20,8 @@ public class FilterConvention
: Convention<FilterConventionDefinition>
, IFilterConvention
{
private const string _typePostFix = "FilterInput";
private const string _inputPostFix = "FilterInput";
private const string _inputTypePostFix = "FilterInputType";

private Action<IFilterConventionDescriptor>? _configure;
private INamingConventions _namingConventions = default!;
Expand Down Expand Up @@ -51,7 +51,8 @@ public FilterConvention(Action<IFilterConventionDescriptor> configure)
{
if (_configure is null)
{
throw new InvalidOperationException(FilterConvention_NoConfigurationSpecified);
throw new InvalidOperationException(
DataResources.FilterConvention_NoConfigurationSpecified);
}

var descriptor = FilterConventionDescriptor.New(
Expand Down Expand Up @@ -119,11 +120,64 @@ public virtual NameString GetTypeName(Type runtimeType)
throw new ArgumentNullException(nameof(runtimeType));
}

if (typeof(IEnumOperationFilterInputType).IsAssignableFrom(runtimeType) &&
runtimeType.GenericTypeArguments.Length == 1 &&
runtimeType.GetGenericTypeDefinition() == typeof(EnumOperationFilterInputType<>))
{
NameString genericName =
_namingConventions.GetTypeName(runtimeType.GenericTypeArguments[0]);

return genericName.Value + "OperationFilterInput";
}

if (typeof(IComparableOperationFilterInputType).IsAssignableFrom(runtimeType) &&
runtimeType.GenericTypeArguments.Length == 1 &&
runtimeType.GetGenericTypeDefinition() ==
typeof(ComparableOperationFilterInputType<>))
{
NameString genericName =
_namingConventions.GetTypeName(runtimeType.GenericTypeArguments[0]);

return $"Comparable{genericName.Value}OperationFilterInput";
}

if (typeof(IListFilterInputType).IsAssignableFrom(runtimeType) &&
runtimeType.GenericTypeArguments.Length == 1 &&
runtimeType.GetGenericTypeDefinition() == typeof(ListFilterInputType<>))
{
Type genericType = runtimeType.GenericTypeArguments[0];
NameString genericName;
if (typeof(FilterInputType).IsAssignableFrom(genericType))
{
genericName = GetTypeName(genericType);
}
else
{
genericName = _namingConventions.GetTypeName(genericType);
}

return "List" + genericName.Value;
}

string name = _namingConventions.GetTypeName(runtimeType);

if (!name.EndsWith(_typePostFix, StringComparison.Ordinal))
var isInputObjectType = typeof(FilterInputType).IsAssignableFrom(runtimeType);
var isEndingInput = name.EndsWith(_inputPostFix, StringComparison.Ordinal);
var isEndingInputType = name.EndsWith(_inputTypePostFix, StringComparison.Ordinal);

if (isInputObjectType && isEndingInputType)
{
return name.Substring(0, name.Length - 4);
}

if (isInputObjectType && !isEndingInput && !isEndingInputType)
{
return name + _inputPostFix;
}

if (!isInputObjectType && !isEndingInput)
{
name += _typePostFix;
return name + _inputPostFix;
}

return name;
Expand Down Expand Up @@ -234,17 +288,17 @@ public NameString GetOperationName(int operation)

if (runtimeType.IsArrayOrList)
{
if (runtimeType.ElementType is {} &&
if (runtimeType.ElementType is { } &&
TryCreateFilterType(runtimeType.ElementType, out Type? elementType))
{
type = typeof(ListFilterInput<>).MakeGenericType(elementType);
type = typeof(ListFilterInputType<>).MakeGenericType(elementType);
return true;
}
}

if (runtimeType.Type.IsEnum)
{
type = typeof(EnumOperationFilterInput<>).MakeGenericType(runtimeType.Source);
type = typeof(EnumOperationFilterInputType<>).MakeGenericType(runtimeType.Source);
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public IFilterConventionDescriptor BindRuntimeType(Type runtimeType, Type filter
nameof(filterType));
}

Definition.Bindings.Add(runtimeType, filterType);
Definition.Bindings[runtimeType] = filterType;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ public class FilterTypeInterceptor
{
if (field is FilterFieldDefinition filterFieldDefinition)
{
if (filterFieldDefinition.Type is null)
{
throw ThrowHelper.FilterInterceptor_OperationHasNoTypeSpecified(
def,
filterFieldDefinition);
}

if (completionContext.TryPredictTypeKind(
filterFieldDefinition.Type,
out TypeKind kind) &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace HotChocolate.Data.Filters.Expressions
public class QueryableBooleanEqualsHandler
: QueryableBooleanOperationHandler
{
protected override int Operation => DefaultOperations.Equals;
protected override int Operation => DefaultFilterOperations.Equals;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace HotChocolate.Data.Filters.Expressions
public class QueryableBooleanNotEqualsHandler
: QueryableBooleanOperationHandler
{
protected override int Operation => DefaultOperations.NotEquals;
protected override int Operation => DefaultFilterOperations.NotEquals;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public abstract class QueryableBooleanOperationHandler
IFilterInputTypeDefinition typeDefinition,
IFilterFieldDefinition fieldDefinition)
{
return context.Type is BooleanOperationFilterInput &&
return context.Type is BooleanOperationFilterInputType &&
fieldDefinition is FilterOperationFieldDefinition operationField &&
operationField.Id == Operation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class QueryableComparableEqualsHandler
{
}

protected override int Operation => DefaultOperations.Equals;
protected override int Operation => DefaultFilterOperations.Equals;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class QueryableComparableGreaterThanHandler
CanBeNull = false;
}

protected override int Operation => DefaultOperations.GreaterThan;
protected override int Operation => DefaultFilterOperations.GreaterThan;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class QueryableComparableGreaterThanOrEqualsHandler
CanBeNull = false;
}

protected override int Operation => DefaultOperations.GreaterThanOrEquals;
protected override int Operation => DefaultFilterOperations.GreaterThanOrEquals;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class QueryableComparableInHandler
CanBeNull = false;
}

protected override int Operation => DefaultOperations.In;
protected override int Operation => DefaultFilterOperations.In;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class QueryableComparableLowerThanHandler
CanBeNull = false;
}

protected override int Operation => DefaultOperations.LowerThan;
protected override int Operation => DefaultFilterOperations.LowerThan;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class QueryableComparableLowerThanOrEqualsHandler
CanBeNull = false;
}

protected override int Operation => DefaultOperations.LowerThanOrEquals;
protected override int Operation => DefaultFilterOperations.LowerThanOrEquals;

public override Expression HandleOperation(
QueryableFilterContext context,
Expand Down