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); }
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); }