public void CreateEntity <TRecord>(IRecordCollectionGetter <TRecord> getter, Func <IPaperContext, TPaperInstance, TData, ICollection <TRecord>, TRecord, Entity> entityFactory) { this.statements.Add(ctx => { if (ctx.OutgoingData.IsPayload) { return; } var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var nodes = getter.GetNodes(ctx); var records = getter.GetRecords(ctx); if (!ctx.Cache.ContainsKey(EntityKey)) { ctx.Cache[EntityKey] = CreateDefaultEntity(@object: null); } foreach (var node in nodes) { node.Entity = entityFactory.Invoke(ctx, host, data, records, node.Record); var parent = node.Parent?.Entity ?? (Entity)ctx.Cache[EntityKey]; parent.Add(node.Entity); } }); }
public void FormatEntity <TRecord>(IRecordCollectionGetter <TRecord> getter, Action <IPaperContext, TPaperInstance, TData, ICollection <TRecord>, TRecord, Entity> formatter) { this.statements.Add(ctx => { if (ctx.OutgoingData.IsPayload) { return; } var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var nodes = getter.GetNodes(ctx); var records = getter.GetRecords(ctx); foreach (var node in nodes) { if (node.Entity == null) { node.Entity = CreateDefaultEntity(node.Record); var parent = node.Parent?.Entity ?? (Entity)ctx.Cache[EntityKey]; parent.Add(node.Entity); } formatter.Invoke(ctx, host, data, records, node.Record, node.Entity); } }); }
public IRecordCollectionGetter <TRecord> PopulateRecords <TRef, TRecord>(IRecordCollectionGetter <TRef> @ref, Func <IPaperContext, TPaperInstance, TData, TRef, ICollection <TRecord> > populator) { var recordKey = $"Record-{Guid.NewGuid():B}"; var nodeKey = $"Node-{recordKey}"; this.statements.Add(ctx => { var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var recordArray = new List <ICollection <TRecord> >(); var nodeArray = new List <ICollection <INode <TRecord> > >(); var items = @ref.GetNodes(ctx); foreach (var parent in items) { var records = populator.Invoke(ctx, host, data, parent.Record); var nodes = records.Select(x => new Node <TRecord> { Parent = parent, Record = x }).ToArray(); recordArray.Add(records); nodeArray.Add(nodes); } ctx.Cache[recordKey] = recordArray; ctx.Cache[nodeKey] = nodeArray; }); return(new RecordCollectionGetter <TRecord>(recordKey, nodeKey)); }