コード例 #1
0
        public override Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest request)
        {
            var result = _innerCalculator.Calculate(request);

            if (result.Failure)
            {
                return(result);
            }

            //находим ModifiedRule с максимальным приоритетом
            var modifiedRule = _queryProcessor.Process(new ModifiedRuleIsAdditionQuery(request.TypiconVersionId, request.Date));

            if (modifiedRule?.IsAddition == true)
            {
                //создаем первый объект, который в дальнейшем станет ссылкой Addition у выбранного правила
                var dayRule = modifiedRule.DayRule;

                var create = _settingsFactory.CreateRecursive(new CreateRuleSettingsRequest(request)
                {
                    Rule = dayRule
                });

                if (create.Success && create.Value is RuleHandlerSettings settings)
                {
                    //задаем номер знака, если он был отдельно задан в ModifiedRule
                    result.Value.Settings.PrintDayTemplate = modifiedRule.PrintDayTemplate;

                    //добавляем DayWorships
                    if (TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule))
                    {
                        settings.Menologies.AddRange(modifiedRule.DayWorships);
                    }
                    else
                    {
                        settings.Triodions.AddRange(modifiedRule.DayWorships);
                    }

                    //вставляем тексты служб в полученные ранее настройки
                    var lastAdditionSettings = FillWorships(settings, result.Value.Settings, false);

                    //и задаем результат у последнего найденного Addition
                    settings.Menologies = lastAdditionSettings.Menologies;
                    settings.Triodions  = lastAdditionSettings.Triodions;
                    settings.OktoikhDay = lastAdditionSettings.OktoikhDay;

                    //теперь дублируем тексты служб на Additions, вычисленные для данных настроек
                    if (settings.Addition != null)
                    {
                        FillWorships(settings, settings.Addition, true);
                    }

                    //замыкаем цепочку
                    lastAdditionSettings.Addition = settings;
                }
            }

            return(result);
        }
コード例 #2
0
        public void CheckMenology_False()
        {
            DayRule rule         = new TriodionRule();
            var     modifiedRule = new ModifiedRule()
            {
                DayRule = rule
            };

            Assert.IsFalse(TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule));
        }
コード例 #3
0
        /// <summary>
        /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов.
        /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ
        /// </summary>
        /// <param name="modifiedRule"></param>
        /// <param name="menologyRule"></param>
        /// <param name="triodionRule"></param>
        /// <returns>Правило для обработки, список текстов богослужений</returns>
        private (DayRule MajorRule, IEnumerable <DayWorship> Menologies, IEnumerable <DayWorship> Triodions, bool ModifiedIsUsed) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule)
        {
            //Приоритет Минеи
            IDayRule menologyToCompare = SetValues(menologyRule
                                                   , out int menologyPriority
                                                   , TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule?.DayRule));

            //Приоритет Триоди
            IDayRule triodionToCompare = SetValues(triodionRule
                                                   , out int triodionPriority
                                                   , TypeEqualsOrSubclassOf <TriodionRule> .Is(modifiedRule?.DayRule));

            IDayRule SetValues(DayRule dr, out int p, bool typeEqualsOrSubclassOf)
            {
                IDayRule r = null;

                p = int.MaxValue;

                if (typeEqualsOrSubclassOf)
                {
                    r = modifiedRule;//.DayRule;
                    p = modifiedRule.Priority;
                }
                else if (dr != null)
                {
                    r = dr;
                    p = dr.Template.Priority;
                }

                return(r);
            };

            IDayRule majorRule  = null;
            var      menologies = new List <DayWorship>();
            var      triodions  = new List <DayWorship>();

            int result = menologyPriority - triodionPriority;

            //сравниваем
            switch (result)
            {
            case 1:
            case 0:
                //senior Triodion, junior Menology
                majorRule = triodionToCompare;

                menologies.AddRange(menologyToCompare.DayWorships);
                triodions.AddRange(triodionToCompare.DayWorships);
                break;

            case -1:
                //senior Menology, junior Triodion
                majorRule = menologyToCompare;

                menologies.AddRange(menologyToCompare.DayWorships);
                triodions.AddRange(triodionToCompare.DayWorships);
                break;

            default:
                if (result < -1)
                {
                    //только Минея
                    majorRule = menologyToCompare;

                    menologies.AddRange(menologyToCompare.DayWorships);
                }
                else
                {
                    //только Триодь
                    majorRule = triodionToCompare;

                    triodions.AddRange(triodionToCompare.DayWorships);
                }
                break;
            }

            //Вводим переменную для того, чтобы затем обнулить ссылку на ModifiedRule
            bool modifiedRuleIsUsed = false;

            //если это измененное правило, то возвращаем правило, на которое оно указывает
            if (majorRule is ModifiedRule mr)
            {
                majorRule = mr.DayRule;

                modifiedRuleIsUsed = true;
            }

            return(majorRule as DayRule, menologies, triodions, modifiedRuleIsUsed);
        }
コード例 #4
0
 public void Check()
 {
     Assert.IsTrue(TypeEqualsOrSubclassOf <string> .Is(""));
 }