private SearchResult FindUnique(string search, IndexFilter filter) { search = search ?? ""; // Try searching for partial string first -- if this gives an unique result, go with it var characterItems = _index.Where(x => x.Owner.ToLower().Contains(search.ToLower()) && FilterMatch(x, filter)); // Otherwise, match the full character name if (characterItems.Select(x => x.Owner.ToLower()).Distinct().Count() > 1) { characterItems = _index.Where(x => x.Owner.ToLower() == search.ToLower() && FilterMatch(x, filter)); } search = characterItems.FirstOrDefault()?.Owner ?? search; List <IndexItem> results = new List <IndexItem>(); foreach (var item in characterItems) { var itemName = ItemHelper.GetFullItemName(item.SourceInstance, item.Source); var dupe = _index.Where(x => x.ItemName.ToLower() == itemName.ToLower() && x.Owner.ToLower() != search.ToLower()); if (dupe.Count() == 0) { results.Add(item); item.DuplicatesOnCharacters = dupe.Select(x => x.Owner).ToList(); } } return(new SearchResult(results.OrderBy(x => x.Bag).ToList())); }
private bool FilterMatch(IndexItem item, IndexFilter filter) { if (filter.MaxLevel != null && item.LevelRequirement > filter.MaxLevel) { return(false); } if (filter.MinLevel != null && item.LevelRequirement < filter.MinLevel) { return(false); } if (filter.IncludeEquipped != null && (!filter.IncludeEquipped.Value && item.IsEquipped)) { return(false); } if (filter.ItemQualities != null && !filter.ItemQualities.Contains(item.Rarity)) { return(false); } if (filter.ItemTypes != null && !filter.ItemTypes.Contains(item.ItemType)) { return(false); } return(true); }
private SearchResult Find(string search, IndexFilter filter) { search = search ?? ""; var result = _index.Where(x => x.Searchable.Contains(search.ToLower()) && FilterMatch(x, filter)); if (filter.PageSize != null) { return(new SearchResult(result.Take(filter.PageSize.Value).ToList(), result.Count())); } return(new SearchResult(result.ToList())); }
public async Task <SearchResult> FindUniqueAsync(string search, IndexFilter filter) { return(await Task.Run(() => FindUnique(search, filter)).ConfigureAwait(false)); }