Skip to content

Commit

Permalink
Reworked Filter Naming Conventions (#2618)
Browse files Browse the repository at this point in the history
  • Loading branch information
PascalSenn authored and michaelstaib committed Nov 27, 2020
1 parent 1d409e7 commit db5452e
Show file tree
Hide file tree
Showing 203 changed files with 2,095 additions and 1,677 deletions.
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

0 comments on commit db5452e

Please sign in to comment.