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); }
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); } }
public FramingPlan MakePlan(ProjectionElement root, int depth, ParameterNames pars) { var plan = new FramingPlan(root, _settingsHolder.Settings.CheckMode); CheckNodeVariants(plan, root, depth, pars); return(plan); }
//внутренний дл¤ тестировани¤ 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; }
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); }
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); }
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)); }
public FramingPlan MakePlan(ProjectionElement root, int depth,ParameterNames pars) { var plan = new FramingPlan(root,_settingsHolder.Settings.CheckMode); CheckNodeVariants(plan, root , depth, pars); return plan; }
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); } }
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); }
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); }