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); }
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; }
// читаем данные с алгоритма 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; }
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; }