//Get a Competency Framework description set
        public static CTDLAPICompetencyFrameworkResultSet GetCompetencyFrameworkDescriptionSet(string ctid)
        {
            var queryData = new JObject()
            {
                { "@type", "ceterms:CompetencyFramework" },
                { "ceterms:ctid", ctid }
            };

            var clientIP = "unknown";

            try
            {
                clientIP = HttpContext.Current.Request.UserHostAddress;
            }
            catch { }

            var resultData = DoQuery(queryData, 0, 1, "", true, "https://credentialfinder.org/Finder/SearchViaRegistry/", clientIP, "CompetencyFramework");

            var resultSet = new CTDLAPICompetencyFrameworkResultSet()
            {
                Results      = ParseResults <CTDLAPICompetencyFrameworkResult>(resultData.data),
                RelatedItems = resultData.extra.RelatedItems,
                TotalResults = resultData.extra.TotalResults
            };

            return(resultSet);
        }
        //

        //Use the Credential Registry to search for competency frameworks
        public static CTDLAPICompetencyFrameworkResultSet SearchViaRegistry(MainSearchInput data, bool asDescriptionSet = false)
        {
            //Handle blind searches
            if (string.IsNullOrWhiteSpace(data.Keywords))
            {
                data.Keywords = "search:anyValue";
            }

            var queryData = new JObject()
            {
                //Get competency frameworks...
                { "@type", "ceasn:CompetencyFramework" },
                { "search:termGroup", new JObject()
                  {
                      //Where name or description or CTID matches the keywords, or...
                      { "ceasn:name", data.Keywords },
                      { "ceasn:description", data.Keywords },
                      { "ceterms:ctid", data.Keywords },
                      //Where the framework contains a competency (via reverse connection) with competency text that contains the keywords
                      { "ceasn:isPartOf", new JObject()
                                        {
                                            { "ceasn:competencyText", data.Keywords },
                                            { "ceterms:ctid", data.Keywords },
                                            { "search:operator", "search:orTerms" }
                                        } },
                      //Or where the creator or publisher have a name or CTID that matches the keywords
                      { "ceasn:creator", new JObject()
                                        {
                                            { "ceterms:name", data.Keywords },
                                            { "ceterms:ctid", data.Keywords },
                                            { "search:operator", "search:orTerms" }
                                        } },
                      { "ceasn:publisher", new JObject()
                                        {
                                            { "ceterms:name", data.Keywords },
                                            { "ceterms:ctid", data.Keywords },
                                            { "search:operator", "search:orTerms" }
                                        } },
                      { "search:operator", "search:orTerms" }
                  } }
            };

            var skip = data.PageSize * (data.StartPage - 1);
            var take = data.PageSize;

            var clientIP = "unknown";

            try
            {
                clientIP = HttpContext.Current.Request.UserHostAddress;
            }
            catch { }

            var orderBy         = "";
            var orderDescending = true;

            TranslateSortOrder(data.SortOrder, ref orderBy, ref orderDescending);

            var resultData = DoQuery(queryData, skip, take, orderBy, orderDescending, "https://credentialfinder.org/Finder/SearchViaRegistry/", clientIP, asDescriptionSet ? "CompetencyFramework" : "");

            if (resultData.valid)
            {
                var resultSet = new CTDLAPICompetencyFrameworkResultSet()
                {
                    Results      = ParseResults <CTDLAPICompetencyFrameworkResult>(resultData.data),
                    RelatedItems = resultData.extra.RelatedItems,
                    TotalResults = resultData.extra.TotalResults,
                };
                try
                {
                    var cacheSuccess = false;
                    var cacheident   = "";
                    resultSet.PerResultRelatedItems = GetRelatedItemsForResults(resultData.data, resultData.extra.RelatedItems, data.Keywords == "search:anyValue", ref cacheSuccess, ref cacheident);
                    resultSet.Debug = new JObject()
                    {
                        { "Keywords", data.Keywords },
                        { "Use Cache", data.Keywords == "search:anyValue" },
                        { "Cache Succss", cacheSuccess },
                        { "Cache ID", cacheident }
                    };
                }
                catch (Exception ex)
                {
                    resultSet.PerResultRelatedItems = new List <CTDLAPICompetencyFrameworkRelatedItemSetForSearchResult>()
                    {
                        new CTDLAPICompetencyFrameworkRelatedItemSetForSearchResult()
                        {
                            Competencies = new CTDLAPIRelatedItemForSearchResult()
                            {
                                Label   = "Error loading competencies: " + ex.Message,
                                Samples = new List <JObject>()
                                {
                                    JObject.FromObject(ex)
                                }
                            }
                        }
                    };
                }

                return(resultSet);
            }
            else
            {
                var list   = new List <CTDLAPICompetencyFrameworkResult>();
                var result = new CTDLAPICompetencyFrameworkResult()
                {
                    Name        = new LanguageMap("Error encountered"),
                    Description = string.IsNullOrWhiteSpace(resultData.status) ? new LanguageMap("Sorry no useable message was returned.") : new LanguageMap(resultData.status)
                };
                list.Add(result);
                return(new CTDLAPICompetencyFrameworkResultSet()
                {
                    Results = list,
                    RelatedItems = null,
                    TotalResults = 0
                });
            }
        }