src/Epam.GraphQL/Configuration/Implementations/Fields/ChildFields/RootQueryableField.cs (108 lines of code) (raw):
// Copyright © 2020 EPAM Systems, Inc. All Rights Reserved. All information contained herein is, and remains the
// property of EPAM Systems, Inc. and/or its suppliers and is protected by international intellectual
// property law. Dissemination of this information or reproduction of this material is strictly forbidden,
// unless prior written permission is obtained from EPAM Systems, Inc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Epam.GraphQL.Configuration.Implementations.FieldResolvers;
using Epam.GraphQL.Diagnostics;
using Epam.GraphQL.Extensions;
using Epam.GraphQL.Helpers;
using Epam.GraphQL.Loaders;
using Epam.GraphQL.Search;
using Epam.GraphQL.Sorters.Implementations;
namespace Epam.GraphQL.Configuration.Implementations.Fields.ChildFields
{
internal sealed class RootQueryableField<TReturnType, TExecutionContext> :
RootQueryableFieldBase<
RootQueryableField<TReturnType, TExecutionContext>,
IRootQueryableField<TReturnType, TExecutionContext>,
TReturnType,
TExecutionContext>,
IRootQueryableField<TReturnType, TExecutionContext>
{
public RootQueryableField(
IChainConfigurationContext configurationContext,
BaseObjectGraphTypeConfigurator<object, TExecutionContext> parent,
string name,
Func<TExecutionContext, IQueryable<TReturnType>> query,
IGraphTypeDescriptor<TReturnType, TExecutionContext> elementGraphType,
ISearcher<TReturnType, TExecutionContext>? searcher,
IEnumerable<(LambdaExpression SortExpression, SortDirection SortDirection)> naturalSorters)
: base(
configurationContext,
parent,
name,
query: ctx => query(ctx.GetUserContext<TExecutionContext>()),
transform: (ctx, items) => items,
elementGraphType,
elementGraphType.Configurator,
arguments: null,
searcher,
naturalSorters)
{
}
public RootQueryableField(
IChainConfigurationContext configurationContext,
BaseObjectGraphTypeConfigurator<object, TExecutionContext> parent,
string name,
IRootQueryableResolver<TReturnType, TExecutionContext> resolver,
IGraphTypeDescriptor<TReturnType, TExecutionContext> elementGraphType,
IObjectGraphTypeConfigurator<TReturnType, TExecutionContext>? configurator,
LazyQueryArguments? arguments,
ISearcher<TReturnType, TExecutionContext>? searcher,
IEnumerable<(LambdaExpression SortExpression, SortDirection SortDirection)> naturalSorters)
: base(
configurationContext,
parent,
name,
resolver,
elementGraphType,
configurator,
arguments,
searcher,
naturalSorters)
{
}
public IVoid AsConnection(Expression<Func<IQueryable<TReturnType>, IOrderedQueryable<TReturnType>>> order)
{
var connectionField = new RootConnectionQueryableField<TReturnType, TExecutionContext>(
ConfigurationContext.Chain(nameof(AsConnection)).Argument(order),
Parent,
Name,
QueryableFieldResolver,
ElementGraphType,
ObjectGraphTypeConfigurator,
Arguments,
Searcher,
order.GetSorters());
return ApplyField(connectionField);
}
public IVoid AsGroupConnection()
{
var connectionField = new RootGroupConnectionQueryableField<TReturnType, TExecutionContext>(
ConfigurationContext.Chain(nameof(AsGroupConnection)),
Parent,
Name,
QueryableFieldResolver,
ElementGraphType,
ObjectGraphTypeConfigurator,
Arguments,
Searcher,
SortingHelpers.Empty);
return ApplyField(connectionField);
}
protected override RootQueryableField<TReturnType, TExecutionContext> ReplaceResolver(IChainConfigurationContext configurationContext, IRootQueryableResolver<TReturnType, TExecutionContext> resolver)
{
var queryableField = new RootQueryableField<TReturnType, TExecutionContext>(
configurationContext,
Parent,
Name,
resolver,
ElementGraphType,
ObjectGraphTypeConfigurator,
Arguments,
Searcher,
NaturalSorters);
return queryableField;
}
}
}