public virtual List <SearchResultCategory> GetRootMatchesByForm(string[] roots) { var categories = new List <SearchResultCategory>(); foreach (var rootText in roots) { var root = _storageService.SetOf <Root>().Include(r => r.RootUsages) .ThenInclude(u => u.Word.WordParts) .ThenInclude(w => w.WordPartType) .SingleOrDefault(r => r.Text == rootText); if (root != null) { var rootUsages = root.RootUsages.ToList(); var wordUsages = rootUsages .Select(u => new { Usage = u, FullWord = string.Concat(u.Word.WordParts.Select(p => p.Text)) }) .ToList(); var groups = wordUsages.GroupBy(w => w.FullWord); foreach (var group in groups) { var category = new SearchResultCategory(); category.MatchType = rootText; category.Match = $"matching root verb \"\u200f{group.Key}\u200e\""; category.Results = group.Select(x => new VerseResult { SurahNumber = x.Usage.SurahNumber, VerseNumber = x.Usage.VerseNumber, WordNumber = x.Usage.WordNumber, WordPartNumber = x.Usage.WordPartNumber }).OrderBy(x => x.SurahNumber).ThenBy(x => x.VerseNumber).ThenBy(x => x.WordNumber).ToList(); categories.Add(category); } } else { var stemText = rootText; var wordParts = _storageService.SetOf <WordPart>().Where(w => w.WordPartPositionTypeCode == "STEM" && w.Text == stemText).ToList(); var wordUsages = wordParts.Select(u => new { Usage = u, FullWord = string.Concat(u.Word.WordParts.Select(p => p.Text)) }).ToList(); var groups = wordUsages.GroupBy(w => w.FullWord); foreach (var group in groups) { var category = new SearchResultCategory(); category.MatchType = stemText; category.Match = $"matching word \"\u200f{group.Key}\u200e\""; category.Results = group.Select(x => new VerseResult { SurahNumber = x.Usage.SurahNumber, VerseNumber = x.Usage.VerseNumber, WordNumber = x.Usage.WordNumber, WordPartNumber = x.Usage.WordPartNumber }).OrderBy(x => x.SurahNumber).ThenBy(x => x.VerseNumber).ThenBy(x => x.WordNumber).ToList(); categories.Add(category); } } } categories = categories.OrderBy(c => c.MatchType).ThenBy(x => x.Match).ToList(); return(categories); }
async void SearchResult_ResultCategorySelected(object sender, SearchResultCategory e) { await Task.Delay(150); Func <object, bool> searchFilter = null; if (e.Type == SearchResultCategoryType.Stop) { RouteList.Visibility = Visibility.Collapsed; searchFilter = (o => o is StopModel); } else { StopList.Visibility = Visibility.Collapsed; searchFilter = (o => o is RouteGroup && e.RouteTypes.Contains((o as RouteGroup).Type)); } await SetContent(true, searchFilter); hadSearch = false; ResetSearchResult(); }
private static SearchResultCategory GetRootMatches(string[] words, StorageService s) { IEnumerable <string> verses = null; foreach (var word in words) { var root = s.SetOf <Root>().SingleOrDefault(r => r.Text == word); if (root != null) { var matches = root.RootUsages.Select(u => u.SurahNumber.ToString("000") + ":" + u.VerseNumber.ToString("000")).ToList(); if (verses == null) { verses = matches; } else { verses = verses.Intersect(matches); } } } verses = verses ?? new List <string>(); verses = verses.Distinct(); var verseList = verses.ToList(); verseList.Sort(); var verseReferences = verseList.Select(v => new { surahNumber = int.Parse(v.Substring(0, 3)), verseNumber = int.Parse(v.Substring(4, 3)) }).ToList(); var rootMatches = new SearchResultCategory { MatchType = "matching all root verbs in verse", Match = $" \"\u200f{string.Join("\u200e\", \"\u200f",words)}\u200e\"", Results = verseReferences.Select(v => new VerseResult { SurahNumber = v.surahNumber, VerseNumber = v.verseNumber }).ToList() }; return(rootMatches); }
void SearchResult_ResultCategorySelected(object sender, SearchResultCategory e) { ViewModel.SelectResultCategory(e); }