Пример #1
0
        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);
                }
            });
        }
Пример #2
0
        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);
                }
            });
        }
Пример #3
0
        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));
        }