public virtual IList <TermCountResult> GetBooksTermResultsCount(List <string> bookGuidList,
                                                                        TermCriteriaQueryCreator queryCreator)
        {
            using (var session = GetSession())
            {
                Book            bookAlias        = null;
                BookVersion     bookVersionAlias = null;
                BookPage        bookPageAlias    = null;
                Term            termAlias        = null;
                TermCountResult termResultAlias  = null;

                var result = session.QueryOver(() => bookAlias)
                             .JoinQueryOver(x => x.LastVersion, () => bookVersionAlias)
                             .JoinQueryOver(x => x.BookPages, () => bookPageAlias)
                             .JoinQueryOver(x => x.Terms, () => termAlias)
                             .Select(Projections.ProjectionList()
                                     .Add(Projections.Group(() => bookAlias.Id).WithAlias(() => termResultAlias.BookId))
                                     .Add(
                                         Projections.CountDistinct(() => bookPageAlias.Id)
                                         .WithAlias(() => termResultAlias.PagesCount))
                                     )
                             .WhereRestrictionOn(() => bookAlias.Guid).IsInG(bookGuidList)
                             .And(queryCreator.GetCondition())
                             .TransformUsing(Transformers.AliasToBean <TermCountResult>())
                             .List <TermCountResult>();

                return(result);
            }
        }
        public virtual IList <TermResult> GetBooksTermResults(List <string> bookGuidList,
                                                              TermCriteriaQueryCreator queryCreator)
        {
            using (var session = GetSession())
            {
                Book        bookAlias        = null;
                BookVersion bookVersionAlias = null;
                BookPage    bookPageAlias    = null;
                Term        termAlias        = null;
                TermResult  termResultAlias  = null;

                var result = session.QueryOver(() => bookAlias)
                             .JoinQueryOver(x => x.LastVersion, () => bookVersionAlias)
                             .JoinQueryOver(x => x.BookPages, () => bookPageAlias)
                             .JoinQueryOver(x => x.Terms, () => termAlias)
                             .SelectList(list => list
                                         .Select(() => bookAlias.Id).WithAlias(() => termResultAlias.BookId)
                                         .Select(() => bookPageAlias.Text).WithAlias(() => termResultAlias.PageName)
                                         .Select(() => bookPageAlias.XmlId).WithAlias(() => termResultAlias.PageXmlId))
                             .OrderBy(() => bookAlias.Id).Asc
                             .OrderBy(() => bookPageAlias.Position).Asc
                             .WhereRestrictionOn(() => bookAlias.Guid).IsInG(bookGuidList)
                             .And(queryCreator.GetCondition())
                             .TransformUsing(Transformers.AliasToBean <TermResult>())
                             .List <TermResult>();

                return(result);
            }
        }
Example #3
0
        public IEnumerable <SearchResultContract> SearchByCriteria(IEnumerable <SearchCriteriaContract> searchCriterias)
        {
            var searchCriteriaContracts = searchCriterias.ToList();

            m_authorizationManager.AuthorizeCriteria(searchCriteriaContracts);

            var filteredCriterias    = FilterSearchCriterias(searchCriteriaContracts);
            var nonMetadataCriterias = filteredCriterias.NonMetadataCriterias;
            var resultCriteria       = filteredCriterias.ResultCriteria;

            var queryCreator = new SearchCriteriaQueryCreator(filteredCriterias.ConjunctionQuery, filteredCriterias.MetadataParameters);

            if (nonMetadataCriterias.OfType <ResultRestrictionCriteriaContract>().FirstOrDefault() == null)
            {
                var databaseSearchResult = m_bookVersionRepository.SearchByCriteriaQuery(queryCreator);

                if (databaseSearchResult.Count == 0)
                {
                    return(new List <SearchResultContract>());
                }

                var resultContract = new ResultRestrictionCriteriaContract
                {
                    ResultBooks = databaseSearchResult
                };
                nonMetadataCriterias.Add(resultContract);
            }

            var resultCriteriaContract = nonMetadataCriterias.OfType <ResultCriteriaContract>().FirstOrDefault();

            Dictionary <long, List <PageDescriptionContract> > bookTermResults = null;
            Dictionary <long, long> bookTermResultsCount = null;

            if (filteredCriterias.NonMetadataCriterias.All(x => x.Key == CriteriaKey.ResultRestriction || x.Key == CriteriaKey.Result))
            {
                // Search only in SQL
                var resultRestriction   = nonMetadataCriterias.OfType <ResultRestrictionCriteriaContract>().First();
                var guidListRestriction = resultRestriction.ResultBooks.Select(x => x.Guid).ToList();
                var resultBookVersions  = m_bookVersionRepository.GetBookVersionDetailsByGuid(guidListRestriction, resultCriteria.Start,
                                                                                              resultCriteria.Count, resultCriteria.Sorting, resultCriteria.Direction);
                var pageCounts = m_bookVersionRepository.GetBooksPageCountByGuid(guidListRestriction)
                                 .ToDictionary(x => x.BookId, x => x.Count);


                if (resultCriteriaContract != null && resultCriteriaContract.TermsSettingsContract != null)
                {
                    var termQueryCreator = new TermCriteriaQueryCreator();
                    termQueryCreator.AddCriteria(filteredCriterias.MetadataCriterias);

                    var booksTermResults = m_bookVersionRepository.GetBooksTermResults(guidListRestriction, termQueryCreator);
                    bookTermResults =
                        booksTermResults.GroupBy(x => x.BookId, x => new PageDescriptionContract {
                        PageName = x.PageName, PageXmlId = x.PageXmlId
                    })
                        .ToDictionary(x => x.Key, x => x.ToList());

                    var booksTermResultsCount = m_bookVersionRepository.GetBooksTermResultsCount(guidListRestriction, termQueryCreator);
                    bookTermResultsCount = booksTermResultsCount.ToDictionary(x => x.BookId, x => x.PagesCount);
                }

                var resultContractList = Mapper.Map <IList <SearchResultContract> >(resultBookVersions);

                foreach (var resultContract in resultContractList)
                {
                    resultContract.PageCount = pageCounts[resultContract.BookId];

                    if (bookTermResults != null)
                    {
                        List <PageDescriptionContract> pageDescriptionContracts;
                        long termResultsCount;
                        resultContract.TermsPageHits = bookTermResults.TryGetValue(resultContract.BookId, out pageDescriptionContracts)
                            ? pageDescriptionContracts
                            : new List <PageDescriptionContract>();
                        resultContract.TermsPageHitsCount = bookTermResultsCount.TryGetValue(resultContract.BookId, out termResultsCount)
                            ? Convert.ToInt32(termResultsCount)
                            : 0;
                    }
                }

                return(resultContractList);
            }

            // Fulltext search
            var searchResults = m_searchServiceClient.ListSearchEditionsResults(nonMetadataCriterias);

            var guidList = searchResults.SearchResults.Select(x => x.BookXmlId).ToList();
            var result   = m_bookVersionRepository.GetBookVersionDetailsByGuid(guidList);
            var resultPageCountDictionary = m_bookVersionRepository.GetBooksPageCountByGuid(guidList)
                                            .ToDictionary(x => x.BookId, x => x.Count);

            var resultDictionary = result.ToDictionary(x => x.Book.Guid);


            if (resultCriteriaContract != null && resultCriteriaContract.TermsSettingsContract != null)
            {
                var termQueryCreator = new TermCriteriaQueryCreator();
                termQueryCreator.AddCriteria(filteredCriterias.MetadataCriterias);

                var booksTermResults = m_bookVersionRepository.GetBooksTermResults(guidList, termQueryCreator);
                bookTermResults =
                    booksTermResults.GroupBy(x => x.BookId, x => new PageDescriptionContract {
                    PageName = x.PageName, PageXmlId = x.PageXmlId
                })
                    .ToDictionary(x => x.Key, x => x.ToList());

                var booksTermResultsCount = m_bookVersionRepository.GetBooksTermResultsCount(guidList, termQueryCreator);
                bookTermResultsCount = booksTermResultsCount.ToDictionary(x => x.BookId, x => x.PagesCount);
            }

            var searchResultFullContext = new List <SearchResultContract>();


            foreach (var searchResult in searchResults.SearchResults)
            {
                var localResult = Mapper.Map <SearchResultContract>(resultDictionary[searchResult.BookXmlId]);
                localResult.TotalHitCount = searchResult.TotalHitCount;
                localResult.Results       = searchResult.Results;
                localResult.PageCount     = resultPageCountDictionary[localResult.BookId];

                if (bookTermResults != null)
                {
                    List <PageDescriptionContract> pageDescriptionContracts;
                    long termResultsCount;
                    localResult.TermsPageHits = bookTermResults.TryGetValue(localResult.BookId, out pageDescriptionContracts)
                        ? pageDescriptionContracts
                        : new List <PageDescriptionContract>();
                    localResult.TermsPageHitsCount = bookTermResultsCount.TryGetValue(localResult.BookId, out termResultsCount)
                        ? Convert.ToInt32(termResultsCount)
                        : 0;
                }

                searchResultFullContext.Add(localResult);
            }

            return(searchResultFullContext);
        }