private ActionResult SearchByHqlQuery(PagerParametersWithSortFields pagerParameters, PostedTicketSearchViewModel searchModel) { Pager pager = new Pager(siteService.GetSiteSettings(), pagerParameters); int totalCount = this.searchTicketService.CountByDatabase(searchModel); var contentItems = this.searchTicketService.SearchByDatabase(pagerParameters, searchModel); SearchTicketsViewModel model = this.CreateSearchModel(contentItems, pager, searchModel, pagerParameters, totalCount); return(this.View(model)); }
public ActionResult Search(PagerParametersWithSortFields pagerParameters, PostedTicketSearchViewModel searchModel) { if (!this.IsDisplayAuthorized()) { return(new HttpUnauthorizedResult()); } // A simple solution for the bug of sending page paraemter via querystring, if searchModel has value, with unknown reason, the page will not be set if (pagerParameters != null && pagerParameters.Page == null && !string.IsNullOrEmpty(Request.QueryString["page"])) { int page; if (int.TryParse(Request.QueryString["page"], out page)) { pagerParameters.Page = page; } } if (this.crmContentOwnershipService.IsCurrentUserCustomer()) { searchModel.Unassigned = false; searchModel.Users = new int[] { }; searchModel.IncludeAllVisibleItemsBySelectedGroupsAndUsers = false; } // add default sort field, if it is not provided if (string.IsNullOrEmpty(pagerParameters.SortField)) { pagerParameters.SortField = TicketPart.IdentityFieldName; pagerParameters.Descending = true; } if (searchModel != null) { searchModel.Users = searchModel.Users ?? new int[] { }; searchModel.BusinessUnits = searchModel.BusinessUnits ?? new int[] { }; } if (!string.IsNullOrEmpty(searchModel.Status) && !this.basicDataService.GetStatusRecords().Any(c => c.Id.ToString() == searchModel.Status)) { searchModel.Status = string.Empty; } // full text search will be done by lucene if (string.IsNullOrEmpty(searchModel.Term)) { return(this.SearchByHqlQuery(pagerParameters, searchModel)); } else { return(this.SearchByLucene(pagerParameters, searchModel)); } }
private ActionResult SearchByLucene(PagerParametersWithSortFields pagerParameters, PostedTicketSearchViewModel searchModel) { Pager pager = new Pager(siteService.GetSiteSettings(), pagerParameters); if (!indexManager.HasIndexProvider()) { return(View("NoIndex")); } // Status contentType int totalCount = this.searchTicketService.CountByIndexProvider(searchModel); var contentItems = this.searchTicketService.SearchByIndexProvider(pagerParameters, searchModel); SearchTicketsViewModel model = this.CreateSearchModel(contentItems, pager, searchModel, pagerParameters, totalCount); return(this.View(model)); }
public IContent[] SearchByDatabase(PagerParametersWithSortFields pagerParameters, PostedTicketSearchViewModel searchModel) { Pager pager = new Pager(siteService.GetSiteSettings(), pagerParameters); var contentQuery = this.CreateQuery(searchModel); // apply sort if (!string.IsNullOrEmpty(pagerParameters.SortField)) { string type = pagerParameters.SortField ?? TicketPart.IdentityFieldName; string category = "Ticket"; dynamic sortState = new { Sort = !pagerParameters.Descending }; contentQuery = this.projectionManagerWithDynamicSort.AddSortCriterion(category, type, sortState, contentQuery); } contentQuery = contentQuery.Include(new[] { "TicketPartRecord", "ContentItemPermissionPartRecord" }); IEnumerable <ContentItem> contentItems = pager.PageSize == 0 ? contentQuery.List() : contentQuery.Slice((pager.Page > 0 ? pager.Page - 1 : 0) * pager.PageSize, pager.PageSize); return(contentItems.ToArray()); }
public IContent[] SearchByIndexProvider(PagerParametersWithSortFields pagerParameters, PostedTicketSearchViewModel searchModel) { Pager pager = new Pager(siteService.GetSiteSettings(), pagerParameters); var builder = this.CreateLuceneBuilder(searchModel); // apply sort if (!string.IsNullOrEmpty(pagerParameters.SortField)) { string[] integerFields = new string[] { TicketPart.IdentityFieldName, TicketPart.PriorityFieldName, TicketPart.ServiceFieldName, TicketPart.StatusFieldName, TicketPart.TypeFieldName }; switch (pagerParameters.SortField) { case TicketPart.IdentityFieldName: case TicketPart.ServiceFieldName: case TicketPart.TypeFieldName: builder.SortByInteger(pagerParameters.SortField); break; case TicketPart.DueDateFieldName: builder.SortByDateTime(pagerParameters.SortField); break; case TicketPart.PriorityFieldName: case TicketPart.PriorityOrderFieldName: builder.SortByInteger(TicketPart.PriorityOrderFieldName); break; case TicketPart.StatusOrderFieldName: case TicketPart.StatusFieldName: builder.SortByInteger(TicketPart.StatusOrderFieldName); break; default: builder.SortBy(pagerParameters.SortField); break; } if (!pagerParameters.Descending) { builder.Ascending(); } } int[] foundIds = new int[0]; try { builder.ExactMatch(); builder = builder.Slice((pager.Page > 0 ? pager.Page - 1 : 0) * pager.PageSize, pager.PageSize); var searchResults = builder.Search(); foundIds = searchResults.Select(searchHit => searchHit.ContentItemId).ToArray(); } catch (Exception exception) { Logger.Error(T("Invalid search query: {0}", exception.Message).Text); } var includedPartRecords = new[] { "TicketPartRecord", "ContentItemPermissionPartRecord" }; var contentItems = this.services.ContentManager.GetMany <IContent>(foundIds, VersionOptions.Published, new QueryHints().ExpandRecords(includedPartRecords)); return(contentItems.ToArray()); }
private SearchTicketsViewModel CreateSearchModel(IEnumerable <IContent> contentItems, Pager pager, PostedTicketSearchViewModel postedSearchModel, PagerParametersWithSortFields pagerParameters, int totalCount) { SearchTicketsViewModel model = new SearchTicketsViewModel(); model.Term = postedSearchModel.Term; model.IsAdminUser = this.services.Authorizer.Authorize(Permissions.AdvancedOperatorPermission); if (postedSearchModel.DueDate == PostedTicketSearchViewModel.OverDueDate) { model.Overdue = true; } else { model.Overdue = false; DateTime value; if (DateTime.TryParse(postedSearchModel.DueDate, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out value)) { model.DueDate = value; } } model.StatusId = postedSearchModel.Status; model.UnStatus = postedSearchModel.UnStatus; model.PagerParameters = pagerParameters; model.RelatedContentItemId = postedSearchModel.RelatedContentItemId; // related contentItem if (postedSearchModel.RelatedContentItemId.HasValue) { var relatedContentItem = this.contentManager.Get(postedSearchModel.RelatedContentItemId.Value); var titlePart = relatedContentItem.As <TitlePart>(); if (titlePart != null) { model.RelatedContentItemTitle = titlePart.Title; } } model.Pager = this.services.New.Pager(pager).TotalItemCount(totalCount); model.Items = new List <dynamic>(); foreach (var contentItem in contentItems) { // ignore search results which content item has been removed or unpublished if (contentItem == null) { totalCount--; continue; } var itemModel = this.contentManager.BuildDisplay(contentItem, "TableRow"); itemModel.Metadata.Type = "Ticket_TableRow_Container"; model.Items.Add(itemModel); itemModel.IsEditable = this.crmContentOwnershipService.CurrentUserCanEditContent(contentItem); } model.Unassigned = postedSearchModel.Unassigned; this.FillBusinessUnitsAndUsers(model, postedSearchModel); // Projects if (this.projectService.IsTicketsRelatedToProjects()) { model.IsProjectForTicketsSupported = true; model.ProjectId = postedSearchModel.ProjectId; var projects = this.projectService.GetProjects(null); Converter.Fill(model.Projects, projects.AsPart <ProjectPart>()); } if (this.crmContentOwnershipService.IsCurrentUserCustomer()) { model.IsCustomerUser = true; model.Users.Clear(); model.BusinessUnits.ToList().ForEach(c => c.Teams.Clear()); } var statusRecords = this.basicDataService.GetStatusRecords().ToList(); model.ClosedStatusId = statusRecords.First(c => c.StatusTypeId == StatusRecord.ClosedStatus).Id; model.OpenStatusId = statusRecords.First(c => c.StatusTypeId == StatusRecord.OpenStatus).Id; // IncludeAllVisibleItemsBySelectedGroupsAndUsers is meaningful, if there is a selected user or business unit model.IncludeAllVisibleItemsBySelectedGroupsAndUsers = postedSearchModel.IncludeAllVisibleItemsBySelectedGroupsAndUsers && (model.Users.Any(c => c.Checked) || model.BusinessUnits.Any(c => c.Checked) || model.BusinessUnits.SelectMany(c => c.Teams).Any(c => c.Checked)); model.SearchDescription = this.GetSearchDescription(model, statusRecords); return(model); }
public ActionResult Index(PagerParametersWithSortFields pagerParameters, string searchPhrase, string contentTypes, int?projectId) { if (!this.contentOwnershipService.IsCurrentUserCustomer() && !this.contentOwnershipService.IsCurrentUserOperator()) { return(new HttpUnauthorizedResult()); } var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); var matchedContentTypes = string.IsNullOrEmpty(contentTypes) ? contentTypes.Split(',').Where(c => this.searchFieldsBasedOnContentType.Any(d => d.Key == c)) : this.searchFieldsBasedOnContentType.Keys; if (matchedContentTypes.Count() == 0) { matchedContentTypes = this.searchFieldsBasedOnContentType.Keys; } var fields = this.searchFieldsBasedOnContentType .Where(c => matchedContentTypes.Any(d => d == c.Key)) .SelectMany(d => d.Value) .Distinct() .ToArray(); IPageOfItems <IContent> searchHits = null; try { searchHits = _projectSearchService.Query(pagerParameters, searchPhrase, projectId, matchedContentTypes.ToArray(), fields); } catch (Exception exception) { Logger.Error(T("Invalid search query: {0}", exception.Message).Text); } var list = Shape.List(); foreach (var contentItem in searchHits) { var contentType = contentDefinitionManager.GetTypeDefinition(contentItem.ContentItem.ContentType); dynamic model = new ExpandoObject(); model.Shape = _contentManager.BuildDisplay(contentItem, "Summary"); model.ContentTypeDisplayName = contentType.DisplayName; list.Add(model); } var pagerShape = Shape.Pager(pager).TotalItemCount(searchHits.TotalItemCount); var searchViewModel = new ProjectSearchViewModel { Query = searchPhrase, TotalItemCount = searchHits.TotalItemCount, StartPosition = (pager.Page - 1) * pager.PageSize + 1, EndPosition = pager.Page * pager.PageSize > searchHits.TotalItemCount ? searchHits.TotalItemCount : pager.Page * pager.PageSize, ContentItems = list, ProjectId = projectId, ContentTypes = contentTypes, Pager = pagerShape }; if (projectId.HasValue) { var project = this.projectService.GetProject(projectId.Value); searchViewModel.ProjectName = project != null ? project.Title : string.Empty; } return(View(searchViewModel)); }
public IPageOfItems <IContent> Query(PagerParametersWithSortFields pagerParameters, string searchPhrase, int?projectId, string[] contentTypes, string[] searchFields) { Pager pager = new Pager(siteService.GetSiteSettings(), pagerParameters); List <string> queries = new List <string>(); List <string> fields = new List <string>(); var builder = indexManager.GetSearchIndexProvider().CreateSearchBuilder(TicketController.SearchIndexName); // Type var typeQuery = string.Join(" OR ", contentTypes.Select(c => string.Format(CultureInfo.InvariantCulture, "type:\"{0}\"", c)).ToArray()); queries.Add(typeQuery); fields.Add("type"); // Term if (!String.IsNullOrWhiteSpace(searchPhrase)) { string searchText = searchPhrase.Replace("\"", " "); foreach (var character in searchText.ToArray()) { if (!char.IsLetterOrDigit(character)) { searchText = searchText.Replace(character, ' '); } } searchText = searchText.Trim(); searchPhrase = searchText; if (!string.IsNullOrEmpty(searchText)) { var temp = searchFields.Select(c => string.Format(CultureInfo.InvariantCulture, "{0}:\"{1}*\"", c, searchText)); string query = string.Join(" OR ", temp.ToArray()); queries.Add(query); fields.AddRange(searchFields); } } // restrict based on the project if (projectId.HasValue) { var projectIds = this.projectService .GetProjects(null) .AsPart <ProjectPart>() .Select(c => c.Record.Id) .ToList(); if (projectIds.Any(c => c == projectId.Value)) { string query = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", AttachToProjectPart.ProjectIdFieldName, projectId.Value.ToString(CultureInfo.InvariantCulture)); queries.Add(query); fields.Add(AttachToProjectPart.ProjectIdFieldName); } } string permissionsQuery = this.searchTicketService.CreateLucenePermissionQuery(new PostedTicketSearchViewModel { Users = new int[] { }, BusinessUnits = new int[] { }, IncludeAllVisibleItemsBySelectedGroupsAndUsers = true }); if (!string.IsNullOrEmpty(permissionsQuery)) { queries.Add(permissionsQuery); fields.Add(ContentItemPermissionPart.PermissionsSearchFieldName); fields.Add(ContentItemPermissionPart.OwnerSearchFieldName); } string mainQuery = string.Join(" AND ", queries.Select(c => "(" + c + ")").ToArray()); builder.Parse(new[] { "type" }, mainQuery, false); builder.ExactMatch(); int count = 0; int[] foundIds = new int[0]; try { count = builder.Count(); builder = builder.Slice((pager.Page > 0 ? pager.Page - 1 : 0) * pager.PageSize, pager.PageSize); var searchResults = builder.Search(); foundIds = searchResults.Select(searchHit => searchHit.ContentItemId).ToArray(); } catch (Exception exception) { Logger.Error(T("Invalid search query: {0}", exception.Message).Text); } var contentItems = this.services.ContentManager.GetMany <IContent>(foundIds, VersionOptions.Published, QueryHints.Empty); IPageOfItems <IContent> returnVaue = new PageOfItems <IContent>(contentItems); returnVaue.TotalItemCount = count; return(returnVaue); }