Esempio n. 1
0
        public void CreateEntity <TRecord>(IRecordObjectGetter <TRecord> getter, Func <IPaperContext, TPaperInstance, TData, 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 node = getter.GetNode(ctx);

                node.Entity = entityFactory.Invoke(ctx, host, data, node.Record);

                if (node.Parent?.Entity is Entity parent)
                {
                    parent.Add(node.Entity);
                }
                else
                {
                    ctx.Cache[EntityKey] = node.Entity;
                }
            });
        }
Esempio n. 2
0
        public IRecordCollectionGetter <TRecord> PopulateRecords <TRef, TRecord>(IRecordObjectGetter <TRef> @ref, Func <IPaperContext, TPaperInstance, TData, TRef, ICollection <TRecord> > populator)
        {
            var recordsKey = $"Records-{Guid.NewGuid():B}";
            var nodesKey   = $"Nodes-{recordsKey}";

            this.statements.Add(ctx =>
            {
                var parent  = @ref.GetNode(ctx);
                var host    = (TPaperInstance)ctx.Cache[PaperInstanceKey];
                var data    = (TData)ctx.Cache[DataKey];
                var records = populator.Invoke(ctx, host, data, parent.Record);
                var nodes   = records.Select(x => new Node <TRecord> {
                    Parent = parent, Record = x
                }).ToArray();
                ctx.Cache[recordsKey] = records;
                ctx.Cache[nodesKey]   = nodes;
            });
            return(new RecordCollectionGetter <TRecord>(recordsKey, nodesKey));
        }
Esempio n. 3
0
        public IRecordObjectGetter <TRecord> PopulateRecord <TRef, TRecord>(IRecordObjectGetter <TRef> @ref, Func <IPaperContext, TPaperInstance, TData, TRef, TRecord> populator)
        {
            var recordKey = $"Record-{Guid.NewGuid():B}";
            var nodeKey   = $"Node-{recordKey}";

            this.statements.Add(ctx =>
            {
                var parent = @ref.GetNode(ctx);
                var host   = (TPaperInstance)ctx.Cache[PaperInstanceKey];
                var data   = (TData)ctx.Cache[DataKey];
                var record = populator.Invoke(ctx, host, data, parent.Record);
                var node   = new Node <TRecord> {
                    Parent = parent, Record = record
                };
                ctx.Cache[recordKey] = record;
                ctx.Cache[nodeKey]   = node;
            });
            return(new RecordGetter <TRecord>(recordKey, nodeKey));
        }
Esempio n. 4
0
        public void FormatEntity <TRecord>(IRecordObjectGetter <TRecord> getter, Action <IPaperContext, TPaperInstance, TData, 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 node = getter.GetNode(ctx);

                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, node.Record, node.Entity);
            });
        }