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

Allow to override valueconverter on FilterParser #1401

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace JsonApiDotNetCore.Queries.Parsing;

/// <summary>
/// Converts a constant value within a query string parameter to an <see cref="object" />.
/// </summary>
/// <param name="value">
/// The constant value to convert from.
/// </param>
/// <param name="position">
/// The zero-based position of <paramref name="value" /> in the query string parameter value.
/// </param>
/// <returns>
/// The converted object instance.
/// </returns>
public delegate object ConstantValueConverter(string value, int position);
16 changes: 8 additions & 8 deletions src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -252,21 +252,21 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm)

var leftAttribute = (AttrAttribute)leftLastField;

Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
return ParseTypedComparisonRightTerm(leftAttribute.Property.PropertyType, constantValueConverter);
}

if (leftTerm is FunctionExpression leftFunction)
{
Func<string, int, object> constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
ConstantValueConverter constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
return ParseTypedComparisonRightTerm(leftFunction.ReturnType, constantValueConverter);
}

throw new InvalidOperationException(
$"Internal error: Expected left term to be a function or field chain, instead of '{leftTerm.GetType().Name}': '{leftTerm}'.");
}

private QueryExpression ParseTypedComparisonRightTerm(Type leftType, Func<string, int, object> constantValueConverter)
private QueryExpression ParseTypedComparisonRightTerm(Type leftType, ConstantValueConverter constantValueConverter)
{
bool allowNull = RuntimeTypeConverter.CanContainNull(leftType);

Expand Down Expand Up @@ -329,7 +329,7 @@ protected virtual MatchTextExpression ParseTextMatch(string operatorName)

EatSingleCharacterToken(TokenKind.Comma);

Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
LiteralConstantExpression constant = ParseConstant(constantValueConverter);

EatSingleCharacterToken(TokenKind.CloseParen);
Expand All @@ -352,7 +352,7 @@ protected virtual AnyExpression ParseAny()

ImmutableHashSet<LiteralConstantExpression>.Builder constantsBuilder = ImmutableHashSet.CreateBuilder<LiteralConstantExpression>();

Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
LiteralConstantExpression constant = ParseConstant(constantValueConverter);
constantsBuilder.Add(constant);

Expand Down Expand Up @@ -489,7 +489,7 @@ private static ResourceType ResolveDerivedType(ResourceType baseType, string der
return filter;
}

private LiteralConstantExpression ParseConstant(Func<string, int, object> constantValueConverter)
private LiteralConstantExpression ParseConstant(ConstantValueConverter constantValueConverter)
{
int position = GetNextTokenPositionOrEnd();

Expand All @@ -514,7 +514,7 @@ private NullConstantExpression ParseNull()
throw new QueryParseException("null expected.", position);
}

private static Func<string, int, object> GetConstantValueConverterForType(Type destinationType)
protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType)
{
return (stringValue, position) =>
{
Expand All @@ -529,7 +529,7 @@ private NullConstantExpression ParseNull()
};
}

private Func<string, int, object> GetConstantValueConverterForAttribute(AttrAttribute attribute)
private ConstantValueConverter GetConstantValueConverterForAttribute(AttrAttribute attribute)
{
if (attribute is { Property.Name: nameof(Identifiable<object>.Id) })
{
Expand Down