From a6a8149811ebb4819d51233f69863e64b99c8174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Tue, 21 Nov 2023 19:16:04 +0100 Subject: [PATCH 1/6] Allow to override converters on FilterParser --- src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index 1af9656154..28fcfb4c09 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -514,7 +514,7 @@ private NullConstantExpression ParseNull() throw new QueryParseException("null expected.", position); } - private static Func GetConstantValueConverterForType(Type destinationType) + protected static Func GetConstantValueConverterForType(Type destinationType) { return (stringValue, position) => { @@ -529,7 +529,7 @@ private static Func GetConstantValueConverterForType(Type d }; } - private Func GetConstantValueConverterForAttribute(AttrAttribute attribute) + protected Func GetConstantValueConverterForAttribute(AttrAttribute attribute) { if (attribute is { Property.Name: nameof(Identifiable.Id) }) { From 13d9e00e4d1d8398f93a6d9aadc6333411a44e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 22 Nov 2023 04:40:23 +0100 Subject: [PATCH 2/6] Make non static and virtual --- src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index 28fcfb4c09..7ffc25b3d0 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -514,7 +514,7 @@ private NullConstantExpression ParseNull() throw new QueryParseException("null expected.", position); } - protected static Func GetConstantValueConverterForType(Type destinationType) + protected virtual Func GetConstantValueConverterForType(Type destinationType) { return (stringValue, position) => { @@ -529,7 +529,7 @@ protected static Func GetConstantValueConverterForType(Type }; } - protected Func GetConstantValueConverterForAttribute(AttrAttribute attribute) + private Func GetConstantValueConverterForAttribute(AttrAttribute attribute) { if (attribute is { Property.Name: nameof(Identifiable.Id) }) { From b4094c53de4dccde11fc47668f0e2bf85418d371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 22 Nov 2023 14:48:26 +0100 Subject: [PATCH 3/6] Replace anon Func type with delegate --- .../Queries/Parsing/FilterParser.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index 5d1ce71552..aa8c19ee07 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -252,13 +252,13 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm) var leftAttribute = (AttrAttribute)leftLastField; - Func constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute); return ParseTypedComparisonRightTerm(leftAttribute.Property.PropertyType, constantValueConverter); } if (leftTerm is FunctionExpression leftFunction) { - Func constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType); return ParseTypedComparisonRightTerm(leftFunction.ReturnType, constantValueConverter); } @@ -266,7 +266,7 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm) $"Internal error: Expected left term to be a function or field chain, instead of '{leftTerm.GetType().Name}': '{leftTerm}'."); } - private QueryExpression ParseTypedComparisonRightTerm(Type leftType, Func constantValueConverter) + private QueryExpression ParseTypedComparisonRightTerm(Type leftType, ConstantValueConverter constantValueConverter) { bool allowNull = RuntimeTypeConverter.CanContainNull(leftType); @@ -329,7 +329,7 @@ protected virtual MatchTextExpression ParseTextMatch(string operatorName) EatSingleCharacterToken(TokenKind.Comma); - Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); LiteralConstantExpression constant = ParseConstant(constantValueConverter); EatSingleCharacterToken(TokenKind.CloseParen); @@ -352,7 +352,7 @@ protected virtual AnyExpression ParseAny() ImmutableHashSet.Builder constantsBuilder = ImmutableHashSet.CreateBuilder(); - Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); LiteralConstantExpression constant = ParseConstant(constantValueConverter); constantsBuilder.Add(constant); @@ -489,7 +489,7 @@ private static ResourceType ResolveDerivedType(ResourceType baseType, string der return filter; } - private LiteralConstantExpression ParseConstant(Func constantValueConverter) + private LiteralConstantExpression ParseConstant(ConstantValueConverter constantValueConverter) { int position = GetNextTokenPositionOrEnd(); @@ -514,7 +514,19 @@ private NullConstantExpression ParseNull() throw new QueryParseException("null expected.", position); } - protected virtual Func GetConstantValueConverterForType(Type destinationType) + /// + /// Converts a constant value within a query string parameter to an . + /// + /// + /// The constant value to convert from. + /// + /// The zero-based position of in the query string parameter value. + /// + /// The converted object instance. + /// + public delegate object ConstantValueConverter(string value, int position); + + protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType) { return (stringValue, position) => { @@ -529,7 +541,7 @@ protected virtual Func GetConstantValueConverterForType(Typ }; } - private Func GetConstantValueConverterForAttribute(AttrAttribute attribute) + private ConstantValueConverter GetConstantValueConverterForAttribute(AttrAttribute attribute) { if (attribute is { Property.Name: nameof(Identifiable.Id) }) { From 410d8f05bdc26b492162d0eeffccecb5828cb58e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 22 Nov 2023 14:51:50 +0100 Subject: [PATCH 4/6] Fix docs --- src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index aa8c19ee07..faaf960866 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -520,7 +520,9 @@ private NullConstantExpression ParseNull() /// /// The constant value to convert from. /// - /// The zero-based position of in the query string parameter value. + /// + /// The zero-based position of in the query string parameter value. + /// /// /// The converted object instance. /// From 5cfc2adc85a6052abf1a5279fca9b4bb3002144d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 22 Nov 2023 16:19:45 +0100 Subject: [PATCH 5/6] cleanupcode.ps1 --- .../Queries/Parsing/FilterParser.cs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index faaf960866..f9fd9b892b 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -514,20 +514,6 @@ private NullConstantExpression ParseNull() throw new QueryParseException("null expected.", position); } - /// - /// Converts a constant value within a query string parameter to an . - /// - /// - /// The constant value to convert from. - /// - /// - /// The zero-based position of in the query string parameter value. - /// - /// - /// The converted object instance. - /// - public delegate object ConstantValueConverter(string value, int position); - protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType) { return (stringValue, position) => @@ -599,6 +585,20 @@ private void AssertResourceTypeStackIsEmpty() } } + /// + /// Converts a constant value within a query string parameter to an . + /// + /// + /// The constant value to convert from. + /// + /// + /// The zero-based position of in the query string parameter value. + /// + /// + /// The converted object instance. + /// + public delegate object ConstantValueConverter(string value, int position); + private sealed class PopResourceTypeOnDispose : IDisposable { private readonly Stack _resourceTypeStack; From 4a708553ba11d82979fdfa647826bd0fd85abdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Wed, 22 Nov 2023 21:46:43 +0100 Subject: [PATCH 6/6] Move to separate unit --- .../Queries/Parsing/ConstantValueConverter.cs | 15 +++++++++++++++ .../Queries/Parsing/FilterParser.cs | 14 -------------- 2 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs diff --git a/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs new file mode 100644 index 0000000000..d624964ddd --- /dev/null +++ b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs @@ -0,0 +1,15 @@ +namespace JsonApiDotNetCore.Queries.Parsing; + +/// +/// Converts a constant value within a query string parameter to an . +/// +/// +/// The constant value to convert from. +/// +/// +/// The zero-based position of in the query string parameter value. +/// +/// +/// The converted object instance. +/// +public delegate object ConstantValueConverter(string value, int position); diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index f9fd9b892b..19757bbd08 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -585,20 +585,6 @@ private void AssertResourceTypeStackIsEmpty() } } - /// - /// Converts a constant value within a query string parameter to an . - /// - /// - /// The constant value to convert from. - /// - /// - /// The zero-based position of in the query string parameter value. - /// - /// - /// The converted object instance. - /// - public delegate object ConstantValueConverter(string value, int position); - private sealed class PopResourceTypeOnDispose : IDisposable { private readonly Stack _resourceTypeStack;