protected override IList <MetadataResource> ExecuteWorkImplementation() { var metadataList = m_bookRepository.SearchByCriteriaQuery(m_queryCreator); var metadataIdList = metadataList.Select(x => x.Id); m_metadataRepository.GetMetadataWithFetchForBiblModule(metadataIdList); var projectIdList = metadataList.Select(x => x.Resource.Project.Id).ToList(); PageCounts = m_bookRepository.GetPublishedPageCount(projectIdList); if (m_termCriteriaCreator != null) { m_termCriteriaCreator.SetProjectIds(projectIdList); TermHits = projectIdList.Count > 0 ? m_bookRepository.GetPagesWithTerms(m_termCriteriaCreator) : new List <PageResource>(); } return(metadataList); }
protected override IList <MetadataResource> ExecuteWorkImplementation() { List <long> projectIds; IList <MetadataResource> metadataList; List <MetadataResource> orderedList; switch (m_fulltextSearchResultData.SearchResultType) { case FulltextSearchResultType.ProjectId: projectIds = m_fulltextSearchResultData.LongList; metadataList = m_metadataRepository.GetMetadataWithFetchForBiblModuleByProject(projectIds); orderedList = CreateOrderedListById(projectIds, metadataList); break; case FulltextSearchResultType.ProjectExternalId: metadataList = m_metadataRepository.GetMetadataWithFetchForBiblModuleByProjectExternalIds(m_fulltextSearchResultData.StringList, m_projectType); orderedList = CreateOrderedListByExternalId(m_fulltextSearchResultData.StringList, metadataList); projectIds = metadataList.Select(x => x.Resource.Project.Id).ToList(); break; default: throw new ArgumentOutOfRangeException(); } PageCounts = m_bookRepository.GetPublishedPageCount(projectIds); if (m_termCriteriaCreator != null) { m_termCriteriaCreator.SetProjectIds(projectIds); TermHits = projectIds.Count > 0 ? m_bookRepository.GetPagesWithTerms(m_termCriteriaCreator) : new List <PageResource>(); } return(orderedList); }
public List <PageContract> SearchPage(long projectId, SearchPageRequestContract request) { m_authorizationManager.AuthorizeBook(projectId, PermissionFlag.ShowPublished); var termConditions = new List <SearchCriteriaContract>(); var fulltextConditions = new List <SearchCriteriaContract>(); foreach (var searchCriteriaContract in request.ConditionConjunction) { if (searchCriteriaContract.Key == CriteriaKey.Term) { termConditions.Add(searchCriteriaContract); } else if (m_supportedSearchPageCriteria.Contains(searchCriteriaContract.Key)) { fulltextConditions.Add(searchCriteriaContract); } else { throw new MainServiceException(MainServiceErrorCode.NotSupportedCriteriaKey, $"Not supported criteria key: {searchCriteriaContract.Key}", HttpStatusCode.BadRequest, new object[] { searchCriteriaContract.Key } ); } } IList <PageResource> pagesByMetadata = null; if (termConditions.Count > 0) { var termConditionCreator = new TermCriteriaPageConditionCreator(); termConditionCreator.AddCriteria(termConditions); termConditionCreator.SetProjectIds(new[] { projectId }); pagesByMetadata = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesWithTerms(termConditionCreator)); } IList <PageResource> pagesByFulltext = null; if (fulltextConditions.Count > 0) { var projectIdentification = m_bookRepository.InvokeUnitOfWork(x => x.GetProjectIdentification(projectId)); var fulltextStorage = m_fulltextStorageProvider.GetFulltextStorage(projectIdentification.ProjectType); var fulltextResult = fulltextStorage.SearchPageByCriteria(fulltextConditions, projectIdentification); switch (fulltextResult.SearchResultType) { case PageSearchResultType.TextId: pagesByFulltext = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesByTextVersionId(fulltextResult.LongList)); break; case PageSearchResultType.TextExternalId: pagesByFulltext = m_bookRepository.InvokeUnitOfWork(x => x.GetPagesByTextExternalId(fulltextResult.StringList, projectId)); break; default: throw new ArgumentOutOfRangeException(); } } IList <PageResource> resultPages; if (pagesByMetadata != null && pagesByFulltext != null) { resultPages = pagesByMetadata.Intersect(pagesByFulltext) .OrderBy(x => x.Position) .ToList(); } else if (pagesByFulltext != null) { resultPages = pagesByFulltext; } else if (pagesByMetadata != null) { resultPages = pagesByMetadata; } else { throw new MainServiceException(MainServiceErrorCode.NoSupportedSearch, "No supported search criteria was specified" ); } var result = m_mapper.Map <List <PageContract> >(resultPages); return(result); }