PERF: ExtensionManager orders FeatureDescriptors inefficiently

Fix for 16717

--HG--
branch : perf
This commit is contained in:
Suha Can
2010-11-04 16:39:12 -07:00
parent 035c60fb90
commit 103ab6e1cc
4 changed files with 9 additions and 20 deletions

View File

@@ -86,8 +86,7 @@ namespace Orchard.Data.Migration {
Logger.Information("Updating feature: {0}", feature);
// proceed with dependent features first, whatever the module it's in
var dependencies = ShellStateCoordinator.OrderByDependencies(_extensionManager.AvailableExtensions()
.SelectMany(ext => ext.Features))
var dependencies = _extensionManager.AvailableFeatures()
.Where(f => String.Equals(f.Name, feature, StringComparison.OrdinalIgnoreCase))
.Where(f => f.Dependencies != null)
.SelectMany( f => f.Dependencies )

View File

@@ -41,8 +41,7 @@ namespace Orchard.Data.Migration.Generator {
/// Generates SchemaCommand instances in order to create the schema for a specific feature
/// </summary>
public IEnumerable<SchemaCommand> GetCreateFeatureCommands(string feature, bool drop) {
var dependencies = ShellStateCoordinator.OrderByDependencies(_extensionManager.AvailableExtensions()
.SelectMany(ext => ext.Features))
var dependencies = _extensionManager.AvailableFeatures()
.Where(f => String.Equals(f.Name, feature, StringComparison.OrdinalIgnoreCase))
.Where(f => f.Dependencies != null)
.SelectMany(f => f.Dependencies)

View File

@@ -4,7 +4,6 @@ using System.IO;
using System.Linq;
using System.Web;
using ICSharpCode.SharpZipLib.Zip;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Helpers;
using Orchard.Environment.Extensions.Loaders;
@@ -18,6 +17,7 @@ namespace Orchard.Environment.Extensions {
public class ExtensionManager : IExtensionManager {
private readonly IEnumerable<IExtensionFolders> _folders;
private readonly IEnumerable<IExtensionLoader> _loaders;
private IEnumerable<FeatureDescriptor> _featureDescriptors;
public Localizer T { get; set; }
public ILogger Logger { get; set; }
@@ -36,9 +36,11 @@ namespace Orchard.Environment.Extensions {
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
var featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features);
var featureDescriptorsOrdered = featureDescriptors.OrderByDependencies(HasDependency);
return featureDescriptorsOrdered.ToReadOnlyCollection();
if (_featureDescriptors == null || _featureDescriptors.Count() == 0) {
_featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features).OrderByDependencies(HasDependency).ToReadOnlyCollection();
return _featureDescriptors;
}
return _featureDescriptors;
}
/// <summary>

View File

@@ -7,7 +7,6 @@ using Orchard.Environment.Extensions.Models;
using Orchard.Environment.State.Models;
using Orchard.Environment.Descriptor;
using Orchard.Environment.Descriptor.Models;
using Orchard.Utility;
namespace Orchard.Environment.State {
public class ShellStateCoordinator : IShellStateManagerEventHandler, IShellDescriptorManagerEventHandler {
@@ -102,7 +101,7 @@ namespace Orchard.Environment.State {
var shellState = _stateManager.GetShellState();
// start with description of all declared features in order - order preserved with all merging
var orderedFeatureDescriptors = AllFeaturesInOrder();
var orderedFeatureDescriptors = _extensionManager.AvailableFeatures();
// merge feature state into ordered list
var orderedFeatureDescriptorsAndStates = orderedFeatureDescriptors
@@ -176,19 +175,9 @@ namespace Orchard.Environment.State {
FireApplyChangesIfNeeded();
}
private IEnumerable<FeatureDescriptor> AllFeaturesInOrder() {
return OrderByDependencies(_extensionManager.AvailableExtensions().SelectMany(ext => ext.Features));
}
static bool IsRising(ShellFeatureState state) {
return state.InstallState == ShellFeatureState.State.Rising ||
state.EnableState == ShellFeatureState.State.Rising;
}
public static IEnumerable<FeatureDescriptor> OrderByDependencies(IEnumerable<FeatureDescriptor> descriptors) {
return descriptors.OrderByDependencies((item, dep) =>
item.Dependencies != null &&
item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, dep.Name)));
}
}
}