public override bool Process(XElement subsent) { var isSubsent = subsent.IsElementSUBSENT(); //---subsent.ThrowIfNotSubsent(); var result = false; foreach (var pt in Patterns) { #region [.condition.] var pairs = from parent in subsent.Descendants(pt.ParentName) where (parent.HasAttributeWithValue(pt.ParentAttributeName, pt.ParentAttributeValue)) && (!parent.GetAncestorSubsent().HasAttributeFIRSTQUEUESUBSENT()) && (!parent.HasSelfOrAncestorHomogeneous(isSubsent)) let first = parent.Elements(pt.FirstName) .FirstOrDefault(_child => _child.HasAttributeWithValue(pt.FirstAttributeName, pt.FirstAttributeValue) && (pt.FirstMatchString.IsEmptyOrNull() || _child.GetAttributeVALUE().ToLowerEx().Trim() == pt.FirstMatchString) ) where (first != null) let second = GetNextSiblingWithSkipEmptyU(first, pt.SecondName) where (second != null) && (second.HasAttributeWithValue(pt.SecondAttributeName, pt.SecondAttributeValue)) && (pt.SecondMatchString.IsEmptyOrNull() || second.GetAttributeVALUE().ToLowerEx().Trim() == pt.SecondMatchString) select new { FIRST = first, SECOND = second, }; #endregion foreach (var p in pairs.Reverse() /*VERY IMPORTANT - in inverse-backward order*/) { MatchRuleDebugInfoOutput(p.FIRST); var localresult = false; foreach (var a in Actions) { if (a.Exists(p.FIRST, p.SECOND)) { #region MatchActionDebugInfoOutput(a); localresult = true; result = true; var role = a.ROLE.HasValue ? a.ROLE.Value : (a.determineattribute_ROLE.HasValue ? (a.determineattribute_ROLE.Value == determine_attribute.firstchildtype) ? p.FIRST.GetAttributeROLE() : p.SECOND.GetAttributeROLE() : null); var type = a.TYPE.HasValue ? a.TYPE.Value : (a.determineattribute_TYPE.HasValue ? (a.determineattribute_TYPE.Value == determine_attribute.firstchildtype) ? p.FIRST.GetAttributeTYPE() : p.SECOND.GetAttributeTYPE() : null); var frt = p.FIRST.GetAttributeFRT() + p.SECOND.GetAttributeFRT() + a.FRT_toAdd; if (frt < 0) { frt = 0; } var newNode = new XElement(a.CreateNewElementType.ToString()); newNode.SetAttributeSNT(a.SNT); newNode.SetAttributeFRT(frt); if (type.HasValue) { newNode.SetAttributeTYPE(type.Value); } if (role.HasValue) { newNode.SetAttributeROLE(role.Value); } newNode.SetAttributeCREATEDBYPARENTTWOCHILDRULE(); p.FIRST.AddBeforeSelf(newNode); newNode.MoveIn2ThisNodesRange(p.FIRST, p.SECOND); newNode.AddBeforeAndAfterEmptyU(); break; #endregion } } if (!localresult) { NomatchActionDebugInfoOutput(); } } } return(result); }
public override bool Process(XElement subsent) { subsent.ThrowIfNotSubsent(); var result = false; foreach (var pt in Patterns) { #region [.condition.] var parent = ((subsent.Name.LocalName == pt.ParentName) && (pt.ParentAttributeName.IsEmptyOrNull() || subsent.HasAttributeWithValue(pt.ParentAttributeName, pt.ParentAttributeValue))) ? subsent : null; if (parent == null) { continue; } var first = parent.Elements(pt.FirstName) .Where(_ => pt.FirstAttributeName.IsEmptyOrNull() || _.HasAttributeWithValue(pt.FirstAttributeName, pt.FirstAttributeValue)) .FirstOrDefault(); if (first == null) { continue; } var second = first.ElementsAfterSelf(pt.SecondName) .Where(_ => pt.SecondAttributeName.IsEmptyOrNull() || _.HasAttributeWithValue(pt.SecondAttributeName, pt.SecondAttributeValue)) .FirstOrDefault(); if (second == null) { continue; } var three = second.ElementsAfterSelf(pt.ThreeName) .Where(_ => pt.ThreeAttributeName.IsEmptyOrNull() || _.HasAttributeWithValue(pt.ThreeAttributeName, pt.ThreeAttributeValue)) .FirstOrDefault(); if (three == null) { continue; } var four = three.ElementsAfterSelf(pt.FourName) .Where(_ => pt.FourAttributeName.IsEmptyOrNull() || _.HasAttributeWithValue(pt.FourAttributeName, pt.FourAttributeValue)) .FirstOrDefault(); if (four == null) { continue; } var tuple = new { //PARENT = parent, //FIRST = first, //SECOND = second, THREE = three, FOUR = four, }; #endregion #region [.process.] MatchRuleDebugInfoOutput(tuple.THREE); var threeSNT = tuple.THREE.Attribute("SNT"); var fourSNT = tuple.FOUR.Attribute("SNT"); if (threeSNT == null || fourSNT == null) { throw (new InvalidOperationException("Element no has 'SNT' attribute (rule " + this.Id.InSingleQuote() + ')')); } var a3SNT = threeSNT.Value.ToEnum <TonalityType>(); var a4SNT = fourSNT.Value.ToEnum <TonalityType>(); var localresult = false; foreach (var a in Actions) { if (a.Exists(a3SNT, a4SNT)) { #region [.match action.] MatchActionDebugInfoOutput(a); localresult = true; result = true; var newNode = new XElement(a.CreateNewElementType.ToString()); newNode.SetAttributeSNT(a.SNT); newNode.SetAttributeFRT(tuple.THREE.GetAttributeFRT() + tuple.FOUR.GetAttributeFRT()); if (a.TYPE.HasValue) { newNode.SetAttributeTYPE(a.TYPE.Value); } tuple.THREE.AddBeforeSelf(newNode); newNode.MoveIn2ThisNodesRange(tuple.THREE, tuple.FOUR); newNode.AddBeforeAndAfterEmptyU(); break; #endregion } } if (!localresult) { NomatchActionDebugInfoOutput(); } if (result) { break; } #endregion } return(result); }
/*private List< FlatChainRuleProcessingItem > TryGetItemsChain( FlatChainRuleProcessingItem processingItem ) * { * var tempResultList = new List< FlatChainRuleProcessingItem >(); * foreach ( var pattern in Patterns ) * { * var itemsChain = pattern.TryGetItemsChain( processingItem, tempResultList ); * if ( itemsChain != null ) * { * return (itemsChain); * } * } * return (null); * }*/ private bool ProcessInternal(XElement subsent) { var isSubsent = subsent.IsElementSUBSENT(); var itemsChain = new List <FlatChainRuleProcessingItem>(); foreach (XElement node in subsent.GetAllProcessingElementsInSubsent()) { var processingItem = new FlatChainRuleProcessingItem(node); #region [.TryGetItemsChain.] foreach (var pattern in Patterns) { if (pattern.TryGetItemsChain(processingItem, itemsChain)) { break; } } if (itemsChain.Count == 0) { continue; } if (itemsChain.HasAncestorHomogeneous(isSubsent)) { continue; } #endregion MatchRuleDebugInfoOutput(subsent); foreach (var a in Actions) { if (a.Exists(itemsChain)) { #region MatchActionDebugInfoOutput(a); var role = a.ROLE.HasValue ? a.ROLE.Value : (a.determineattribute_ROLE.HasValue ? itemsChain[extensions.ToIndex(a.determineattribute_ROLE.Value)].Role : null); var inquiryItem = itemsChain.FirstOrDefault(_ => _.TYPE == TypeAttributeValue.Inquiry); var type = (inquiryItem != null) ? TypeAttributeValue.Inquiry : a.TYPE.HasValue ? a.TYPE.Value : (a.determineattribute_TYPE.HasValue ? itemsChain[extensions.ToIndex(a.determineattribute_TYPE.Value)].TYPE : null); var frt = itemsChain.Sum(_ => _.XElement.GetAttributeFRT()) + a.FRT_toAdd; if (frt < 0) { frt = 0; } var newNode = new XElement(a.CreateNewElementType.ToString()); newNode.SetAttributeSNT(a.SNT); newNode.SetAttributeFRT(frt); if (type.HasValue) { newNode.SetAttributeTYPE(type.Value); } if (role.HasValue) { newNode.SetAttributeROLE(role.Value); } #region [.if some-one item in chain is ENTITIES => put him @ID on new-created-parent.] if (newNode.IsElementENTITIES()) { var entitiesItemsChain = (from item in itemsChain where item.XElement.IsElementENTITIES() select item.XElement ) .FirstOrDefault(); if (entitiesItemsChain != null) { newNode.SetAttributeID(entitiesItemsChain.GetAttributeID().Value); } } #endregion node.AddBeforeSelf(newNode); foreach (var itemInChain in itemsChain) { itemInChain.XElement.Remove(); newNode.Add(itemInChain.XElement); } newNode.AddBeforeAndAfterEmptyU(); return(true); #endregion } } NomatchActionDebugInfoOutput(); } return(false); }