Пример #1
0
        public IActionResult SearchBookResultCount([FromBody] SearchRequestContract request, [FromQuery] ProjectTypeContract?projectType)
        {
            if (projectType == null)
            {
                return(Error($"Required parameter {nameof(projectType)} is not specified"));
            }

            try
            {
                var advancedRequest = new AdvancedSearchRequestContract
                {
                    ConditionConjunction = request.ConditionConjunction,
                    Start         = request.Start,
                    Count         = request.Count,
                    Sort          = request.Sort,
                    SortDirection = request.SortDirection,
                    FetchTerms    = request.FetchTerms,
                    Parameters    = null,
                };
                var result = m_bookSearchManager.SearchByCriteriaCount(advancedRequest, projectType.Value);
                return(Ok(result));
            }
            catch (ArgumentException exception)
            {
                return(BadRequest(exception.Message));
            }
            catch (HttpErrorCodeException exception)
            {
                return(StatusCode((int)exception.StatusCode, exception.Message));
            }
        }
Пример #2
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);
            }
        }
Пример #3
0
        protected long SearchByCriteriaCount(List <SearchCriteriaContract> listSearchCriteriaContracts, IList <long> selectedBookIds,
                                             IList <int> selectedCategoryIds, SearchAdvancedParametersContract parameters)
        {
            AddCategoryCriteria(listSearchCriteriaContracts, selectedBookIds, selectedCategoryIds);

            var client  = GetBookClient();
            var request = new AdvancedSearchRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts,
                Parameters           = parameters,
            };
            var count = client.SearchBookCount(request, GetDefaultProjectType());

            return(count);
        }
Пример #4
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);
            }
        }
Пример #5
0
        public long SearchBookCount(AdvancedSearchRequestContract request, ProjectTypeContract projectType)
        {
            try
            {
                var result = m_client.Post <long>($"book/search-count?projectType={projectType}", request);
                return(result);
            }
            catch (HttpRequestException e)
            {
                if (m_logger.IsErrorEnabled())
                {
                    m_logger.LogError("{0} failed with {1}", m_client.GetCurrentMethod(), e);
                }

                throw;
            }
        }
Пример #6
0
        protected List <SearchResultExtendedContract> SearchByCriteria(List <SearchCriteriaContract> listSearchCriteriaContracts, int start,
                                                                       int count, short sortingEnum, bool sortAsc, IList <long> selectedBookIds,
                                                                       IList <int> selectedCategoryIds, SearchAdvancedParametersContract parameters)
        {
            AddCategoryCriteria(listSearchCriteriaContracts, selectedBookIds, selectedCategoryIds);

            var client  = GetBookClient();
            var request = new AdvancedSearchRequestContract
            {
                ConditionConjunction = listSearchCriteriaContracts,
                Start         = start,
                Count         = count,
                Sort          = (SortTypeEnumContract)sortingEnum,
                SortDirection = sortAsc ? SortDirectionEnumContract.Asc : SortDirectionEnumContract.Desc,
                FetchTerms    = listSearchCriteriaContracts.Any(x => x.Key == CriteriaKey.Term),
                Parameters    = parameters,
            };
            var result         = client.SearchBook(request, GetDefaultProjectType());
            var resultContract = Mapper.Map <List <SearchResultExtendedContract> >(result);

            return(resultContract);
        }
Пример #7
0
        public IActionResult SearchBook([FromBody] AdvancedSearchRequestContract request, [FromQuery] ProjectTypeContract?projectType)
        // TODO possible switch SearchResultContract to BookContract
        {
            if (projectType == null)
            {
                return(Error($"Required parameter {nameof(projectType)} is not specified"));
            }

            try
            {
                var result = m_bookSearchManager.SearchByCriteria(request, projectType.Value);
                return(Ok(result));
            }
            catch (ArgumentException exception)
            {
                return(BadRequest(exception.Message));
            }
            catch (HttpErrorCodeException exception)
            {
                return(StatusCode((int)exception.StatusCode, exception.Message));
            }
        }