public ParseNodeSearchable(ParseNodeSearchable parent, XmlNode node)
        {
            children        = new List <ParseNode>();
            this.parent     = parent;
            _isLeaf         = node.Name == "leaf";
            _searchTypes    = new List <SearchType>();
            _viewLayerTypes = new List <ViewLayerType>();
            _searchValues   = new List <string>();
            if (node.Attributes.Count != 0)
            {
                for (var i = 0; i < node.Attributes.Count; i++)
                {
                    var attribute     = node.Attributes[i];
                    var viewLayerType = attribute.Name.Substring(0, 3);
                    var searchType    = attribute.Name.Substring(3);
                    _searchValues.Add(attribute.InnerText);
                    if (searchType.Equals("equals"))
                    {
                        _searchTypes.Add(SearchType.EQUALS);
                    }
                    else
                    {
                        if (searchType.Equals("contains"))
                        {
                            _searchTypes.Add(SearchType.CONTAINS);
                        }
                        else
                        {
                            if (searchType.Equals("matches"))
                            {
                                _searchTypes.Add(SearchType.MATCHES);
                            }
                            else
                            {
                                if (searchType.Equals("starts"))
                                {
                                    _searchTypes.Add(SearchType.STARTS);
                                }
                                else
                                {
                                    if (searchType.Equals("ends"))
                                    {
                                        _searchTypes.Add(SearchType.ENDS);
                                    }
                                    else
                                    {
                                        if (searchType.Equals("equalsignorecase"))
                                        {
                                            _searchTypes.Add(SearchType.EQUALS_IGNORE_CASE);
                                        }
                                        else
                                        {
                                            if (searchType.Equals("isnull"))
                                            {
                                                _searchTypes.Add(SearchType.IS_NULL);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (viewLayerType.Equals("mor") || viewLayerType.Equals("inf"))
                    {
                        _viewLayerTypes.Add(ViewLayerType.INFLECTIONAL_GROUP);
                    }
                    else
                    {
                        if (viewLayerType.Equals("tur"))
                        {
                            _viewLayerTypes.Add(ViewLayerType.TURKISH_WORD);
                        }
                        else
                        {
                            if (viewLayerType.Equals("per"))
                            {
                                _viewLayerTypes.Add(ViewLayerType.PERSIAN_WORD);
                            }
                            else
                            {
                                if (viewLayerType.Equals("eng"))
                                {
                                    _viewLayerTypes.Add(ViewLayerType.ENGLISH_WORD);
                                }
                                else
                                {
                                    if (viewLayerType.Equals("ner"))
                                    {
                                        _viewLayerTypes.Add(ViewLayerType.NER);
                                    }
                                    else
                                    {
                                        if (viewLayerType.Equals("sem") ||
                                            viewLayerType.Equals("tse"))
                                        {
                                            _viewLayerTypes.Add(ViewLayerType.SEMANTICS);
                                        }
                                        else
                                        {
                                            if (viewLayerType.Equals("met"))
                                            {
                                                _viewLayerTypes.Add(ViewLayerType.META_MORPHEME);
                                            }
                                            else
                                            {
                                                if (viewLayerType.Equals("pro"))
                                                {
                                                    _viewLayerTypes.Add(ViewLayerType.PROPBANK);
                                                }
                                                else
                                                {
                                                    if (viewLayerType.Equals("dep"))
                                                    {
                                                        _viewLayerTypes.Add(ViewLayerType.DEPENDENCY);
                                                    }
                                                    else
                                                    {
                                                        if (viewLayerType.Equals("sha") ||
                                                            viewLayerType.Equals("chu"))
                                                        {
                                                            _viewLayerTypes.Add(ViewLayerType.SHALLOW_PARSE);
                                                        }
                                                        else
                                                        {
                                                            if (viewLayerType.Equals("ese"))
                                                            {
                                                                _viewLayerTypes.Add(ViewLayerType.ENGLISH_SEMANTICS);
                                                            }
                                                            else
                                                            {
                                                                if (viewLayerType.Equals("epr"))
                                                                {
                                                                    _viewLayerTypes.Add(ViewLayerType.ENGLISH_PROPBANK);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            foreach (XmlNode child in node.ChildNodes)
            {
                if (child.Name.Equals("node") || child.Name.Equals("leaf"))
                {
                    children.Add(new ParseNodeSearchable(this, child));
                }
            }
        }
        public bool Satisfy(ParseNodeSearchable node)
        {
            int i;

            if (node.IsLeaf() && children.Count > 0)
            {
                return(false);
            }
            for (i = 0; i < node.Size(); i++)
            {
                var viewLayer   = node.GetViewLayerType(i);
                var currentData = node.GetValue(i);
                if (GetLayerData(viewLayer) == null && node.GetType(i) != SearchType.EQUALS &&
                    node.GetType(i) != SearchType.IS_NULL)
                {
                    return(false);
                }

                switch (node.GetType(i))
                {
                case SearchType.CONTAINS:
                    if (!GetLayerData(viewLayer).Contains(currentData))
                    {
                        return(false);
                    }

                    break;

                case SearchType.EQUALS:
                    if (GetLayerData(viewLayer) == null)
                    {
                        if (node.GetValue(i) != "")
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (!GetLayerData(viewLayer).Equals(currentData))
                        {
                            return(false);
                        }
                    }

                    break;

                case SearchType.EQUALS_IGNORE_CASE:
                    if (!GetLayerData(viewLayer).Equals(currentData, StringComparison.OrdinalIgnoreCase))
                    {
                        return(false);
                    }

                    break;

                case SearchType.MATCHES:
                    if (!new Regex(currentData).IsMatch(GetLayerData(viewLayer)))
                    {
                        return(false);
                    }

                    break;

                case SearchType.STARTS:
                    if (!GetLayerData(viewLayer).StartsWith(currentData))
                    {
                        return(false);
                    }

                    break;

                case SearchType.ENDS:
                    if (!GetLayerData(viewLayer).EndsWith(currentData))
                    {
                        return(false);
                    }

                    break;

                case SearchType.IS_NULL:
                    if (GetLayerData(viewLayer) != null)
                    {
                        return(false);
                    }

                    break;
                }
            }

            if (node.NumberOfChildren() > children.Count)
            {
                return(false);
            }

            for (i = 0; i < children.Count; i++)
            {
                if (i < node.NumberOfChildren() &&
                    !((ParseNodeDrawable)GetChild(i)).Satisfy((ParseNodeSearchable)node.GetChild(i)))
                {
                    return(false);
                }
            }

            return(true);
        }
 public ParseTreeSearchable(XmlNode rootNode)
 {
     root = new ParseNodeSearchable(null, rootNode);
 }