Fixing that ProjectionManager can return duplicate results when using multiple filter groups, fixes 8108

This commit is contained in:
Jim Macdonald
2019-05-21 19:28:54 +01:00
committed by Benedek Farkas
parent ce63f47dc4
commit bbb5376594
3 changed files with 29 additions and 11 deletions

View File

@@ -120,9 +120,11 @@ namespace Orchard.Projections.Services {
tokens.Add("Content", part.ContentItem);
}
// aggregate the result for each group query
return GetContentQueries(queryRecord, Enumerable.Empty<SortCriterionRecord>(), tokens)
.Sum(contentQuery => contentQuery.Count());
var contentQueries = GetContentQueries(queryRecord, Enumerable.Empty<SortCriterionRecord>(), tokens);
return queryRecord.FilterGroups.Count > 1 ?
contentQueries.SelectMany(contentQuery => contentQuery.ListIds()).Distinct().Count() :
contentQueries.Sum(contentQuery => contentQuery.Count());
}
public IEnumerable<ContentItem> GetContentItems(int queryId, int skip = 0, int count = 0) {
@@ -189,7 +191,7 @@ namespace Orchard.Projections.Services {
groupQuery = sortCriterionContext.Query;
}
return groupQuery.Slice(skip, count);
return groupQuery.Slice(0, count);
}
public IEnumerable<IHqlQuery> GetContentQueries(QueryPartRecord queryRecord, IEnumerable<SortCriterionRecord> sortCriteria, Dictionary<string, object> tokens) {

View File

@@ -184,10 +184,21 @@ namespace Orchard.ContentManagement {
return Slice(0, 0);
}
public IEnumerable<ContentItem> Slice(int skip, int count) {
public IEnumerable<int> ListIds() {
return ListIds(0, 0);
}
public IEnumerable<ContentItem> Slice(int skip, int count)
{
var ids = ListIds(skip, count);
return ContentManager.GetManyByVersionId(ids, new QueryHints().ExpandRecords(_includedPartRecords));
}
private IEnumerable<int> ListIds(int skip, int count)
{
ApplyHqlVersionOptionsRestrictions(_versionOptions);
_cacheable = true;
var hql = ToHql(false);
var query = _session
@@ -195,19 +206,19 @@ namespace Orchard.ContentManagement {
.SetCacheable(_cacheable)
;
if (skip != 0) {
if (skip != 0)
{
query.SetFirstResult(skip);
}
if (count != 0 && count != Int32.MaxValue) {
if (count != 0 && count != Int32.MaxValue)
{
query.SetMaxResults(count);
}
var ids = query
return query
.SetResultTransformer(Transformers.AliasToEntityMap)
.List<IDictionary>()
.Select(x => (int)x["Id"]);
return ContentManager.GetManyByVersionId(ids, new QueryHints().ExpandRecords(_includedPartRecords));
}
public int Count() {

View File

@@ -40,6 +40,11 @@ namespace Orchard.ContentManagement {
/// </summary>
IEnumerable<ContentItem> List();
/// <summary>
/// Executes the query and returns all ids for matching content items.
/// </summary>
IEnumerable<int> ListIds();
/// <summary>
/// Returns a subset of the matching content items.
/// </summary>