-
-
Notifications
You must be signed in to change notification settings - Fork 725
/
QueryableSortInterceptor.cs
68 lines (63 loc) · 2.83 KB
/
QueryableSortInterceptor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using HotChocolate.Data.Projections.Expressions;
using HotChocolate.Data.Projections.Expressions.Handlers;
using HotChocolate.Data.Sorting;
using HotChocolate.Data.Sorting.Expressions;
using HotChocolate.Execution.Processing;
using HotChocolate.Types;
using static HotChocolate.Data.ErrorHelper;
using static HotChocolate.Data.Sorting.Expressions.QueryableSortProvider;
namespace HotChocolate.Data.Projections.Handlers
{
public class QueryableSortInterceptor
: IProjectionFieldInterceptor<QueryableProjectionContext>
{
public bool CanHandle(ISelection selection) =>
selection.Field.Member is {} &&
selection.Field.ContextData.ContainsKey(ContextVisitSortArgumentKey) &&
selection.Field.ContextData.ContainsKey(ContextArgumentNameKey);
public void BeforeProjection(
QueryableProjectionContext context,
ISelection selection)
{
IObjectField field = selection.Field;
IReadOnlyDictionary<string, object?> contextData = field.ContextData;
if (contextData.TryGetValue(ContextArgumentNameKey, out object? arg) &&
arg is NameString argumentName &&
contextData.TryGetValue(ContextVisitSortArgumentKey, out object? argVisitor) &&
argVisitor is VisitSortArgument argumentVisitor &&
context.Selection.Count > 0 &&
context.Selection.Peek()
.Arguments.TryCoerceArguments(
context.Context.Variables,
context.Context.ReportError,
out IReadOnlyDictionary<NameString, ArgumentValue>? coercedArgs) &&
coercedArgs.TryGetValue(argumentName, out var argumentValue) &&
argumentValue.Argument.Type is ListType lt &&
lt.ElementType is ISortInputType sortInputType &&
argumentValue.ValueLiteral is {} valueNode)
{
QueryableSortContext sortContext =
argumentVisitor(valueNode, sortInputType, false);
Expression instance = context.PopInstance();
if (sortContext.Errors.Count == 0)
{
context.PushInstance(sortContext.Compile(instance));
}
else
{
context.PushInstance(
Expression.Constant(
Array.CreateInstance(sortInputType.EntityType.Source, 0)));
context.ReportError(
ProjectionProvider_CouldNotProjectSorting(valueNode));
}
}
}
public void AfterProjection(QueryableProjectionContext context, ISelection selection)
{
}
}
}