public async Task<PackageSearchResults> Search(string query, PackageSearchOptions options, Uri source = null)
        {
            await this._progressService.StartLoading("Search");
            if (string.IsNullOrWhiteSpace(query))
            {
                this._progressService.WriteMessage("Loading data...");
            }
            else
            {
                this._progressService.WriteMessage(string.Format("Searching for {0}", query));
            }

            if (source == null)
            {
                source = new Uri(this._sourceService.GetDefaultSource().Url);
            }

            if (source.Scheme == "http" || source.Scheme == "https")
            {
                var results = await ODataPackageService.Search(query, this._packageFactory, options, source);
                await this._progressService.StopLoading();
                return results;
            }

            if (source.IsFile || source.IsUnc)
            {
                await this._progressService.StopLoading();
                return null;
            }

            throw new InvalidDataException("Invalid Source Uri. Double check that you current source is a valid endpoint.");
        }
        public static async Task<PackageSearchResults> Search(string query, Func<IPackageViewModel> packageFactory, PackageSearchOptions options, Uri source)
        {
            var service = GetFeed(source);
            var queryString = query;
            IQueryable<V2FeedPackage> feedQuery = service.Packages.Where(package => package.IsPrerelease == options.IncludePrerelease || package.IsPrerelease == false);

            if (!options.IncludeAllVersions)
            {
                feedQuery = feedQuery.Where(package => package.IsLatestVersion || package.IsAbsoluteLatestVersion);
            }

            if (!string.IsNullOrWhiteSpace(queryString))
            {
                feedQuery = options.MatchQuery ?
                    feedQuery.Where(package => package.Id == queryString || package.Title == queryString) :
                    feedQuery.Where(package => package.Id.Contains(queryString) || package.Title.Contains(queryString));
            }

            var totalCount = feedQuery.Count();

            if (!string.IsNullOrWhiteSpace(options.SortColumn))
            {
                feedQuery = !options.SortDescending ? feedQuery.OrderBy(options.SortColumn) : feedQuery.OrderByDescending(options.SortColumn);
            }

            feedQuery = feedQuery.Skip(options.CurrentPage * options.PageSize).Take(options.PageSize);
            var feedDataServiceQuery = (DataServiceQuery<V2FeedPackage>)feedQuery;
            var result = await Task.Factory.FromAsync(feedDataServiceQuery.BeginExecute, ar => feedDataServiceQuery.EndExecute(ar), null);

            var packages = result.Select(package => AutoMapper.Mapper.Map(package, packageFactory()));

            return new PackageSearchResults
            {
                TotalCount = totalCount,
                Packages = packages
            };
        }
 private static string GetMemoryCacheKey(Uri source, string query, PackageSearchOptions options)
 {
     return string.Format(CultureInfo.CurrentCulture, "FileSystemPackageService.QueryResult.{0}|{1}|{2}|{3}", source, query, options.IncludeAllVersions, options.IncludePrerelease);
 }