src/Epam.GraphQL/Builders/Projection/Implementations/ProjectionFieldBuilder.cs (78 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 System.Threading.Tasks;
using Epam.GraphQL.Builders.Loader;
using Epam.GraphQL.Configuration;
using Epam.GraphQL.Configuration.Implementations.Fields;
using Epam.GraphQL.Configuration.Implementations.Fields.ChildFields;
using Epam.GraphQL.Sorters.Implementations;
namespace Epam.GraphQL.Builders.Projection.Implementations
{
internal class ProjectionFieldBuilder<TField, TEntity, TExecutionContext> :
IProjectionField<TEntity, TExecutionContext>
where TField : FieldBase<TEntity, TExecutionContext>, IUnionableField<TEntity, TExecutionContext>
{
public ProjectionFieldBuilder(TField field)
{
Field = field;
}
protected TField Field { get; }
public IQueryableField<TEntity, TReturnType, TExecutionContext> FromIQueryable<TReturnType>(
Func<TExecutionContext, IQueryable<TReturnType>> query,
Expression<Func<TEntity, TReturnType, bool>> condition,
Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build)
{
var configurationContext = Field.ConfigurationContext.Chain<TReturnType>(nameof(FromIQueryable))
.Argument(query)
.Argument(condition)
.OptionalArgument(build);
var graphType = Field.Parent.GetGraphQLTypeDescriptor(Field, build, configurationContext);
var result = new QueryableField<TEntity, TReturnType, TExecutionContext>(
configurationContext,
Field.Parent,
Field.Name,
query,
condition,
graphType,
searcher: null,
naturalSorters: SortingHelpers.Empty);
return Field.Parent.ReplaceField(Field, result);
}
public void Resolve<TReturnType>(Func<TExecutionContext, TEntity, TReturnType> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build)
{
Field.Resolve(resolve, build);
}
public void Resolve<TReturnType>(Func<TExecutionContext, TEntity, Task<TReturnType>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build)
{
Field.Resolve(resolve, build);
}
public void Resolve<TReturnType>(Func<TExecutionContext, TEntity, IEnumerable<TReturnType>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build)
{
Field.Resolve(resolve, build);
}
public void Resolve<TReturnType>(Func<TExecutionContext, TEntity, Task<IEnumerable<TReturnType>>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build)
{
Field.Resolve(resolve, build);
}
public IUnionableField<TEntity, TExecutionContext> AsUnionOf<TType>(Action<IInlineObjectBuilder<TType, TExecutionContext>>? build)
{
return Field.AsUnionOf(build);
}
public IUnionableField<TEntity, TExecutionContext> AsUnionOf<TEnumerable, TElementType>(Action<IInlineObjectBuilder<TElementType, TExecutionContext>>? build)
where TEnumerable : IEnumerable<TElementType>
{
return Field.AsUnionOf(build);
}
public IUnionableField<TEntity, TExecutionContext> And<TType>(Action<IInlineObjectBuilder<TType, TExecutionContext>>? build)
{
return Field.And(build);
}
public IUnionableField<TEntity, TExecutionContext> And<TEnumerable, TElementType>(Action<IInlineObjectBuilder<TElementType, TExecutionContext>>? build)
where TEnumerable : IEnumerable<TElementType>
{
return Field.And(build);
}
}
}