/// <summary> /// Provide search result for table to be used by user's based on Azure Search service. /// </summary> /// <param name="searchScope">Scope of the search.</param> /// <param name="searchQuery">Query which the user had typed in Messaging Extension search field.</param> /// <param name="userObjectId">Azure Active Directory object id of user.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <param name="filterQuery">Filter bar based query.</param> /// <returns>List of search results.</returns> public async Task <IEnumerable <ProjectEntity> > GetProjectsAsync( ProjectSearchScope searchScope, string searchQuery, string userObjectId, int?count = null, int?skip = null, string filterQuery = null) { await this.EnsureInitializedAsync(); IEnumerable <ProjectEntity> projects = new List <ProjectEntity>(); var searchParameters = this.InitializeSearchParameters(searchScope, userObjectId, count, skip, filterQuery); SearchContinuationToken continuationToken = null; var projectsCollection = new List <ProjectEntity>(); if (searchScope == ProjectSearchScope.SearchProjects && !string.IsNullOrWhiteSpace(searchQuery)) { searchQuery = this.projectHelper.EscapeCharactersForSearchQuery(searchQuery); } var projectResult = await this.searchIndexClient.Documents.SearchAsync <ProjectEntity>(searchQuery, searchParameters); if (projectResult?.Results != null) { projectsCollection.AddRange(projectResult.Results.Select(p => p.Document)); continuationToken = projectResult.ContinuationToken; } if (continuationToken == null) { return(projectsCollection); } do { var projectNextResult = await this.searchIndexClient.Documents.ContinueSearchAsync <ProjectEntity>(continuationToken); if (projectNextResult?.Results != null) { projectsCollection.AddRange(projectNextResult.Results.Select(p => p.Document)); continuationToken = projectNextResult.ContinuationToken; } }while (continuationToken != null); return(projectsCollection); }
/// <summary> /// Initialization of search service parameters which will help in searching the documents. /// </summary> /// <param name="searchScope">Scope of the search.</param> /// <param name="userObjectId">Azure Active Directory object id of the user.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <param name="filterQuery">Filter bar based query.</param> /// <returns>Represents an search parameter object.</returns> private SearchParameters InitializeSearchParameters( ProjectSearchScope searchScope, string userObjectId, int?count = null, int?skip = null, string filterQuery = null) { SearchParameters searchParameters = new SearchParameters() { Top = count ?? ApiSearchResultCount, Skip = skip ?? 0, IncludeTotalResultCount = false, Select = new[] { nameof(ProjectEntity.ProjectId), nameof(ProjectEntity.Status), nameof(ProjectEntity.Title), nameof(ProjectEntity.Description), nameof(ProjectEntity.SupportDocuments), nameof(ProjectEntity.RequiredSkills), nameof(ProjectEntity.ProjectStartDate), nameof(ProjectEntity.ProjectEndDate), nameof(ProjectEntity.CreatedDate), nameof(ProjectEntity.CreatedByName), nameof(ProjectEntity.UpdatedDate), nameof(ProjectEntity.CreatedByUserId), nameof(ProjectEntity.TeamSize), nameof(ProjectEntity.IsRemoved), nameof(ProjectEntity.ProjectParticipantsUserIds), nameof(ProjectEntity.ProjectParticipantsUserMapping), nameof(ProjectEntity.ProjectClosedDate), }, SearchFields = new[] { nameof(ProjectEntity.Title) }, Filter = string.IsNullOrEmpty(filterQuery) ? $"({nameof(ProjectEntity.IsRemoved)} eq false)" : $"({nameof(ProjectEntity.IsRemoved)} eq false) and ({filterQuery})", }; switch (searchScope) { // Get all projects. case ProjectSearchScope.AllProjects: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.CreatedDate)} desc" }; break; // Get user created projects. case ProjectSearchScope.CreatedProjectsByUser: searchParameters.Filter = $"{nameof(ProjectEntity.CreatedByUserId)} eq '{userObjectId}' " + $"and ({nameof(ProjectEntity.IsRemoved)} eq false)"; searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.CreatedDate)} desc" }; break; // Get user joined projects. case ProjectSearchScope.JoinedProjects: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.CreatedDate)} desc" }; searchParameters.SearchFields = new[] { nameof(ProjectEntity.ProjectParticipantsUserIds) }; break; // Get list of unique skills. case ProjectSearchScope.UniqueSkills: searchParameters.SearchFields = new[] { nameof(ProjectEntity.RequiredSkills) }; searchParameters.Top = 5000; searchParameters.Select = new[] { nameof(ProjectEntity.RequiredSkills) }; break; // Get filtered data as per configured skills. case ProjectSearchScope.FilterAsPerTeamSkills: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.UpdatedDate)} desc" }; searchParameters.SearchFields = new[] { nameof(ProjectEntity.RequiredSkills) }; break; // Get unique project owner names. case ProjectSearchScope.UniqueProjectOwnerNames: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.UpdatedDate)} desc" }; searchParameters.Select = new[] { nameof(ProjectEntity.CreatedByName), nameof(ProjectEntity.CreatedByUserId) }; break; // Get projects as per the skills and search text for Title/Description/Skills field. case ProjectSearchScope.SearchProjects: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.UpdatedDate)} desc" }; searchParameters.QueryType = QueryType.Full; searchParameters.SearchFields = new[] { nameof(ProjectEntity.Title), nameof(ProjectEntity.Description), nameof(ProjectEntity.RequiredSkills) }; break; // Get projects as per the applied filters. case ProjectSearchScope.FilterTeamProjects: searchParameters.OrderBy = new[] { $"{nameof(ProjectEntity.UpdatedDate)} desc" }; searchParameters.SearchFields = new[] { nameof(ProjectEntity.RequiredSkills) }; break; } return(searchParameters); }
internal Task <List <SymbolReference> > FindInProjectAsync(Project project, bool includeDirectReferences) { var searchScope = new ProjectSearchScope(project, includeDirectReferences, _owner.IgnoreCase, _cancellationToken); return(DoAsync(searchScope)); }