Example #1
0
        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);
        }
Example #2
0
        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);
        }