Ejemplo n.º 1
0
        public Provider GetOrCreateAccumulator(FramingPlan plan, Getter getter, ProjectionElement parent, ProjectionElement child, ParameterNames parameters)
        {
            var alreadyCreated =
                _cache.FirstOrDefault(k => k.Child == child &&
                                      k.Parent == parent &&
                                      k.Parameters == parameters);

            if (alreadyCreated != null)
            {
                return(alreadyCreated.Provider);
            }

            var storage = new GroupStorage(FrameNode.InPlanComparer);

            plan.AddTempStorage(storage);
            var pusher    = CreatePusher(storage);
            var checker   = CreateChecker(storage);
            var taker     = CreateGetter(storage);
            var packTaker = CreatePackagerGetter(getter, parameters);

            var acc = new Provider(pusher, checker,
                                   taker, packTaker,
                                   FrameNode.InPlanComparer);
            var node = new FactoryNode
            {
                Parent     = parent,
                Child      = child,
                Parameters = parameters,
                Provider   = acc
            };

            _cache.Add(node);
            return(acc);
        }
Ejemplo n.º 2
0
        private void CheckNodeVariants(FramingPlan plan, ProjectionElement element, int depth, ParameterNames orderedParameters)
        {
            Contract.Requires(element != null);
            Contract.Requires(plan != null);
            Contract.Requires(orderedParameters != null);

            var nodes            = MakeAllPossibleWays(element, orderedParameters, depth);
            var nodesWithQueries = FindMatchedQueries(nodes);

            foreach (var secondaryFrameNode in nodesWithQueries)
            {
                foreach (var source in secondaryFrameNode.UsingParameters
                         .ParameterNames)
                {
                    if (orderedParameters.Any(k => string.Equals(k, source, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        //   Debug.Assert(secondaryFrameNode.Query.Conversions.ContainsKey(source), "secondaryFrameNode.Query.Conversions.ContainsKey(source), source:"+source);
                        plan.AddConversion(source, secondaryFrameNode.Query.GetConversionForParameter(source));
                    }
                }
            }
            nodesWithQueries = FillPriorityGroupAndCleanDuplicates(nodesWithQueries);
            var factory = new AccumulatorFactory();

            foreach (var secondaryFrameNode in nodesWithQueries)
            {
                MakePlanStepFromSecondary(plan, factory, secondaryFrameNode);
            }
        }
Ejemplo n.º 3
0
        public FramingPlan MakePlan(ProjectionElement root, int depth, ParameterNames pars)
        {
            var plan = new FramingPlan(root, _settingsHolder.Settings.CheckMode);

            CheckNodeVariants(plan, root, depth, pars);
            return(plan);
        }
Ejemplo n.º 4
0
        //внутренний дл¤ тестировани¤
        internal TOutStream RealisePlan <TOutStream>(FramingPlan plan, Guid rootKey, string nmspc, int maxDepth, Streamer <TOutStream> streamer, Dictionary <string, object> parameters)
        {
            var frame       = plan.MakeFrame(rootKey, maxDepth, parameters);
            var filledFrame = _planFiller.FillFrame(frame);
            var stream      = streamer.StreamFilledFrames(filledFrame, nmspc);

            return(stream);
        }
 private Accumulator<FrameNode, IEnumerable<Guid>> GetAccumulator(Relation relation,Query query)
 {
     var factory = new AccumulatorFactory();
     var plan = new FramingPlan(relation.ParentElement);
     var acc = factory.GetOrCreateAccumulator(plan,
                                 (keys, parPairs) =>
                                     query.GetMultipleChildResourceQuery(relation.ParentElement.Name,parPairs.Select(k=>k.Key).ToArray())(keys,parPairs.Select(k=>k.Value).ToArray()),
                               relation.ParentElement, relation.ChildElement, new ParameterNames());
     return acc;
 }
Ejemplo n.º 6
0
 private void MakePlanStepFromSecondary(FramingPlan plan, AccumulatorFactory accumulator, SecondaryFrameNode node)
 {
     plan.AddNewStep(node.Parent,
                     node.Current,
                     node.UsingParameters.ParameterNames,
                     node.AllParameters,
                     GetAccumulatorForSecondary(plan, node, accumulator),
                     node.PriorityGroup,
                     node.Query);
 }
Ejemplo n.º 7
0
        private Accumulator <FrameNode, IEnumerable <Guid> > GetAccumulator(Relation relation, Query query)
        {
            var factory = new AccumulatorFactory();
            var plan    = new FramingPlan(relation.ParentElement);
            var acc     = factory.GetOrCreateAccumulator(plan,
                                                         (keys, parPairs) =>
                                                         query.GetMultipleChildResourceQuery(relation.ParentElement.Name, parPairs.Select(k => k.Key).ToArray())(keys, parPairs.Select(k => k.Value).ToArray()),
                                                         relation.ParentElement, relation.ChildElement, new ParameterNames());

            return(acc);
        }
Ejemplo n.º 8
0
 private Accumulator <FrameNode, IEnumerable <Guid> > GetAccumulatorForSecondary(FramingPlan plan, SecondaryFrameNode node, AccumulatorFactory accumulator)
 {
     return(accumulator.GetOrCreateAccumulator(plan, node.Getter,
                                               node.Parent,
                                               node.Current,
                                               node.UsingParameters.ParameterNames));
 }
Ejemplo n.º 9
0
 public FramingPlan MakePlan(ProjectionElement root, int depth,ParameterNames pars)
 {           
     var plan = new FramingPlan(root,_settingsHolder.Settings.CheckMode);           
     CheckNodeVariants(plan, root , depth, pars);
     return plan;
 }
Ejemplo n.º 10
0
 private void CheckNodeVariants(FramingPlan plan, ProjectionElement element, int depth, ParameterNames orderedParameters)
 {
     Contract.Requires(element != null);
     Contract.Requires(plan != null);
     Contract.Requires(orderedParameters != null);
     
     var nodes = MakeAllPossibleWays(element, orderedParameters, depth);
     var nodesWithQueries = FindMatchedQueries(nodes);
     foreach (var secondaryFrameNode in nodesWithQueries)
     {
         foreach (var  source in secondaryFrameNode.UsingParameters
                                                   .ParameterNames)
         {
             if (orderedParameters.Any(k => string.Equals(k, source, StringComparison.InvariantCultureIgnoreCase)))
             {
              //   Debug.Assert(secondaryFrameNode.Query.Conversions.ContainsKey(source), "secondaryFrameNode.Query.Conversions.ContainsKey(source), source:"+source);
                 plan.AddConversion(source, secondaryFrameNode.Query.GetConversionForParameter(source));
             }
         }
        
     }
     nodesWithQueries = FillPriorityGroupAndCleanDuplicates(nodesWithQueries);
     var factory = new AccumulatorFactory();
     foreach (var secondaryFrameNode in nodesWithQueries)
     {
         MakePlanStepFromSecondary(plan, factory,secondaryFrameNode);
     }          
 }
Ejemplo n.º 11
0
 private void MakePlanStepFromSecondary(FramingPlan plan, AccumulatorFactory accumulator, SecondaryFrameNode node)
 {
     plan.AddNewStep(node.Parent,
                     node.Current,
                     node.UsingParameters.ParameterNames,
                     node.AllParameters,
                     GetAccumulatorForSecondary(plan,node,accumulator),
                     node.PriorityGroup,
                     node.Query);
 }
Ejemplo n.º 12
0
 private Accumulator<FrameNode, IEnumerable<Guid>> GetAccumulatorForSecondary(FramingPlan plan, SecondaryFrameNode node, AccumulatorFactory accumulator)
 {
     return accumulator.GetOrCreateAccumulator(plan,node.Getter,
                                               node.Parent, 
                                               node.Current,
                                               node.UsingParameters.ParameterNames);
 }