in src/Epam.GraphQL/Loaders/MutableLoader.cs [564:641]
private async Task ReloadAsync(IResolveFieldContext context, SaveResult<TEntity, TId, TExecutionContext> saveResult, IEnumerable<string> fieldNames)
{
if (!fieldNames.Any())
{
return;
}
fieldNames = fieldNames.Concat(new[] { IdExpression.NameOf() }).Distinct();
var profiler = context.GetProfiler();
using (profiler.Step($"{GetType().HumanizedName()}.{nameof(ReloadAsync)}"))
{
var batcher = context.GetBatcher();
var ctx = context.GetUserContext<TExecutionContext>();
var dataContext = context.GetDataContext();
var queryExecuter = context.GetQueryExecuter();
var batch = BatchHelpers.GetLoaderQueryFactory<MutableLoader<TEntity, TId, TExecutionContext>, TEntity, TId, TExecutionContext>(
() => "ReloadAsync", this, IdExpression)(profiler, queryExecuter, null, ctx); // TBD hookExecuter is null here
var entities = saveResult.ProcessedItems;
var payloads = entities
.Where(e => e.Payload != null)
.Select(e => e.Payload!);
payloads.ForEach(item => dataContext.DetachEntity(item));
var ids = payloads.Select(GetId);
// That portion of reload goes against batcher
var reloadedEntities = await batch.LoadAsync(ids).GetResultAsync().ConfigureAwait(false);
var errors = new List<string>();
foreach (var entity in entities)
{
if (entity.Payload == null)
{
continue;
}
var id = GetId(entity.Payload);
var result = reloadedEntities
.Where(reloaded => reloaded != null && EqualityComparer<TId>.Default.Equals(reloaded.Key, id))
.ToList();
if (!result.Any())
{
entity.Payload = default;
}
else if (result.Count > 1)
{
errors.Add($"Cannot reload entity: More than one entity was found (type: {typeof(TEntity).HumanizedName()}: id = {id})");
}
else
{
var group = result.Single().ToList();
if (!group.Any())
{
entity.Payload = default;
}
else if (group.Count > 1)
{
errors.Add($"Cannot reload entity: More than one entity was found (type: {typeof(TEntity).HumanizedName()}: id = {id})");
}
else
{
entity.Payload = group.Single();
}
}
}
if (errors.Any())
{
throw new ExecutionError(string.Join("\n\r", errors));
}
}
}