private static SearchResults PopulateSearchResultsFromFeed(SyndicationFeed feed, int offset, int limit) { SearchResults searchResults = new SearchResults(); int totalHits = 0; int.TryParse(GetAttributeValue(feed, SearchSettings.Config.SyndicationFeedAttributeNameTotalHits), out totalHits); string attributeValue = GetAttributeValue(feed, SearchSettings.Config.SyndicationFeedAttributeNameVersion); foreach (SyndicationItem current in feed.Items) { try { IndexResponseItem indexResponseItem = new IndexResponseItem(current.Id); indexResponseItem.Title = ((current.Title != null) ? current.Title.Text : null); indexResponseItem.DisplayText = (((TextSyndicationContent)current.Content != null) ? ((TextSyndicationContent)current.Content).Text : null); indexResponseItem.Created = current.PublishDate.DateTime; indexResponseItem.Modified = current.LastUpdatedTime.DateTime; indexResponseItem.Uri = current.BaseUri; indexResponseItem.Culture = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameCulture); indexResponseItem.ItemType = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameType); indexResponseItem.NamedIndex = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameNamedIndex); indexResponseItem.Metadata = GetElementValue(current, SearchSettings.Config.SyndicationItemElementNameMetadata); DateTime value; if (DateTime.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNamePublicationEnd), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out value)) { indexResponseItem.PublicationEnd = new DateTime?(value); } DateTime value2; if (DateTime.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNamePublicationStart), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out value2)) { indexResponseItem.PublicationStart = new DateTime?(value2); } float num = 1f; indexResponseItem.BoostFactor = (float.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameBoostFactor), out num) ? num : 1f); Uri uri = null; indexResponseItem.DataUri = (Uri.TryCreate(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameDataUri), UriKind.RelativeOrAbsolute, out uri) ? uri : null); float num2 = 0f; indexResponseItem.Score = (float.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameScore), out num2) ? num2 : 0f); AddAuthorsToIndexItem(current, indexResponseItem); AddCategoriesToIndexItem(current, indexResponseItem); AddACLToIndexItem(current, indexResponseItem); AddVirtualPathToIndexItem(current, indexResponseItem); if (SearchResultFilterHandler.Include(indexResponseItem)) { searchResults.IndexResponseItems.Add(indexResponseItem); } } catch (Exception ex) { SearchSettings.Log.Error(string.Format("Could not populate search results for syndication item with id '{0}'. Message: {1}{2}", current.Id, ex.Message, ex.StackTrace)); } } if (SearchSettings.Config.UseIndexingServicePaging) { searchResults.TotalHits = totalHits; searchResults.Version = attributeValue; return(searchResults); } SearchResults searchResults2 = new SearchResults(); searchResults2.TotalHits = searchResults.IndexResponseItems.Count; foreach (IndexResponseItem current2 in searchResults.IndexResponseItems.Skip(offset).Take(limit)) { searchResults2.IndexResponseItems.Add(current2); } searchResults2.Version = attributeValue; return(searchResults2); }
// Hieu Le: Added sort param protected internal virtual SearchResults GetSearchResults(string query, string namedIndexingService, Collection <string> namedIndexes, int offset, int limit, Collection <string> sortFields) { var dictionary = new Dictionary <string, string>(); var results = new SearchResults(); var namedIndexingServiceElement = SearchSettings.GetNamedIndexingServiceElement(namedIndexingService); string text = string.Empty; if (namedIndexes != null && namedIndexes.Count > 0) { foreach (string current in namedIndexes) { text = text + current + "|"; } text = text.Substring(0, text.LastIndexOf("|", StringComparison.Ordinal)); } #region Customized // Hieu Le: Build sort text var sortFieldsTextBuilder = new StringBuilder(); if (sortFields != null && sortFields.Count > 0) { foreach (string sortField in sortFields) { sortFieldsTextBuilder.Append(sortField); sortFieldsTextBuilder.Append("|"); } if (sortFieldsTextBuilder.Length > 0) { sortFieldsTextBuilder.Remove(sortFieldsTextBuilder.Length - 1, 1); } } #endregion dictionary.Add("{q}", query); dictionary.Add("{namedindexes}", text); dictionary.Add("{accesskey}", namedIndexingServiceElement.AccessKey); dictionary.Add("{offset}", SearchSettings.Config.UseIndexingServicePaging ? offset.ToString(CultureInfo.InvariantCulture.NumberFormat) : "0"); dictionary.Add("{limit}", SearchSettings.Config.UseIndexingServicePaging ? limit.ToString(CultureInfo.InvariantCulture.NumberFormat) : SearchSettings.Config.MaxHitsFromIndexingService.ToString(CultureInfo.InvariantCulture.NumberFormat)); // Customized: Added sort to dictionary dictionary.Add("{sort}", sortFieldsTextBuilder.ToString()); string text2 = SearchSettings.Config.SearchUriTemplate; foreach (string current2 in dictionary.Keys) { text2 = text2.Replace(current2, HttpUtility.UrlEncode(dictionary[current2])); } text2 = namedIndexingServiceElement.BaseUri + text2; XmlTextReader xmlReader = null; SearchSettings.Log.Debug(string.Format("Start get search results from service with url '{0}'", text2)); OnSearchRequestSending(this, new EventArgs()); try { MakeHttpRequest(text2, namedIndexingServiceElement, "GET", null, delegate(WebResponse response) { xmlReader = new XmlTextReader(response.GetResponseStream()); xmlReader.Normalization = false; SyndicationFeed feed = SyndicationFeed.Load(xmlReader); results = PopulateSearchResultsFromFeed(feed, offset, limit); }); OnSearchRequestSent(this, new EventArgs()); } catch (Exception ex) { SearchSettings.Log.Error(string.Format("Could not get search results for uri '{0}'. Message: {1}{2}", text2, ex.Message, ex.StackTrace)); return(results); } SearchSettings.Log.Debug(string.Format("End get search results", new object[0])); return(results); }