Esempio n. 1
0
        public List <SearchResultContract> SearchByCriteria(AdvancedSearchRequestContract request, ProjectTypeContract projectType)
        {
            m_authorizationManager.AddAuthorizationCriteria(request.ConditionConjunction);

            var processedCriterias   = m_metadataSearchCriteriaProcessor.ProcessSearchCriterias(request.ConditionConjunction);
            var nonMetadataCriterias = processedCriterias.NonMetadataCriterias;
            var mainProjectTypeEnum  = m_mapper.Map <ProjectTypeEnum>(projectType);
            var projectTypeEnums     = new List <ProjectTypeEnum> {
                mainProjectTypeEnum
            };

            if (request.Parameters != null && request.Parameters.IncludeAdditionalProjectTypes)
            {
                projectTypeEnums.AddRange(request.Parameters.AdditionalProjectTypes.Select(x => m_mapper.Map <ProjectTypeEnum>(x)));
            }

            var queryCreator = new SearchCriteriaQueryCreator(processedCriterias.ConjunctionQuery, processedCriterias.MetadataParameters, projectTypeEnums)
            {
                Sort          = request.Sort,
                SortDirection = request.SortDirection,
                Start         = PagingHelper.GetStart(request.Start),
                Count         = PagingHelper.GetCountForProject(request.Count)
            };

            if (processedCriterias.NonMetadataCriterias.Count > 0)
            {
                // Search in fulltext DB

                // 1) search in metadata
                var projectIdentificatorList = m_bookRepository.InvokeUnitOfWork(x => x.SearchProjectIdByCriteriaQuery(queryCreator));
                if (projectIdentificatorList.Count == 0)
                {
                    return(new List <SearchResultContract>());
                }

                // 2) search in fulltext
                var fulltextStorage          = m_fulltextStorageProvider.GetFulltextStorage(projectType);
                var fulltextSearchResultData = fulltextStorage.SearchProjectIdByCriteria(queryCreator.GetStart(), queryCreator.GetCount(), request.Sort, request.SortDirection, nonMetadataCriterias, projectIdentificatorList);

                // 3) load paged result
                var termCriteria = CreateTermConditionCreatorOrDefault(request, processedCriterias);
                var searchByCriteriaFulltextResultWork = new SearchByCriteriaFulltextResultWork(m_metadataRepository, m_bookRepository, fulltextSearchResultData, termCriteria, mainProjectTypeEnum);
                var dbResult = searchByCriteriaFulltextResultWork.Execute();

                var resultList = MapToSearchResult(dbResult, searchByCriteriaFulltextResultWork.PageCounts, searchByCriteriaFulltextResultWork.TermHits);
                return(resultList);
            }
            else
            {
                // Search in relational DB

                var termCriteria         = CreateTermConditionCreatorOrDefault(request, processedCriterias);
                var searchByCriteriaWork = new SearchByCriteriaWork(m_metadataRepository, m_bookRepository, queryCreator, termCriteria);
                var dbResult             = searchByCriteriaWork.Execute();

                var resultList = MapToSearchResult(dbResult, searchByCriteriaWork.PageCounts, searchByCriteriaWork.TermHits);
                return(resultList);
            }
        }
Esempio n. 2
0
        public long SearchByCriteriaCount(AdvancedSearchRequestContract request, ProjectTypeContract projectType)
        {
            m_authorizationManager.AddAuthorizationCriteria(request.ConditionConjunction);

            var processedCriterias = m_metadataSearchCriteriaProcessor.ProcessSearchCriterias(request.ConditionConjunction);
            var projectTypeEnums   = new List <ProjectTypeEnum> {
                m_mapper.Map <ProjectTypeEnum>(projectType)
            };

            if (request.Parameters != null && request.Parameters.IncludeAdditionalProjectTypes)
            {
                projectTypeEnums.AddRange(request.Parameters.AdditionalProjectTypes.Select(x => m_mapper.Map <ProjectTypeEnum>(x)));
            }

            var queryCreator = new SearchCriteriaQueryCreator(processedCriterias.ConjunctionQuery, processedCriterias.MetadataParameters, projectTypeEnums)
            {
                Sort          = request.Sort,
                SortDirection = request.SortDirection,
                Start         = PagingHelper.GetStart(request.Start),
                Count         = PagingHelper.GetCountForProject(request.Count)
            };

            if (processedCriterias.NonMetadataCriterias.Count > 0)
            {
                // Search in fulltext DB

                // 1) search in metadata
                var projectIdentificatorList = m_bookRepository.InvokeUnitOfWork(x => x.SearchProjectIdByCriteriaQuery(queryCreator));
                if (projectIdentificatorList.Count == 0)
                {
                    return(0);
                }

                // 2) search in fulltext
                var fulltextStorage = m_fulltextStorageProvider.GetFulltextStorage(projectType);
                var result          = fulltextStorage.SearchByCriteriaCount(processedCriterias.NonMetadataCriterias, projectIdentificatorList);
                return(result);
            }
            else
            {
                // Search in relational DB

                var result = m_bookRepository.InvokeUnitOfWork(x => x.SearchByCriteriaQueryCount(queryCreator));
                return(result);
            }
        }
Esempio n. 3
0
        public List <AudioBookSearchResultContract> SearchAudioByCriteria(SearchRequestContract request, ProjectTypeContract projectType)
        {
            m_authorizationManager.AddAuthorizationCriteria(request.ConditionConjunction);

            var processedCriterias = m_metadataSearchCriteriaProcessor.ProcessSearchCriterias(request.ConditionConjunction);
            var projectTypeEnum    = m_mapper.Map <ProjectTypeEnum>(projectType);

            var queryCreator = new SearchCriteriaQueryCreator(processedCriterias.ConjunctionQuery, processedCriterias.MetadataParameters, projectTypeEnum)
            {
                Sort          = request.Sort,
                SortDirection = request.SortDirection,
                Start         = PagingHelper.GetStart(request.Start),
                Count         = PagingHelper.GetCountForProject(request.Count)
            };

            // Search only in relational DB

            var searchByCriteriaWork = new SearchAudioByCriteriaWork(m_metadataRepository, m_bookRepository, queryCreator);
            var dbResult             = searchByCriteriaWork.Execute();

            //var resultList = MapToSearchResult(dbResult, searchByCriteriaWork.PageCounts);
            var resultList = new List <AudioBookSearchResultContract>(dbResult.Count);

            foreach (var dbMetadata in dbResult)
            {
                var resultItem = m_mapper.Map <AudioBookSearchResultContract>(dbMetadata);
                resultList.Add(resultItem);

                if (searchByCriteriaWork.FullBookRecordingsByProjectId.TryGetValue(dbMetadata.Resource.Project.Id, out var audioList))
                {
                    resultItem.FullBookRecordings = m_mapper.Map <List <AudioContract> >(audioList);
                }
                else
                {
                    resultItem.FullBookRecordings = new List <AudioContract>();
                }
            }

            return(resultList);
        }
Esempio n. 4
0
        public PagedResultList <ProjectDetailContract> GetProjectList(int?start, int?count, ProjectTypeContract?projectType,
                                                                      ProjectOwnerTypeContract projectOwnerType, string filterByName, bool fetchPageCount, bool fetchAuthors,
                                                                      bool fetchResponsiblePersons, bool fetchLatestChangedResource, bool fetchPermissions)
        {
            var startValue      = PagingHelper.GetStart(start);
            var countValue      = PagingHelper.GetCountForProject(count);
            var projectTypeEnum = m_mapper.Map <ProjectTypeEnum?>(projectType);

            var userId = m_authenticationManager.GetCurrentUserId();

            var work = new GetProjectListWork(m_projectRepository, m_metadataRepository, startValue, countValue, projectTypeEnum,
                                              projectOwnerType, userId, filterByName, fetchPageCount, fetchAuthors, fetchResponsiblePersons, fetchLatestChangedResource, fetchPermissions);
            var resultEntities = work.Execute();

            var metadataList       = work.GetMetadataResources();
            var pageCountList      = work.GetPageCountList();
            var latestChangesList  = work.GetLatestChangedResources();
            var userPermissionDict = work.GetUserPermission();
            var resultList         = m_mapper.Map <List <ProjectDetailContract> >(resultEntities);

            foreach (var projectContract in resultList)
            {
                var metadataResource   = metadataList.FirstOrDefault(x => x.Resource.Project.Id == projectContract.Id);
                var pageCountResult    = pageCountList.FirstOrDefault(x => x.ProjectId == projectContract.Id);
                var latestChangeResult = latestChangesList.FirstOrDefault(x => x.ProjectId == projectContract.Id);

                var metadataContract = m_mapper.Map <ProjectMetadataContract>(metadataResource);
                projectContract.LatestMetadata = metadataContract;
                projectContract.PageCount      = pageCountResult?.PageCount;
                projectContract.CreatedByUser  = m_userDetailManager.GetUserContractForUser(projectContract.CreatedByUser);

                if (fetchAuthors && metadataResource != null)
                {
                    projectContract.Authors = m_mapper.Map <List <OriginalAuthorContract> >(metadataResource.Resource.Project.Authors);
                }

                if (fetchResponsiblePersons && metadataResource != null)
                {
                    projectContract.ResponsiblePersons =
                        m_mapper.Map <List <ProjectResponsiblePersonContract> >(metadataResource.Resource.Project.ResponsiblePersons);
                }

                if (fetchLatestChangedResource && latestChangeResult != null)
                {
                    projectContract.LatestChangeTime = latestChangeResult.CreateTime;
                    projectContract.EditedByUser     = m_userDetailManager.GetUserContract(latestChangeResult.CreatedByUserId);
                }

                if (fetchPermissions)
                {
                    userPermissionDict.TryGetValue(projectContract.Id, out var permissions);
                    projectContract.CurrentUserPermissions = m_projectPermissionConverter.GetAggregatedPermissions(permissions);
                }
            }

            return(new PagedResultList <ProjectDetailContract>
            {
                List = resultList,
                TotalCount = work.GetResultCount()
            });
        }