public override void EvaluateInternal(H holder, MemberInfo groupKey)
        {
            // вычисляем переменную из котрой следует получить значения
            CalculatedVariable <H, T, I> basedVar = (CalculatedVariable <H, T, I>)DependsOn.Single();

            // check basedVar.Period == this.Period; (они должны совпадать)
            basedVar.Evaluate(holder, groupKey, LastMoniker);

            var periods = Period.Periods.Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name));

            if (Shift >= 0)
            {
                ShiftData(basedVar, periods, Shift);
            }
            else
            {
                var p2 = Period.Periods.Reverse().Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name));
                ShiftData(basedVar, p2, -Shift);
            }

            foreach (var tp in periods)
            {
                if (Readers.Any())
                {
                    ApplyValueForHolder(holder, tp);
                    ExecuteAllReaders(tp);
                }
            }
        }
Пример #2
0
        public override void EvaluateInternal(H holder, MemberInfo groupKey)
        {
            // вычисляем переменную из котрой следует получить значения
            CalculatedVariable <H, T, I> basedVar = (CalculatedVariable <H, T, I>)DependsOn.Single();

            basedVar.Evaluate(holder, groupKey, LastMoniker);

            // для каждого периода времени вычисляем значение переменной
            foreach (var tp in Period.Periods.Select((t, i) => new TimeArg <I>(t, i, groupKey, Period.Name, this.Name)))
            {
                I        next      = Period.Periods.FirstOrDefault(p => Operator.GreaterThan(p, tp.T));
                var      subPeriod = basedVar.Period.Between(tp.T, next);
                List <T> result    = Activator.CreateInstance <List <T> >();
                Int32    c         = 0;
                foreach (I s in subPeriod)
                {
                    var ta = new TimeArg <I>(s, c++, groupKey, basedVar.Period.Name, basedVar.Name);
                    result.Add((T)basedVar.Results[ta]);
                }

                Results.Add(tp, result);
                // если требуется вернуть значение переменной, то записываем результат в свойство
                // holder, это свойство будет содержить список значений всех переменных на момент времени t
                if (Readers.Any())
                {
                    ApplyValueForHolder(holder, tp);
                    ExecuteAllReaders(tp);
                }
            }
        }