Example #1
0
        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));
        }
Example #2
0
        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));
            }
        }
Example #3
0
        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));
        }
Example #4
0
        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());
        }
Example #5
0
        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());
        }
Example #6
0
        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);
        }
Example #7
0
        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));
        }
Example #8
0
        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);
        }