示例#1
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);
            }
        }
 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;
 }
示例#3
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);
 }
示例#4
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);
        }
示例#5
0
        object GetDefaultValue(string selector)
        {
            if (_defaultValues == null)
            {
                _defaultValues = new Dictionary <string, object>();
            }

            if (!_defaultValues.ContainsKey(selector))
            {
                var expr = CompileAccessorExpression(_typeParam, selector);
                var acc  = AccumulatorFactory.Create(Utils.StripNullableType(expr.Type));
                _defaultValues[selector] = acc.GetValue();
            }

            return(_defaultValues[selector]);
        }
        public override void Step(T container, string selector)
        {
            var value = Accessor.Read(container, selector);

            if (value != null)
            {
                if (_accumulator == null)
                {
                    _accumulator = AccumulatorFactory.Create(value.GetType());
                }

                try {
                    _accumulator.Add(value);
                } catch (FormatException) {
                } catch (InvalidCastException) {
                }
            }
        }
示例#7
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));
 }
示例#8
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);
     }          
 }
示例#9
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);
 }
示例#10
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);
 }