mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Fixing that ProjectionManager can return duplicate results when using multiple filter groups, fixes 8108
This commit is contained in:
committed by
Benedek Farkas
parent
ce63f47dc4
commit
bbb5376594
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user