Пример #1
0
        private ComparisonRuleForUser GetComparisonRuleForUser(XElement xRule)
        {
            string description = GetChildElementValue(xRule, "description");
            var    rule        = new ComparisonRuleForUser(TextFormatter.FirstUpperCharAndTrim(description));

            XElement xExamples = GetChildElement(xRule, "examples");

            foreach (XElement xExample in GetChildElements(xExamples, "example"))
            {
                ComparisonRuleExampleForUser example = GetComparisonExampleForUser(xExample);
                rule.AddExample(example);
            }

            return(rule);
        }
Пример #2
0
        private bool CreateExamples(IEnumerable <ComparisonRuleExampleForUser> ruleExamples,
                                    ComparisonRuleForUser newComparisonRuleForUser,
                                    StudyLanguageContext c)
        {
            bool result           = true;
            int  orderRuleExample = 1;

            foreach (ComparisonRuleExampleForUser ruleExample in ruleExamples)
            {
                SourceWithTranslation example = ruleExample.Example;
                SourceWithTranslation sentenceWithTranslation =
                    _sentencesQuery.GetOrCreate(SentenceType.ComparisonExample,
                                                example.Source,
                                                example.Translation,
                                                null);
                long sentenceTranslationId = sentenceWithTranslation.Id;
                if (IdValidator.IsInvalid(sentenceTranslationId))
                {
                    LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                        "ComparisonsQuery.GetOrCreate не удалось создать предложения примера! " +
                        "Предложение: {0}, перевод предложения {1}",
                        sentenceWithTranslation.Source.Text, sentenceWithTranslation.Translation.Text);
                    result = false;
                    continue;
                }

                long ruleId = newComparisonRuleForUser.Id;
                ComparisonRuleExample comparisonRuleExample = GetOrCreateComparisonRuleExample(ruleId,
                                                                                               sentenceTranslationId,
                                                                                               ruleExample.Description,
                                                                                               orderRuleExample++, c);

                if (IdValidator.IsInvalid(comparisonRuleExample.Id))
                {
                    LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                        "ComparisonsQuery.GetOrCreate не удалось создать пример для правила сравнения! " +
                        "Id примера: {0}, sentenceWithTranslationId {1}",
                        ruleId, sentenceTranslationId);
                    result = false;
                    continue;
                }

                var exampleForUser = new ComparisonRuleExampleForUser(comparisonRuleExample, sentenceWithTranslation);
                newComparisonRuleForUser.AddExample(exampleForUser);
            }
            return(result);
        }
Пример #3
0
        private ComparisonItemForUser GetComparisonItemForUser(XElement xItem)
        {
            string title           = GetChildElementValue(xItem, "title");
            string titleTranslated = GetChildElementValue(xItem, "titleTranslated");
            string description     = GetChildElementValue(xItem, "description");

            var comparisonItem = new ComparisonItemForUser(TextFormatter.ToLowerAndNotTouchFirstCharWords(title),
                                                           TextFormatter.ToLowerAndNotTouchFirstCharWords(
                                                               titleTranslated),
                                                           TextFormatter.FirstUpperCharAndTrim(description));
            XElement xRules = GetChildElement(xItem, "rules");

            foreach (XElement xRule in GetChildElements(xRules, "rule"))
            {
                ComparisonRuleForUser rule = GetComparisonRuleForUser(xRule);
                comparisonItem.AddRule(rule);
            }

            return(comparisonItem);
        }
Пример #4
0
        private static ComparisonRule GetOrCreateComparisonRule(ComparisonRuleForUser comparisonRuleForUser,
                                                                long comparisonItemId,
                                                                int order,
                                                                StudyLanguageContext c)
        {
            ComparisonRule comparisonRule =
                c.ComparisonRule.FirstOrDefault(
                    e => e.ComparisonItemId == comparisonItemId && e.Description == comparisonRuleForUser.Description);

            if (comparisonRule == null)
            {
                comparisonRule = new ComparisonRule {
                    ComparisonItemId = comparisonItemId,
                    Description      = comparisonRuleForUser.Description
                };
                c.ComparisonRule.Add(comparisonRule);
            }

            comparisonRule.Order = order;
            c.SaveChanges();

            return(comparisonRule);
        }
Пример #5
0
        /// <summary>
        /// Получает группу сравнения по названию
        /// </summary>
        /// <param name="userLanguages">языковые настройки пользователя</param>
        /// <param name="title">название представления</param>
        /// <returns>представление или null если не найдено</returns>
        public ComparisonForUser GetWithFullInfo(UserLanguages userLanguages, string title)
        {
            long sourceLanguageId      = userLanguages.From.Id;
            long translationLanguageId = userLanguages.To.Id;

            ComparisonForUser result = Adapter.ReadByContext(c => {
                var comparisonsQuery = (from gc in c.GroupComparison
                                        join ci in c.ComparisonItem on gc.Id equals ci.GroupComparisonId
                                        join cr in c.ComparisonRule on ci.Id equals cr.ComparisonItemId
                                        join cre in c.ComparisonRuleExample on cr.Id equals cre.ComparisonRuleId
                                        join st in c.SentenceTranslation on cre.SentenceTranslationId equals st.Id
                                        join s1 in c.Sentence on st.SentenceId1 equals s1.Id
                                        join s2 in c.Sentence on st.SentenceId2 equals s2.Id
                                        where gc.Title == title && gc.LanguageId == _languageId &&
                                        ((s1.LanguageId == sourceLanguageId &&
                                          s2.LanguageId == translationLanguageId)
                                         ||
                                         (s1.LanguageId == translationLanguageId &&
                                          s2.LanguageId == sourceLanguageId))
                                        orderby ci.Order, cr.Order, cre.Order
                                        select new { gc, ci, cr, cre, st, s1, s2 });
                var comparisonsInfos = comparisonsQuery.AsEnumerable();
                var firstComparison  = comparisonsInfos.FirstOrDefault();
                if (firstComparison == null)
                {
                    return(null);
                }
                var innerResult           = new ComparisonForUser(firstComparison.gc);
                long prevComparisonItemId = IdValidator.INVALID_ID;
                long prevComparisonRuleId = IdValidator.INVALID_ID;
                ComparisonItemForUser comparisonItemForUser = null;
                ComparisonRuleForUser comparisonRuleForUser = null;
                foreach (var comparisonInfo in comparisonsInfos)
                {
                    ComparisonItem comparisonItem = comparisonInfo.ci;
                    if (prevComparisonItemId != comparisonItem.Id)
                    {
                        prevComparisonItemId = comparisonItem.Id;

                        if (comparisonItemForUser != null)
                        {
                            innerResult.AddItem(comparisonItemForUser);
                        }

                        comparisonItemForUser = new ComparisonItemForUser(comparisonItem);
                    }

                    ComparisonRule comparisonRule = comparisonInfo.cr;
                    if (comparisonRule.Id != prevComparisonRuleId)
                    {
                        prevComparisonRuleId = comparisonRule.Id;

                        comparisonRuleForUser = new ComparisonRuleForUser(comparisonRule);
                        comparisonItemForUser.AddRule(comparisonRuleForUser);
                    }

                    SourceWithTranslation sourceWithTranslation =
                        ConverterEntities.ConvertToSourceWithTranslation(comparisonInfo.st.Id,
                                                                         comparisonInfo.st.Image,
                                                                         comparisonInfo.s1.LanguageId,
                                                                         comparisonInfo.s1,
                                                                         comparisonInfo.s2);
                    sourceWithTranslation.IsCurrent = false;
                    var example = new ComparisonRuleExampleForUser(comparisonInfo.cre, sourceWithTranslation);
                    comparisonRuleForUser.AddExample(example);
                }

                if (comparisonItemForUser != null)
                {
                    innerResult.AddItem(comparisonItemForUser);
                }

                return(innerResult);
            });

            return(result);
        }
Пример #6
0
        public ComparisonForUser GetOrCreate(ComparisonForUser comparisonForUser)
        {
            if (!comparisonForUser.IsValid())
            {
                return(null);
            }

            bool isSuccess           = true;
            ComparisonForUser result = null;

            Adapter.ActionByContext(c => {
                GroupComparison groupComparison = GetOrCreateGroupComparison(comparisonForUser, c);
                if (IdValidator.IsInvalid(groupComparison.Id))
                {
                    LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                        "ComparisonsQuery.GetOrCreate не удалось создать! Название: {0}, описание: {1}",
                        comparisonForUser.Title,
                        comparisonForUser.Description);
                    isSuccess = false;
                    return;
                }
                result = new ComparisonForUser(groupComparison);

                int orderItem = 1;
                foreach (ComparisonItemForUser comparisonItemForUser in comparisonForUser.Items)
                {
                    ComparisonItem comparisonItem = GetOrCreateComparisonItem(comparisonItemForUser, groupComparison.Id,
                                                                              orderItem++, c);
                    if (IdValidator.IsInvalid(comparisonItem.Id))
                    {
                        LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                            "ComparisonsQuery.GetOrCreate не удалось создать пункт для сравнения! " +
                            "Id сравнения: {0}, название {1}, перевод названия {2}, описание {3}",
                            groupComparison.Id, comparisonItemForUser.Title, comparisonItemForUser.TitleTranslated,
                            comparisonItemForUser.Description);
                        isSuccess = false;
                        continue;
                    }

                    var newComparisonItemForUser = new ComparisonItemForUser(comparisonItem);
                    result.AddItem(newComparisonItemForUser);

                    int orderRule = 1;
                    foreach (ComparisonRuleForUser comparisonRuleForUser in comparisonItemForUser.Rules)
                    {
                        ComparisonRule comparisonRule = GetOrCreateComparisonRule(comparisonRuleForUser,
                                                                                  comparisonItem.Id, orderRule++, c);
                        long ruleId = comparisonRule.Id;
                        if (IdValidator.IsInvalid(ruleId))
                        {
                            LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                                "ComparisonsQuery.GetOrCreate не удалось создать правило для сравнения! " +
                                "Id пункта сравнения: {0}, описание {1}",
                                comparisonItem.Id, comparisonRule.Description);
                            isSuccess = false;
                            continue;
                        }

                        var newComparisonRuleForUser = new ComparisonRuleForUser(comparisonRule);
                        newComparisonItemForUser.AddRule(newComparisonRuleForUser);

                        isSuccess = EnumerableValidator.IsNotEmpty(comparisonRuleForUser.Examples) &&
                                    CreateExamples(comparisonRuleForUser.Examples, newComparisonRuleForUser, c);
                    }
                }

                if (isSuccess)
                {
                    //удалить пункты, правила, примеры, которые не были переданы в этот раз
                    DeleteOldInfos(c, result);
                }
            });
            return(isSuccess && result != null && result.IsValid() ? result : null);
        }