Ejemplo n.º 1
0
        public virtual BasicSequenceMatchResult <T> Copy()
        {
            BasicSequenceMatchResult <T> res = new BasicSequenceMatchResult <T>();

            res.pattern                = pattern;
            res.elements               = elements;
            res.matchedGroups          = new BasicSequenceMatchResult.MatchedGroup[matchedGroups.Length];
            res.nodesToStringConverter = nodesToStringConverter;
            res.score            = score;
            res.priority         = priority;
            res.order            = order;
            res.varGroupBindings = varGroupBindings;
            for (int i = 0; i < matchedGroups.Length; i++)
            {
                if (matchedGroups[i] != null)
                {
                    res.matchedGroups[i] = new BasicSequenceMatchResult.MatchedGroup(matchedGroups[i]);
                }
            }
            if (matchedResults != null)
            {
                res.matchedResults = new object[matchedResults.Length];
                System.Array.Copy(res.matchedResults, 0, matchedResults, 0, matchedResults.Length);
            }
            return(res);
        }
            public override ISequenceMatchResult <ICoreMap> Apply(ISequenceMatchResult <ICoreMap> matchResult, params int[] groups)
            {
                BasicSequenceMatchResult <ICoreMap> res = matchResult.ToBasicSequenceMatchResult();
                IList <ICoreMap> elements       = matchResult.Elements();
                IList <ICoreMap> mergedElements = new List <ICoreMap>();

                res.elements = mergedElements;
                int         last          = 0;
                int         mergedGroup   = 0;
                int         offset        = 0;
                IList <int> orderedGroups = CollectionUtils.AsList(groups);

                orderedGroups.Sort();
                foreach (int group in orderedGroups)
                {
                    int groupStart = matchResult.Start(group);
                    if (groupStart >= last)
                    {
                        // Add elements from last to start of group to merged elements
                        Sharpen.Collections.AddAll(mergedElements, elements.SubList(last, groupStart));
                        // Fiddle with matched group indices
                        for (; mergedGroup < group; mergedGroup++)
                        {
                            if (res.matchedGroups[mergedGroup] != null)
                            {
                                res.matchedGroups[mergedGroup].matchBegin -= offset;
                                res.matchedGroups[mergedGroup].matchEnd   -= offset;
                            }
                        }
                        // Get merged element
                        int groupEnd = matchResult.End(group);
                        if (groupEnd - groupStart >= 1)
                        {
                            ICoreMap merged = aggregator.Merge(elements, groupStart, groupEnd);
                            mergedElements.Add(merged);
                            last = groupEnd;
                            // Fiddle with matched group indices
                            res.matchedGroups[mergedGroup].matchBegin = mergedElements.Count - 1;
                            res.matchedGroups[mergedGroup].matchEnd   = mergedElements.Count;
                            mergedGroup++;
                            while (mergedGroup < res.matchedGroups.Length)
                            {
                                if (res.matchedGroups[mergedGroup] != null)
                                {
                                    if (res.matchedGroups[mergedGroup].matchBegin == matchResult.Start(group) && res.matchedGroups[mergedGroup].matchEnd == matchResult.End(group))
                                    {
                                        res.matchedGroups[mergedGroup].matchBegin = res.matchedGroups[group].matchBegin;
                                        res.matchedGroups[mergedGroup].matchEnd   = res.matchedGroups[group].matchEnd;
                                    }
                                    else
                                    {
                                        if (res.matchedGroups[mergedGroup].matchEnd <= matchResult.End(group))
                                        {
                                            res.matchedGroups[mergedGroup] = null;
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                }
                                mergedGroup++;
                            }
                            offset = matchResult.End(group) - res.matchedGroups[group].matchEnd;
                        }
                    }
                }
                // Add rest of elements
                Sharpen.Collections.AddAll(mergedElements, elements.SubList(last, elements.Count));
                // Fiddle with matched group indices
                for (; mergedGroup < res.matchedGroups.Length; mergedGroup++)
                {
                    if (res.matchedGroups[mergedGroup] != null)
                    {
                        res.matchedGroups[mergedGroup].matchBegin -= offset;
                        res.matchedGroups[mergedGroup].matchEnd   -= offset;
                    }
                }
                return(res);
            }