private static IQueryable<LucenePackage> ApplySort(SearchCriteria criteria, IQueryable<LucenePackage> packages) { Expression<Func<LucenePackage, object>> sortSelector = null; switch (criteria.SortField) { case SearchSortField.Id: sortSelector = p => p.Id; break; case SearchSortField.Title: sortSelector = p => p.Title; break; case SearchSortField.Published: sortSelector = p => p.Published; break; case SearchSortField.Score: sortSelector = p => p.Score(); break; } if (sortSelector == null) { return packages; } var orderedPackages = criteria.SortDirection == SearchSortDirection.Ascending ? packages.OrderBy(sortSelector) : packages.OrderByDescending(sortSelector); if (criteria.SortField == SearchSortField.Id) { orderedPackages = orderedPackages.ThenByDescending(p => p.Version); } return orderedPackages; }
protected virtual IQueryable<LucenePackage> ApplySearchCriteria(SearchCriteria criteria, IQueryable<LucenePackage> packages) { var advancedQuerySyntax = criteria.SearchTerm.Any(c => AdvancedQueryCharacters.Contains(c)); if (advancedQuerySyntax) { var queryParser = new NuGetQueryParser(LuceneDataProvider.CreateQueryParser<LucenePackage>()) { AllowLeadingWildcard = true }; try { var query = queryParser.Parse(criteria.SearchTerm); return packages.Where(query); } catch (ParseException ex) { throw new InvalidSearchCriteriaException("Failed to parse query", ex); } } return from pkg in packages where ((pkg.Id == criteria.SearchTerm).Boost(5) || (pkg.SearchId == criteria.SearchTerm).Boost(4) || (pkg.Title == criteria.SearchTerm).Boost(3) || (pkg.Tags == criteria.SearchTerm).Boost(2) || (pkg.Authors.Contains(criteria.SearchTerm) || pkg.Owners.Contains(criteria.SearchTerm)).Boost(2) || (pkg.Files.Contains(criteria.SearchTerm)) || (pkg.Summary == criteria.SearchTerm || pkg.Description == criteria.SearchTerm)).AllowSpecialCharacters() select pkg; }
public IQueryable<IPackage> Search(SearchCriteria criteria) { var packages = LucenePackages; if (!string.IsNullOrEmpty(criteria.SearchTerm)) { packages = ApplySearchCriteria(criteria, packages); } if (!criteria.AllowPrereleaseVersions) { packages = packages.Where(p => !p.IsPrerelease); } if (criteria.TargetFrameworks != null && criteria.TargetFrameworks.Any()) { packages = ApplyTargetFrameworkFilter(criteria, packages); } if (criteria.PackageOriginFilter != PackageOriginFilter.Any) { var flag = criteria.PackageOriginFilter == PackageOriginFilter.Mirror; packages = packages.Where(p => p.IsMirrored == flag); } packages = ApplySort(criteria, packages); return packages; }
protected virtual IQueryable<LucenePackage> ApplyTargetFrameworkFilter(SearchCriteria criteria, IQueryable<LucenePackage> packages) { return frameworkCompatibilityTool.FilterByTargetFramework(packages, criteria.TargetFrameworks.First()); }
public IQueryable<IPackage> Search(SearchCriteria criteria) { var packages = LucenePackages; if (!string.IsNullOrEmpty(criteria.SearchTerm)) { packages = from pkg in packages where ((pkg.Id == criteria.SearchTerm || pkg.Title == criteria.SearchTerm).Boost(3) || (pkg.Tags == criteria.SearchTerm).Boost(2) || (pkg.Authors.Contains(criteria.SearchTerm) || pkg.Owners.Contains(criteria.SearchTerm)).Boost(2) || (pkg.Summary == criteria.SearchTerm || pkg.Description == criteria.SearchTerm)).AllowSpecialCharacters() select pkg; } if (!criteria.AllowPrereleaseVersions) { packages = packages.Where(p => !p.IsPrerelease); } if (criteria.PackageOriginFilter != PackageOriginFilter.Any) { var flag = criteria.PackageOriginFilter == PackageOriginFilter.Mirror; packages = packages.Where(p => p.IsMirrored == flag); } packages = ApplySort(criteria, packages); return packages; }