Example #1
0
        internal void AddPartsToExistingRootPredicate(int rootId, PredicatePartHelperObject newPredicateHelperObject)
        {
            // на этом этапе в списке Сказуемых А только корневые сказуемые, к которым необходимо добавить их зависимые слова.
            // поиск всех возможных комбинаций еще не проводился.
            var existingLOPredicate = All.
               FindAll(x => x.PredicateType == PredicateType.Predicate || x.PredicateType == PredicateType.Phantom).
               FindAll(x => x.Id == rootId);
            if (existingLOPredicate.Count != 1)
            {
                Log.ErrorFormat($"Актуализация СказА: больше чем 1 член сказуемое А до этапа поиска всех возможных вариантов.: Id = {newPredicateHelperObject.Id}; Text = {newPredicateHelperObject.Text}");
                return;
            }

            Log.InfoFormat($"Актуализация: добаляем новое сказуемое: Id = {newPredicateHelperObject.Id}; Text = {newPredicateHelperObject.Text}");
            var predicate = Items.Find(x => x.Find(y => y.Id == rootId) != null);
            predicate.Add(newPredicateHelperObject);
        }
Example #2
0
        public static PredicatePartHelperObject ReadFromSourceRow(DataRow row)
        {
            var result = new PredicatePartHelperObject
            {
                GUID = row.Field<string>(HelperDataColumnElementGUID.Name),
                Text = row.Field<string>(HelperDataColumnElementText.Name),
                Id = row.Field<int>(HelperDataColumnElementId.Name),
                Order = row.Field<int>(HelperDataConjunctedPredicatesSourcePredicateOrder.Name),
                RootParentId = row.Field<int>(HelperDataConjunctedPredicatesSourcePredicateParentId.Name),
                PredicateType = (PredicateType)Enum.Parse(typeof(PredicateType), row.Field<string>(HelperDataConjunctedPredicatesSourcePredicatePredicateType.Name)),
                PartParentId = row.Field<int>(HelperDataConjunctedPredicatesSourcePredicatePredicatePartParentId.Name),
                Level = row.Field<int>(HelperDataConjunctedPredicatesSourcePredicatePredicatePartLevel.Name),
                PartType =
                    (PredicatePartType)
                        Enum.Parse(typeof (PredicatePartType),
                            row.Field<string>(HelperDataConjunctedPredicatesSourcePredicatePredicatePartType.Name)),
                UPRowNr = row.Field<string>(HelperDataConjunctedPredicatesSourcePredicateUPRowNr.Name),
                IsReal = row.Field<bool>(HelperDataConjunctedPredicatesSourcePredicateIsReal.Name)
            };

            return result;
        }
Example #3
0
        // читаем данные с алгоритма 3.1
        public static PredicatePartHelperObject ReadFromEarlySourceRow(DataRow row)
        {
            var result = new PredicatePartHelperObject
            {
                GUID = row.Field<string>(HelperDataColumnElementGUID.Name),
                Text = row.Field<string>(HelperDataColumnElementText.Name),
                Id = row.Field<int>(HelperDataColumnElementId.Name),

                Order = row.Field<int>(HelperDataPredicatePartsOrder.Name),
                RootParentId = row.Field<int>(HelperDataPredicatePartsParentId.Name),
                PredicateType = (PredicateType)Enum.Parse(typeof(PredicateType), row.Field<string>(HelperDataPredicatePartsPredicateType.Name)),
                PartParentId = row.Field<int>(HelperDataPredicatePartsPartParentId.Name),
                Level = row.Field<int>(HelperDataPredicatePartsPredicatePartLevel.Name),
                PartType =
                    (PredicatePartType)
                        Enum.Parse(typeof(PredicatePartType),
                            row.Field<string>(HelperDataPredicatePartsPredicatePartType.Name)),
                UPRowNr = string.Empty,
                IsReal = false
            };

            return result;
        }
Example #4
0
        public static PredicatePartHelperObject ReadFromResultRow(DataRow row)
        {
            var result = new PredicatePartHelperObject
            {
                GUID = row.Field<string>(HelperDataColumnElementGUID.Name),
                Text = row.Field<string>(HelperDataColumnElementText.Name),
                Id = row.Field<int>(HelperDataColumnElementId.Name),
                Order = row.Field<int>(HelperDataConjunctedPredicatesResultPredicateOrder.Name),
                RootParentId = row.Field<int>(HelperDataConjunctedPredicatesResultPredicateParentId.Name),
                PartParentId = row.Field<int>(HelperDataConjunctedPredicatesResultPredicatePredicatePartParentId.Name),
                PredicateType =
                    (PredicateType)
                        Enum.Parse(typeof (PredicateType),
                            row.Field<string>(HelperDataConjunctedPredicatesResultPredicateType.Name)),
                Level = row.Field<int>(HelperDataConjunctedPredicatesResultPredicatePredicatePartLevel.Name),
                PartType =
                    (PredicatePartType)
                        Enum.Parse(typeof (PredicatePartType),
                            row.Field<string>(HelperDataConjunctedPredicatesResultPredicatePredicatePartType.Name)),
                UPRowNr = row.Field<string>(HelperDataConjunctedPredicatesResultPredicateUPRowNr.Name),
                RootPredicateLOConjunctionKind =
                    (LOPredicateConjunctionType)
                        Enum.Parse(typeof (LOPredicateConjunctionType),
                            row.Field<string>(HelperDataConjunctedPredicatesResultPredicateLOConjunctionType.Name)),
                CanJoinAnotherInfinitive =
                    row.Field<bool>(HelperDataConjunctedPredicatesResultCanJoinAnotherInfinitive.Name),
                CanJoinAnotherAuxVerb = row.Field<bool>(HelperDataConjunctedPredicatesResultCanJoinAnotherAuxVerb.Name),
                NextSameTypeElementHasChildren =
                    row.Field<bool>(HelperDataConjunctedPredicatesResultNextInfinitiveOrAuxVerbHasChildren.Name),
                ForbidToJoinAnotherInf =
                    (ForbidToJoinAnotherInfOrAuxVerb)
                        Enum.Parse(typeof (ForbidToJoinAnotherInfOrAuxVerb),
                            row.Field<string>(HelperDataConjunctedPredicatesResultForbidJoinAnotherInfinitive.Name)),
                ForbidToJoinAnotherAuxVerb =
                    (ForbidToJoinAnotherInfOrAuxVerb)
                        Enum.Parse(typeof (ForbidToJoinAnotherInfOrAuxVerb),
                            row.Field<string>(HelperDataConjunctedPredicatesResultForbidJoinAnotherAuxVerb.Name)),
                IsReal = row.Field<bool>(HelperDataConjunctedPredicatesResultPredicateIsReal.Name)
            };

            return result;
        }
        private ForbidToJoinAnotherInfOrAuxVerb _getForbidToJoinAnotherInfinitiveOrAuxVerb(List<PredicatePartHelperObject> sourceElements, PredicatePartHelperObject element, PredicatePartType type, PredicatePartType getForbidFor)
        {
            Debug.Assert(type != PredicatePartType.AuxVerb);
            Debug.Assert(getForbidFor != PredicatePartType.Root);

            // фильтруем элементы группы, оставляем одни объекты типа type, и тот ряд ОЧ, в который входит текущий объект
            var typedElementsInGroup = sourceElements.FindAll(x => x.PartType == type && x.UPRowNr == element.UPRowNr);
            // если рассматриваем возможность присоединения ВГ, то разворачиваем ряд ОЧ, т.к. ВГ подсоединяется к основному слову вначале, а не в конце, как Инф
            if (getForbidFor == PredicatePartType.AuxVerb)
                typedElementsInGroup.Reverse();

            if (typedElementsInGroup.Count > 0)
                if (typedElementsInGroup.Last() == element)
                {
                    // Элемент последний/первый в ОЧ ряду. Пропуск
                    return ForbidToJoinAnotherInfOrAuxVerb.Undefined;
                }

            var forbidToJoin = true;
            // формируем список ОЧ-инфинитивов или других КСО, которые находятся справа (И) или слева(ВГ) от текущего рассматриваемого
            var searchedElements = new List<PredicatePartHelperObject>();
            switch (getForbidFor)
            {
                case PredicatePartType.Infinitive: searchedElements = typedElementsInGroup.FindAll(x => x.Order > element.Order); break;
                case PredicatePartType.AuxVerb: searchedElements= typedElementsInGroup.FindAll(x => x.Order < element.Order); break;
            }

            foreach (var nextTypedElement in searchedElements)
            {
                var canJoinTyped = false;
                switch (getForbidFor)
                {
                    case PredicatePartType.Infinitive: canJoinTyped = element.CanJoinAnotherInfinitive; break;
                    case PredicatePartType.AuxVerb: canJoinTyped = element.CanJoinAnotherAuxVerb; break;
                }

                var nextTypedElementCanJoin = false;
                switch (getForbidFor)
                {
                    case PredicatePartType.Infinitive: nextTypedElementCanJoin = nextTypedElement.CanJoinAnotherInfinitive; break;
                    case PredicatePartType.AuxVerb: nextTypedElementCanJoin = nextTypedElement.CanJoinAnotherAuxVerb; break;
                }

                var hasNextTypedElementChildren = sourceElements.FindAll(x => x.PartParentId == nextTypedElement.Id && x.PartType == getForbidFor).Count > 0;
                element.NextSameTypeElementHasChildren = hasNextTypedElementChildren;

                // если у элемента есть право на присоединение и у след. элемента есть потомки, то разрешаем
                if (canJoinTyped && hasNextTypedElementChildren)
                    forbidToJoin = false;
                else if (!nextTypedElementCanJoin)
                {
                    // если права нет, то это "обрыв" и дальше не продолаем
                    forbidToJoin = true;
                    break;
                }
            }

            return forbidToJoin ? ForbidToJoinAnotherInfOrAuxVerb.Forbid : ForbidToJoinAnotherInfOrAuxVerb.Allow;
        }