Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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));
            }