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); } }
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); } }
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); }
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() }); }