示例#1
0
        private static FilterWordTypes AddFilterWord(
            StringBuilder filterBuilder, 
            string filter, 
            int wordStart, 
            int nextWordStart, 
            FilterWordTypes wordType, 
            FilterWordTypes prevWordType, 
            List<string> filterableProperties)
        {
            string word = filter.Substring(wordStart, nextWordStart - wordStart);

            if (wordType == FilterWordTypes.Other)
            {
                // Try to fix properties merged with other stuff
                foreach (var property in filterableProperties)
                {
                    int propIndex = word.IndexOf(property);
                    if (propIndex < 0)
                        continue;

                    if (propIndex > 0)
                        prevWordType = AddFilterWord(filterBuilder, word.Substring(0, propIndex), FilterWordTypes.Other, prevWordType);

                    prevWordType = AddFilterWord(filterBuilder, property, FilterWordTypes.Other, prevWordType);

                    int trailIndex = propIndex + property.Length;
                    if (trailIndex < word.Length)
                        prevWordType = AddFilterWord(filterBuilder, word.Substring(trailIndex), FilterWordTypes.Other, prevWordType);

                    return prevWordType;
                }
            }

            return AddFilterWord(filterBuilder, word, wordType, prevWordType);
        }
示例#2
0
        private static FilterWordTypes AddFilterWord(StringBuilder filterBuilder, string word, FilterWordTypes wordType, FilterWordTypes prevWordType)
        {
            if (wordType == FilterWordTypes.Other)
            {
                if (word.Equals("and", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Logical;
                else if (word.Equals("or", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Logical;
                else if (word.Equals("like", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Comparison;
                else if (word.Equals("not", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Comparison;
            }

            // Not the first word or start/end of a group
            if (prevWordType != FilterWordTypes.None && prevWordType != FilterWordTypes.OpenBracket && wordType != FilterWordTypes.CloseBracket)
            {
                filterBuilder.Append(' ');

                // fix an issue in the BF2 main menu where filter expressions aren't joined properly
                // i.e. "numplayers > 0gametype like '%gpm_cq%'"
                // becomes "numplayers > 0 and gametype like '%gpm_cq%'"
                if (wordType == FilterWordTypes.Other)
                {
                    if (prevWordType != FilterWordTypes.Logical && prevWordType != FilterWordTypes.Comparison)
                        filterBuilder.Append("and ");
                }
                else if (wordType == FilterWordTypes.OpenBracket)
                {
                    if (prevWordType == FilterWordTypes.Other || prevWordType == FilterWordTypes.String)
                        filterBuilder.Append("and ");
                }
            }

            if (wordType == FilterWordTypes.String)
            {
                char quote = word[0];
                filterBuilder.Append(quote);
                if (word.Length > 2)
                {
                    string strContent = word.Substring(1, word.Length - 2);
                    filterBuilder.Append(strContent.Replace(quote, '_')); // replace quote characters inside the string with a wildcard character
                }
                filterBuilder.Append(quote);
            }
            else
                filterBuilder.Append(word);

            return wordType;
        }
        private static FilterWordTypes AddFilterWord(StringBuilder filterBuilder, string word, FilterWordTypes wordType, FilterWordTypes prevWordType)
        {
            if (wordType == FilterWordTypes.Other)
            {
                if (word.Equals("and", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Logical;
                else if (word.Equals("or", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Logical;
                else if (word.Equals("like", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Comparison;
                else if (word.Equals("not", StringComparison.InvariantCultureIgnoreCase))
                    wordType = FilterWordTypes.Comparison;
            }

            // Not the first word or start/end of a group
            if (prevWordType != FilterWordTypes.None && prevWordType != FilterWordTypes.OpenBracket && wordType != FilterWordTypes.CloseBracket)
            {
                filterBuilder.Append(' ');

                // fix an issue in the BF2 main menu where filter expressions aren't joined properly
                // i.e. "numplayers > 0gametype like '%gpm_cq%'"
                // becomes "numplayers > 0 and gametype like '%gpm_cq%'"
                if (wordType == FilterWordTypes.Other)
                {
                    if (prevWordType != FilterWordTypes.Logical && prevWordType != FilterWordTypes.Comparison)
                        filterBuilder.Append("and ");
                } else if (wordType == FilterWordTypes.OpenBracket) {
                    if (prevWordType == FilterWordTypes.Other || prevWordType == FilterWordTypes.String)
                        filterBuilder.Append("and ");
                }
            }

            if (wordType == FilterWordTypes.String)
            {
                char quote = word[0];
                filterBuilder.Append(quote);
                if (word.Length > 2)
                {
                    string strContent = word.Substring(1, word.Length - 2);
                    filterBuilder.Append(strContent.Replace(quote, '_')); // replace quote characters inside the string with a wildcard character
                }
                filterBuilder.Append(quote);
            }
            else
                filterBuilder.Append(word);

            return wordType;
        }
        private static FilterWordTypes AddFilterWord(StringBuilder filterBuilder, string filter, int wordStart, int nextWordStart, FilterWordTypes wordType, FilterWordTypes prevWordType, List<string> filterableProperties)
        {
            string word = filter.Substring(wordStart, nextWordStart - wordStart);

            if (wordType == FilterWordTypes.Other)
            {
                // Try to fix properties merged with other stuff
                foreach(var property in filterableProperties)
                {
                    int propIndex = word.IndexOf(property);
                    if (propIndex < 0)
                        continue;

                    if (propIndex > 0)
                        prevWordType = AddFilterWord(filterBuilder, word.Substring(0, propIndex), FilterWordTypes.Other, prevWordType);

                    prevWordType = AddFilterWord(filterBuilder, property, FilterWordTypes.Other, prevWordType);

                    int trailIndex = propIndex + property.Length;
                    if (trailIndex < word.Length)
                        prevWordType = AddFilterWord(filterBuilder, word.Substring(trailIndex), FilterWordTypes.Other, prevWordType);

                    return prevWordType;
                }
            }

            return AddFilterWord(filterBuilder, word, wordType, prevWordType);
        }