示例#1
0
        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);
        }
示例#3
0
        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);
        }