Пример #1
0
        public static IList <StormResult> ToResults(StormDataSet data,
                                                    SchemaNavigator navigator,
                                                    List <Origin> requests,
                                                    OriginTree fromTree)
        {
            var root        = navigator.GetEntity(data.root);
            var ranges      = data.ObjectRanges;
            var primaryKeys = data.IdentityIndexes;
            var items       = new Dictionary <EntityPath, Dictionary <object, StormResult> >();
            var results     = new List <StormResult>();

            for (int i = 0; i < data.Count(); i++)
            {
                var ctx = new RecCtx()
                {
                    Data        = data,
                    Index       = i,
                    PrimaryKeys = primaryKeys,
                    Ranges      = ranges,
                    Root        = root
                };

                var(pk, r) = CreateResult(fromTree.root, ctx);

                if (!results.Any(x => x.PrimaryKey == pk))
                {
                    results.Add(r);
                }

                r = results.First(x => x.PrimaryKey == pk);
                CreateResultRelations(ctx, requests.Where(x => x.FullPath != fromTree.root.FullPath).ToList(), r);
            }

            return(results);
        }
Пример #2
0
        static (Object, StormResult) CreateResult(Origin fromNode, RecCtx ctx)
        {
            var range      = ctx.Ranges[fromNode.Entity];
            var row        = new StormRow(ctx.Data, ctx.Index, range.Start, range.End);
            var primaryKey = row[ctx.PrimaryKeys[fromNode.FullPath]];

            return(primaryKey, new StormResult(row, fromNode.Entity));
        }
Пример #3
0
        static void CreateResultRelations(RecCtx ctx,
                                          List <Origin> requests,
                                          StormResult result)
        {
            if (requests.Any())
            {
                var r1 = requests.First();
                var(pk, res) = CreateResult(r1, ctx);

                if (!result.Relations.ContainsKey(r1.FullPath.Path))
                {
                    result.Relations.Add(r1.FullPath.Path, new List <StormResult>());
                }

                if (!result.Relations[r1.FullPath.Path].Any(x => x.PrimaryKey == pk))
                {
                    ((List <StormResult>)result.Relations[r1.FullPath.Path]).Add(res);
                }

                CreateResultRelations(ctx, requests.Skip(1).ToList(), result);
            }
        }