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