/// <summary>
        /// Provides a view of features packages that have recently bee updated in the repository group.
        /// Return the three most recently updated packages in the group.
        /// </summary>
        public ActionResult RecentlyUpdated()
        {
            log.DebugFormat("Controller action requested");

            // Create the CKAN search parameters
            var searchParameters = new PackageSearchParameters();
            searchParameters.Groups.Add(SettingsHelper.GetCatalogGroup());

            // Collect the results
            List<Package> packages = CkanHelper.GetAllPackages();

            // Sort by date and take the top 3
            packages = (from package in packages
                                      orderby package.MetadataModified
                                      descending
                                      select package)
                         .Take(3)
                         .ToList();

            SettingsHelper.FilterTitles(packages);

            // Update the results to the top 3
            PackageSearchResponse<Package> response = new PackageSearchResponse<Package>();
            response.Results = packages;
            response.Count = packages.Count;

            // Populate the model
            PackageSearchResultsModel model = new PackageSearchResultsModel();
            model.SearchResults = response;

            // Render the view
            return View(model);
        }
예제 #2
0
        public void ShouldReturnPackagesWithTag()
        {
            CkanClient client = CkanApiHelper.GetCkanClient();

            PackageSearchParameters parameters = new PackageSearchParameters();

            parameters.Tags.Add("colorado");

            PackageSearchResponse <Package> response = client.SearchPackages <Package>(parameters);

            Assert.NotEmpty(response.Results);
        }
예제 #3
0
        public void ShouldReturnPackageIdsWithQuery()
        {
            CkanClient client = CkanApiHelper.GetCkanClient();

            PackageSearchParameters parameters = new PackageSearchParameters();

            parameters.Query = "bike";

            PackageSearchResponse <string> response = client.SearchPackages <string>(parameters);

            Assert.NotEmpty(response.Results);
        }
예제 #4
0
        public void ShouldReturnSinglePackagesWithQueryLimit()
        {
            CkanClient client = CkanApiHelper.GetCkanClient();

            PackageSearchParameters parameters = new PackageSearchParameters();

            parameters.Query  = "bike";
            parameters.Offset = 0;
            parameters.Limit  = 1;

            PackageSearchResponse <Package> response = client.SearchPackages <Package>(parameters);

            Assert.True(response.Results.Count == 1);
        }
예제 #5
0
        /// <summary>
        /// Search for packages in the CKAN repository and just return tag counts with caching.
        /// </summary>
        /// <param name="parameters">Provides that parameters to use in the search.</param>
        /// <param name="settings">The cache settings.</param>
        /// <returns>Search results</returns>
        public List <Tag> SearchPackagesGetTagCounts(PackageSearchParameters parameters, CacheSettings settings)
        {
            // Execute the search request
            parameters.Offset = 0;
            parameters.Limit  = GetPackageCount(parameters, settings);

            PackageSearchResponse <Package> response = SearchPackages <Package>(parameters, settings);

            List <Package> packages = response.Results;

            List <Tag> tags = TagHelper.GetTagCounts(packages);

            return(tags);
        }
        /// <summary>
        /// Get all packages from the CKAN group.
        /// </summary>
        /// <returns></returns>
        public static List <Package> GetAllPackages()
        {
            CacheSettings settings = new CacheSettings(SettingsHelper.GetAllPackagesCacheDuration(), SettingsHelper.GetAllPackagesCacheBackgroundUpdate());

            // Create the CKAN search parameters
            var searchParameters = new PackageSearchParameters();

            searchParameters.Groups.Add(SettingsHelper.GetCatalogGroup());
            searchParameters.Limit = GetPackageCount();

            // Collect the results
            PackageSearchResponse <Package> response = CkanHelper.GetClient().SearchPackages <Package>(searchParameters, settings);

            return(response.Results);
        }
예제 #7
0
        public void ShouldReturnPackagesWithGroup()
        {
            CkanClient client = CkanApiHelper.GetCkanClient();

            PackageSearchParameters parameters = new PackageSearchParameters();

            parameters.Groups.Add("arvada");

            PackageSearchResponse <Package> response = client.SearchPackages <Package>(parameters);

            Assert.NotEmpty(response.Results);

            foreach (var result in response.Results)
            {
                Assert.Contains <string>("arvada", result.Groups);
            }
        }
        /// <summary>
        /// Provides a view of features packages in the repository group.  Featured
        /// packages are those that are tagged with "featured".
        /// </summary>
        public ActionResult FeaturedPackages()
        {
            log.DebugFormat("Controller action requested");

            // Create the CKAN search parameters
            var searchParameters = new PackageSearchParameters();

            searchParameters.Groups.Add(SettingsHelper.GetCatalogGroup());
            searchParameters.Limit = SettingsHelper.GetHomeFeaturedPackageLimit();
            searchParameters.Tags.Add(SettingsHelper.GetHomeFeaturedPackagesTag());

            // Collect the results
            PackageSearchResponse <Package> results = CkanHelper.GetClient().SearchPackages <Package>(searchParameters, new CacheSettings(SettingsHelper.GetFeaturedPackagesCacheDuration()));

            SettingsHelper.FilterTitles(results.Results);

            // Render the view
            return(View(results));
        }
        /// <summary>
        /// Generates a trie of suggestions based on attributes of packages in the catalog
        /// </summary>
        /// <param name="client"></param>
        /// <param name="searchParameters"></param>
        /// <param name="cacheSettings"></param>
        /// <returns></returns>
        private static Trie GenerateTrie(CkanClient client, PackageSearchParameters searchParameters, CacheSettings cacheSettings)
        {
            // Create an empty trie
            Trie trie = new Trie();

            // Run the search to get all packages
            PackageSearchResponse <Package> response = client.SearchPackages <Package>(searchParameters, cacheSettings);

            // Add the entrys to the trie
            foreach (var package in response.Results)
            {
                // Add the package title
                trie.Add(package.Title);

                // Add the package tags (removing hyphens which represent spaces)
                foreach (var tag in package.Tags)
                {
                    trie.Add(tag.Replace("-", " "));
                }
            }

            return(trie);
        }
        /// <summary>
        /// Provides a view of features packages that have recently bee updated in the repository group.
        /// Return the three most recently updated packages in the group.
        /// </summary>
        public ActionResult RecentlyUpdated()
        {
            log.DebugFormat("Controller action requested");

            // Create the CKAN search parameters
            var searchParameters = new PackageSearchParameters();

            searchParameters.Groups.Add(SettingsHelper.GetCatalogGroup());

            // Collect the results
            List <Package> packages = CkanHelper.GetAllPackages();

            // Sort by date and take the top 3
            packages = (from package in packages
                        orderby package.MetadataModified
                        descending
                        select package)
                       .Take(3)
                       .ToList();

            SettingsHelper.FilterTitles(packages);

            // Update the results to the top 3
            PackageSearchResponse <Package> response = new PackageSearchResponse <Package>();

            response.Results = packages;
            response.Count   = packages.Count;

            // Populate the model
            PackageSearchResultsModel model = new PackageSearchResultsModel();

            model.SearchResults = response;

            // Render the view
            return(View(model));
        }
예제 #11
0
        /// <summary>
        /// Search for packages in the CKAN repository with caching.
        /// </summary>
        /// <param name="parameters">Provides that parameters to use in the search.</param>
        /// <param name="settings">The cache settings.</param>
        /// <returns>Search results</returns>
        public PackageSearchResponse <T> SearchPackages <T>(PackageSearchParameters parameters, CacheSettings settings)
        {
            var request = new RestRequest();

            request.Resource = "2/search/package";

            // Apply query parameter
            foreach (var group in parameters.Groups)
            {
                request.AddParameter("q", "organization:" + group);
            }

            // Apply title parameter
            if (!String.IsNullOrEmpty(parameters.Title))
            {
                request.AddParameter("title", parameters.Title);
            }

            // Apply tag parameters
            foreach (var tag in parameters.Tags)
            {
                request.AddParameter("tags", tag);
            }

            // Apply notes parameter
            if (!String.IsNullOrEmpty(parameters.Notes))
            {
                request.AddParameter("notes", parameters.Notes);
            }

            //// Apply group parameters
            //foreach (var group in parameters.Groups)
            //{
            //    request.AddParameter("groups", group);
            //}

            // Apply author parameter
            if (!String.IsNullOrEmpty(parameters.Author))
            {
                request.AddParameter("author", parameters.Author);
            }

            // Apply update_frequency parameter
            if (!String.IsNullOrEmpty(parameters.UpdateFrequency))
            {
                request.AddParameter("update_frequency", parameters.UpdateFrequency);
            }

            // Apply maintainer parameter
            if (!String.IsNullOrEmpty(parameters.Maintainer))
            {
                request.AddParameter("maintainer", parameters.Maintainer);
            }

            // Apply all_fields parameter
            if (typeof(T) == typeof(Package))
            {
                request.AddParameter("all_fields", 1);
            }

            // Apply filter_by_openness parameter
            if (parameters.FilterByOpenness)
            {
                request.AddParameter("filter_by_openness", "1");
            }

            // Apply filter_by_downloadable parameter
            if (parameters.FilterByDownloadable)
            {
                request.AddParameter("filter_by_downloadable", "1");
            }

            // Apply order_by parameter
            if (!String.IsNullOrEmpty(parameters.OrderBy))
            {
                request.AddParameter("order_by", parameters.OrderBy);
            }

            // Set the offset and limit parameters
            if (parameters.Offset > -1)
            {
                request.AddParameter("offset", parameters.Offset);
            }

            if (parameters.Limit > -1)
            {
                request.AddParameter("limit", parameters.Limit);
            }

            // Execute the search request
            PackageSearchResponse <T> response = Execute <PackageSearchResponse <T> >(request, settings);

            // If no results, return an empty results object
            if (response == null)
            {
                response = new PackageSearchResponse <T>();
            }
            else
            {
                if (typeof(T) == typeof(Package) && parameters.AggregateTagCounts && response.Results.Count > 0)
                {
                    if (response.Results.Count == response.Count)
                    {
                        // If we have all of the results on the current page just aggregate the tags
                        if (typeof(T) == typeof(Package))
                        {
                            List <Package> packages = response.Results.ConvertAll(item => (Package)((object)item));
                            response.Tags = TagHelper.GetTagCounts(packages);
                        }
                    }
                    else
                    {
                        // If we don't have all of the results submit another request to
                        // get all of the tags
                        response.Tags = SearchPackagesGetTagCounts(parameters, settings);
                    }
                }
            }

            return(response);
        }