More perf

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2011-08-24 15:37:57 -07:00
parent 3f73a0b938
commit 5e9e88f52c

View File

@@ -7,8 +7,8 @@ using System.Xml.Linq;
using Autofac; using Autofac;
using NHibernate; using NHibernate;
using NHibernate.Criterion; using NHibernate.Criterion;
using NHibernate.Metadata;
using NHibernate.SqlCommand; using NHibernate.SqlCommand;
using NHibernate.Transform;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Builders;
@@ -249,22 +249,35 @@ namespace Orchard.ContentManagement {
var contentItemCriteria = contentItemVersionCriteria.CreateCriteria("ContentItemRecord"); var contentItemCriteria = contentItemVersionCriteria.CreateCriteria("ContentItemRecord");
predicate(contentItemCriteria, contentItemVersionCriteria); predicate(contentItemCriteria, contentItemVersionCriteria);
var hintDictionary = hints.Records.Distinct().ToDictionary(value => value);
var contentItemMetadata = session.SessionFactory.GetClassMetadata(typeof (ContentItemRecord)); var contentItemMetadata = session.SessionFactory.GetClassMetadata(typeof (ContentItemRecord));
var contentItemVersionMetadata = session.SessionFactory.GetClassMetadata(typeof (ContentItemVersionRecord)); var contentItemVersionMetadata = session.SessionFactory.GetClassMetadata(typeof (ContentItemVersionRecord));
ExpandHints(hintDictionary, contentItemMetadata, contentItemCriteria); // break apart and group hints by their first segment
ExpandHints(hintDictionary, contentItemVersionMetadata, contentItemVersionCriteria); var hintDictionary = hints.Records
.Select(hint=>new {Hint=hint, Segments=hint.Split('.')})
.GroupBy(item=>item.Segments.FirstOrDefault())
.ToDictionary(grouping=>grouping.Key, StringComparer.InvariantCultureIgnoreCase);
// locate hints that match properties in the ContentItemVersionRecord
foreach (var hit in contentItemVersionMetadata.PropertyNames.Where(hintDictionary.ContainsKey).SelectMany(key=>hintDictionary[key])) {
contentItemVersionCriteria.SetFetchMode(hit.Hint, FetchMode.Eager);
hit.Segments.Take(hit.Segments.Count() - 1).Aggregate(contentItemVersionCriteria, ExtendCriteria);
}
// locate hints that match properties in the ContentItemRecord
foreach (var hit in contentItemMetadata.PropertyNames.Where(hintDictionary.ContainsKey).SelectMany(key=>hintDictionary[key])) {
contentItemVersionCriteria.SetFetchMode("ContentItemRecord." + hit.Hint, FetchMode.Eager);
hit.Segments.Take(hit.Segments.Count() - 1).Aggregate(contentItemCriteria, ExtendCriteria);
}
if (hintDictionary.SelectMany(x=>x.Value).Any(x=>x.Segments.Count() > 1))
contentItemVersionCriteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
return contentItemVersionCriteria.List<ContentItemVersionRecord>(); return contentItemVersionCriteria.List<ContentItemVersionRecord>();
} }
private static void ExpandHints(Dictionary<string, string> hintDictionary, IClassMetadata recordMetadata, ICriteria recordCriteria) { private static ICriteria ExtendCriteria(ICriteria criteria, string segment) {
foreach (var associationPath in recordMetadata.PropertyNames.Where(hintDictionary.ContainsKey)) { return criteria.GetCriteriaByPath(segment) ?? criteria.CreateCriteria(segment, JoinType.LeftOuterJoin);
if (recordCriteria.GetCriteriaByPath(associationPath) == null) {
recordCriteria.CreateCriteria(associationPath, JoinType.LeftOuterJoin);
}
}
} }
public virtual void Publish(ContentItem contentItem) { public virtual void Publish(ContentItem contentItem) {