/// <summary> /// Method to get listing model /// </summary> /// <param name="pageNumber">page number</param> /// <param name="pageSize">page size</param> /// <param name="filter">filter</param> /// <param name="parentItemId">Parent id when directly access Folder item</param> /// <returns>SearchResultsGeneric<ListingSearchResultItem> </returns> public SearchResultsGeneric <ListingSearchResultItem> GetListingModel(int pageNumber = -1, int pageSize = -1, string filter = "", string itemId = "", string listItemTemplateId = "", bool showFilters = false, string parentItemId = "") { List <SearchCondition> yearFolderparentSearchCondition = new List <SearchCondition>(); listItemTemplateId = SearchHelper.FormatGuid(listItemTemplateId); SearchResultsGeneric <ListingSearchResultItem> resultsList = new SearchResultsGeneric <ListingSearchResultItem>(); SearchResultsGeneric <ListingSearchResultItem> parentResultsList = new SearchResultsGeneric <ListingSearchResultItem>(); ID id = null; //This is used when the context item from folder template for SEO, so get its parent listing page as context item if (!string.IsNullOrEmpty(parentItemId) && !string.IsNullOrEmpty(filter)) { Sitecore.Data.ID.TryParse(parentItemId, out id); } else//Context item id { Sitecore.Data.ID.TryParse(itemId, out id); } if (id.IsNull) { return(resultsList); } Item parent = null; if (!string.IsNullOrEmpty(parentItemId) && string.IsNullOrEmpty(filter)) { //Filter from parent items parent = Sitecore.Context.Database.GetItem(parentItemId); yearFolderparentSearchCondition = new List <SearchCondition> { new SearchCondition() { Name = CommonConstants.TemplateID, Value = listItemTemplateId, CompareType = CompareType.ExactMatch }, new SearchCondition() { Name = Sitecore.ContentSearch.BuiltinFields.Path, Value = SearchHelper.FormatGuid(parentItemId.ToString()), CompareType = CompareType.ExactMatch } }; } //Filter current context item childs List <SearchCondition> conditions = new List <SearchCondition> { new SearchCondition() { Name = CommonConstants.TemplateID, Value = listItemTemplateId, CompareType = CompareType.ExactMatch }, new SearchCondition() { Name = Sitecore.ContentSearch.BuiltinFields.Path, Value = SearchHelper.FormatGuid(id.ToString()), CompareType = CompareType.ExactMatch } }; //Get Events of only current year if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.EventsTemplateID))) { conditions.Add(new SearchCondition() { Name = CommonConstants.YearFacetField, Value = DateTime.UtcNow.Year.ToString(), CompareType = CompareType.ExactMatch }); } yearFolderparentSearchCondition = SearchHelper.AddFilterConditions(filter, yearFolderparentSearchCondition); conditions = SearchHelper.AddFilterConditions(filter, conditions); List <Facet> facets = new List <Facet>(); //Facets not required from second request, if (pageNumber <= 0 && showFilters) { // Add Year facet except events and downloads if (!listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.EventsTemplateID)) && !listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.DownloadItemTemplateID))) { facets.Add(new Facet() { facetField = CommonConstants.YearFacetField, allLabel = Sitecore.Globalization.Translate.Text(CommonConstants.AllYearsKey), minCount = 1 }); } // Add Categories facet except Image items (Image Album page) if (!listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.ImageItemTemplateID))) { facets.Add(new Facet() { facetField = CommonConstants.CategoriesFacetField, allLabel = Sitecore.Globalization.Translate.Text(CommonConstants.AllCategoriesKey), minCount = 1 }); } } //Sort Option if (parent != null && (parent.TemplateID.Equals(Sitecore.Data.ID.Parse(CommonConstants.NewsListingPageTemplateID)) || parent.TemplateID.Equals(Sitecore.Data.ID.Parse(CommonConstants.EventsListingPageTemplateID)) || parent.TemplateID.Equals(Sitecore.Data.ID.Parse(CommonConstants.ImageGalleryPageTemplateID)) || parent.TemplateID.Equals(Sitecore.Data.ID.Parse(CommonConstants.VideoGalleryTemplateID)) || parent.TemplateID.Equals(Sitecore.Data.ID.Parse(CommonConstants.VideoAlbumWithFiltersTemplateID)))) { parentResultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(yearFolderparentSearchCondition, facets, null, 0, 0, false, true, true); resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, facets, null, pageNumber, pageSize, false, true); } else if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.NewsTemplateID))) { resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, facets, null, pageNumber, pageSize, false, true); } else if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.EventsTemplateID))) { resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, facets, null, pageNumber, pageSize, false, false, true); } else if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.DownloadItemTemplateID))) { SortOption sortOption = new SortOption() { SortFieldName = CommonConstants.CustomSortorder, SortOrder = SortOrder.Ascending }; resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, facets, sortOption, pageNumber, pageSize, false, false, false); } else { resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, facets, null, pageNumber, pageSize, true, false); } //Adding filter "Event Type"(Upcoming and Past events) if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.EventsTemplateID)) && pageNumber <= 0 && resultsList != null && resultsList.filters != null) { List <FilterValues> filterValues = new List <FilterValues> { new FilterValues() { id = CommonConstants.AllEvents, label = Sitecore.Globalization.Translate.Text(CommonConstants.AllEvents) }, new FilterValues() { id = CommonConstants.Upcoming, label = Sitecore.Globalization.Translate.Text(CommonConstants.UpcomingEvents) }, new FilterValues() { id = CommonConstants.Past, label = Sitecore.Globalization.Translate.Text(CommonConstants.PastEvents) } }; resultsList.filters.Add(new Filters() { filterLabel = CommonConstants.EventType, filterValues = filterValues }); } if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.ImageAlbumPageTemplateID)) || listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.VideoAlbumWithoutFiltersTemplateID)) || listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.VideoAlbumWithFiltersTemplateID))) { string contentItemTemplateId = string.Empty; if (listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.VideoAlbumWithoutFiltersTemplateID)) || listItemTemplateId.Equals(SearchHelper.FormatGuid(CommonConstants.VideoAlbumWithFiltersTemplateID))) { contentItemTemplateId = CommonConstants.VideoItemTemplateID; } else { contentItemTemplateId = CommonConstants.ImageItemTemplateID; } } //Changing the filter based on the template selected(whether it is folder page or listing page) if (!string.IsNullOrEmpty(parentItemId) && parentResultsList.filters != null) { resultsList.filters = parentResultsList.filters; } return(resultsList); }
/// <summary> /// Generic Search Method /// </summary> /// <param name="searchConditions">search conditions.</param> /// <param name="pageNo">Page Number.</param> /// <param name="pageSize">Page Size.</param> /// <returns>Search Results of Generic Type</returns> public SearchResultsGeneric <T> GetSearchResults <T>(List <SearchCondition> searchConditions, List <Facet> facetFields = null, SortOption sortOption = null, int pageNo = -1, int pageSize = -1, bool sortByYearAndOrder = false, bool sortByDateAndOrder = false, bool sortByDateAscAndOrder = false) where T : ListingSearchResultItem { searchConditions = SearchHelper.AddBasicSearchConditions(searchConditions); IProviderSearchContext searchContext = SearchHelper.GetIndex().CreateSearchContext(); Expression <Func <T, bool> > predicate = SearchHelper.BuildPredicate <T>(searchConditions); IQueryable <T> searchQuery = null; if (sortByYearAndOrder) { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate).OrderBy(x => x[CommonConstants.CustomSortorder]).ThenByDescending(x => x[CommonConstants.YearFacetField]); } else if (sortByDateAscAndOrder) { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate).OrderBy(x => x[CommonConstants.CustomSortorder]).ThenBy(x => x[CommonConstants.DateField]); } else if (sortByDateAndOrder) { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate).OrderBy(x => x[CommonConstants.CustomSortorder]).ThenByDescending(x => x[CommonConstants.DateField]); } else if (sortOption != null) { // Pass CultureExecutionContext object to pick index analyzer for query if (sortOption.SortOrder.Equals(SortOrder.Descending)) { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate).OrderByDescending(x => x[sortOption.SortFieldName]); } else { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate).OrderBy(x => x[sortOption.SortFieldName]); } } else { searchQuery = searchContext.GetQueryable <T>(new CultureExecutionContext(Sitecore.Context.Language.CultureInfo)).Where(predicate); } if (facetFields != null && facetFields.Any()) { // Add facets to the search query foreach (Facet facet in facetFields) { searchQuery = searchQuery.FacetOn(f => f[facet.facetField], facet.minCount); } } FacetResults facets = searchQuery.GetFacets(); SearchResultsGeneric <T> searchResults = new SearchResultsGeneric <T>(); if (pageNo == -1 && pageSize == -1) { searchResults.results = new Results <T>() { results = searchQuery.ToList(), Totalcount = searchQuery.GetResults().Count() }; } else { searchResults.results = new Results <T>() { results = searchQuery.Page(pageNo, pageSize).ToList(), Totalcount = searchQuery.GetResults().Count() }; } List <string> itemIdsList = new List <string>(); if (facets != null && facets.Categories != null && facets.Categories.Any()) { List <Filters> filters = new List <Filters>(); foreach (FacetCategory category in facets.Categories) { List <FilterValues> filterValuesList = new List <FilterValues>(); foreach (FacetValue val in category.Values) { bool parse = Guid.TryParse(val.Name, out Guid id); if (parse && id != null) { itemIdsList.Add(val.Name); } filterValuesList.Add(new FilterValues() { id = val.Name, label = val.Name }); } filters.Add(new Filters() { filterLabel = category.Name, filterValues = filterValuesList }); } Dictionary <string, string> itemIdsWithValues = GetItemIdValues(itemIdsList); foreach (Filters filter in filters) { foreach (FilterValues filterVal in filter.filterValues) { if (!string.IsNullOrWhiteSpace(itemIdsWithValues.SingleOrDefault(x => x.Key.Equals(filterVal.label)).Value)) { filter.filterValues.SingleOrDefault(x => x.label.Equals(filterVal.label)).label = itemIdsWithValues.SingleOrDefault(x => x.Key.Equals(filterVal.label)).Value; } } if (filter.filterLabel.Equals(CommonConstants.YearFacetField)) { filter.filterValues = filter.filterValues.OrderByDescending(x => Convert.ToInt32(x.label)).ToList(); } else { filter.filterValues = filter.filterValues.OrderBy(x => x.label).ToList(); } if (facets.Categories.Any(x => x.Name.ToLower().Equals(filter.filterLabel.ToLower()))) { string label = facetFields.SingleOrDefault(x => (x.facetField.Equals(facets.Categories.SingleOrDefault(y => y.Name.ToLower().Equals(filter.filterLabel.ToLower())).Name))).allLabel; filter.filterValues.Insert(0, new FilterValues() { id = CommonConstants.AllValue, label = label }); } } //Default filters searchResults.filters = filters; } return(searchResults); }
/// <summary> /// Method to get listing model /// </summary> /// <param name="pageNumber">page number</param> /// <param name="pageSize">page size</param> /// <returns>SearchResultsGeneric<ListingSearchResultItem> </returns> public SearchResultsGeneric <ListingSearchResultItem> GetSearchResultsModelObject(int pageNumber = -1, int pageSize = -1, string searchTerm = "*") { SearchResultsGeneric <ListingSearchResultItem> resultsList = new SearchResultsGeneric <ListingSearchResultItem>(); List <SearchCondition> conditions = new List <SearchCondition>(); if (searchTerm.Trim() != "*") { searchTerm = Regex.Replace(searchTerm, "[^0-9A-Za-z ]", ""); } if (string.IsNullOrWhiteSpace(searchTerm.Trim())) { searchTerm = "*"; } if (searchTerm == "*") { conditions.Add(new SearchCondition() { Name = CommonConstants.TitleIndexField, Value = searchTerm, CompareType = CompareType.PartialMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.IntroductionIndexField, Value = searchTerm, CompareType = CompareType.PartialMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.ContentIndexField, Value = searchTerm, CompareType = CompareType.PartialMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.RenderingsContentIndexField, Value = searchTerm, CompareType = CompareType.PartialMatch, AddORcondition = true }); } conditions.Add(new SearchCondition() { Name = CommonConstants.TitleIndexField, Value = searchTerm, CompareType = CompareType.ExactMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.IntroductionIndexField, Value = searchTerm, CompareType = CompareType.ExactMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.ContentIndexField, Value = searchTerm, CompareType = CompareType.ExactMatch, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.RenderingsContentIndexField, Value = searchTerm, CompareType = CompareType.ExactMatch, AddORcondition = true }); if (searchTerm != "*") { conditions.Add(new SearchCondition() { Name = CommonConstants.TitleIndexField, Value = searchTerm, CompareType = CompareType.StartsWith, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.IntroductionIndexField, Value = searchTerm, CompareType = CompareType.StartsWith, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.ContentIndexField, Value = searchTerm, CompareType = CompareType.StartsWith, AddORcondition = true }); conditions.Add(new SearchCondition() { Name = CommonConstants.RenderingsContentIndexField, Value = searchTerm, CompareType = CompareType.StartsWith, AddORcondition = true }); } conditions.Add(new SearchCondition() { Name = CommonConstants.PageUrl, Value = string.Empty, CompareType = CompareType.IsNotNull }); conditions.Add(new SearchCondition() { Name = CommonConstants.Title, Value = string.Empty, CompareType = CompareType.IsNotNull }); conditions.Add(new SearchCondition() { Name = CommonConstants.Title, Value = string.Empty, CompareType = CompareType.IsNotEmpty }); if (!string.IsNullOrWhiteSpace(SitecoreSettings.ExcludeTemplatesFromSearchPage)) { foreach (string val in SitecoreSettings.ExcludeTemplatesFromSearchPage.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { conditions.Add(new SearchCondition() { Name = CommonConstants.TemplateID, Value = SearchHelper.FormatGuid(val), CompareType = CompareType.NotEquals }); } } if (!string.IsNullOrWhiteSpace(SitecoreSettings.ExcludeItemNamesFromSearchPage)) { foreach (string val in SitecoreSettings.ExcludeItemNamesFromSearchPage.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { conditions.Add(new SearchCondition() { Name = CommonConstants.IndexNameField, Value = SearchHelper.FormatGuid(val), CompareType = CompareType.NotEquals }); } } conditions = SearchHelper.AddFilterConditions("", conditions); resultsList = _searchManager.GetSearchResults <ListingSearchResultItem>(conditions, null, null, pageNumber, pageSize, false, false); if (searchTerm != "*" && resultsList != null && resultsList.results != null && resultsList.results.results != null && resultsList.results.results.Count > 0) { int count = 0; foreach (var listItem in resultsList.results.results) { resultsList.results.results[count].title = HighlightKeywords(resultsList.results.results[count].title, searchTerm); resultsList.results.results[count].description = HighlightKeywords(resultsList.results.results[count].description, searchTerm); if (resultsList.results.results[count].description.Contains("<mark>")) { resultsList.results.results[count].description = GetFragment(resultsList.results.results[count].description); } else { resultsList.results.results[count].description = HighlightKeywords(resultsList.results.results[count].renderingsContent, searchTerm); if (resultsList.results.results[count].description.Contains("<mark>")) { resultsList.results.results[count].description = GetFragment(resultsList.results.results[count].description); } else { resultsList.results.results[count].description = HighlightKeywords(resultsList.results.results[count].Content, searchTerm); if (resultsList.results.results[count].description.Contains("<mark>")) { resultsList.results.results[count].description = GetFragment(resultsList.results.results[count].description); } } if (!string.IsNullOrWhiteSpace(resultsList.results.results[count].description) && !resultsList.results.results[count].description.Contains("<mark>") && resultsList.results.results[count].description.Length > 150) { resultsList.results.results[count].description = resultsList.results.results[count].description.Substring(0, 150) + "..."; } } count++; } } return(resultsList); }
/// <summary> /// Get values for list of ids. /// </summary> /// <param name="itemIds">item ids</param> /// <returns>dictionary.</returns> public Dictionary <string, string> GetItemIdValues(List <string> allItemIds) { Dictionary <string, string> itemIdsWithValues = new Dictionary <string, string>(); //Making batch wise calls to get search results for Ids int batch = 0; while (CommonConstants.BatchSize * batch <= allItemIds.Count) { List <string> itemIds = allItemIds.Skip(CommonConstants.BatchSize * batch).Take(CommonConstants.BatchSize).ToList(); List <SearchCondition> searchFilters = new List <SearchCondition>(); List <string> itemIdsFormatted = new List <string>(); foreach (string id in itemIds) { if (string.IsNullOrEmpty(id)) { continue; } if (id.Contains("-")) { itemIdsFormatted.Add(id.Substring(0, id.IndexOf("-"))); } itemIdsFormatted.Add(id); } if (itemIdsFormatted.Count <= 0) { return(itemIdsWithValues); } searchFilters.Add(new SearchCondition() { Name = CommonConstants.IndexIdField, Value = string.Join(",", itemIdsFormatted) }); SearchResultsGeneric <ListingSearchResultItem> resultsPayload = GetSearchResults <ListingSearchResultItem>(searchFilters); if (resultsPayload != null && resultsPayload.results.Totalcount > 0) { foreach (ListingSearchResultItem result in resultsPayload.results.results) { string id = SearchHelper.FormatGuid(result.ItemId.ToString()); if (!itemIdsWithValues.ContainsKey(id)) { if (itemIds.Any(x => x.Contains(id + "-"))) { id = itemIds.Single(x => x.Contains(id + "-")); } if (!string.IsNullOrWhiteSpace(result.title) && !result.title.Equals(CommonConstants.NameStandardValueToken)) { itemIdsWithValues.Add(id, result.title); } else if (!string.IsNullOrWhiteSpace(result.value)) { itemIdsWithValues.Add(id, result.value); } else { itemIdsWithValues.Add(id, result.Name); } } } if (itemIds.Any(x => x.Equals(CommonConstants.InvalidID))) { itemIdsWithValues.Add(CommonConstants.InvalidID, CommonConstants.NoneValue); } } batch++; } return(itemIdsWithValues); }