Improving path resolution performance

This commit is contained in:
Sebastien Ros
2014-04-17 12:50:57 -07:00
parent 2432b7f326
commit e10aa37620
4 changed files with 61 additions and 8 deletions

View File

@@ -16,7 +16,11 @@ namespace Orchard.Autoroute {
.Attachable() .Attachable()
.WithDescription("Adds advanced url configuration options to your content type to completely customize the url pattern for a content item.")); .WithDescription("Adds advanced url configuration options to your content type to completely customize the url pattern for a content item."));
return 2; SchemaBuilder.AlterTable("AutoroutePartRecord", table => table
.CreateIndex("IDX_AutoroutePartRecord_DisplayAlias", "DisplayAlias")
);
return 3;
} }
public int UpdateFrom1() { public int UpdateFrom1() {
@@ -24,5 +28,14 @@ namespace Orchard.Autoroute {
.WithDescription("Adds advanced url configuration options to your content type to completely customize the url pattern for a content item.")); .WithDescription("Adds advanced url configuration options to your content type to completely customize the url pattern for a content item."));
return 2; return 2;
} }
public int UpdateFrom2() {
SchemaBuilder.AlterTable("AutoroutePartRecord", table => table
.CreateIndex("IDX_AutoroutePartRecord_DisplayAlias", "DisplayAlias")
);
return 3;
}
} }
} }

View File

@@ -1,20 +1,30 @@
using System.Linq; using System.Linq;
using Orchard.Autoroute.Models; using Orchard.Autoroute.Models;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Data;
namespace Orchard.Autoroute.Services { namespace Orchard.Autoroute.Services {
public class PathResolutionService : IPathResolutionService { public class PathResolutionService : IPathResolutionService {
private readonly IContentManager _contentManager; private readonly IContentManager _contentManager;
IRepository<AutoroutePartRecord> _autorouteRepository;
public PathResolutionService(IContentManager contentManager) { public PathResolutionService(
IRepository<AutoroutePartRecord> autorouteRepository,
IContentManager contentManager) {
_contentManager = contentManager; _contentManager = contentManager;
_autorouteRepository = autorouteRepository;
} }
public AutoroutePart GetPath(string path) { public AutoroutePart GetPath(string path) {
return _contentManager.Query<AutoroutePart, AutoroutePartRecord>() var autorouteRecord = _autorouteRepository.Table
.Where(part => part.DisplayAlias == path) .Where(part => part.DisplayAlias == path && part.ContentItemVersionRecord.Latest && part.ContentItemVersionRecord.Published)
.Slice(0, 1) .FirstOrDefault();
.FirstOrDefault();
if (autorouteRecord == null) {
return null;
}
return _contentManager.Get(autorouteRecord.Id).As<AutoroutePart>();
} }
} }
} }

View File

@@ -2,7 +2,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Orchard.Autoroute.Models; using Orchard.Autoroute.Models;
using Orchard.Autoroute.Services;
using Orchard.Blogs.Models; using Orchard.Blogs.Models;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Core.Title.Models; using Orchard.Core.Title.Models;
using Orchard.Environment.Configuration; using Orchard.Environment.Configuration;
@@ -17,19 +19,33 @@ namespace Orchard.Blogs.Services {
private readonly ShellSettings _shellSettings; private readonly ShellSettings _shellSettings;
private readonly IShellDescriptorManager _shellDescriptorManager; private readonly IShellDescriptorManager _shellDescriptorManager;
private readonly HashSet<int> _processedBlogParts = new HashSet<int>(); private readonly HashSet<int> _processedBlogParts = new HashSet<int>();
IPathResolutionService _pathResolutionService;
public BlogService( public BlogService(
IContentManager contentManager, IContentManager contentManager,
IProcessingEngine processingEngine, IProcessingEngine processingEngine,
ShellSettings shellSettings, ShellSettings shellSettings,
IShellDescriptorManager shellDescriptorManager) { IShellDescriptorManager shellDescriptorManager,
IPathResolutionService pathResolutionService) {
_contentManager = contentManager; _contentManager = contentManager;
_processingEngine = processingEngine; _processingEngine = processingEngine;
_shellSettings = shellSettings; _shellSettings = shellSettings;
_shellDescriptorManager = shellDescriptorManager; _shellDescriptorManager = shellDescriptorManager;
_pathResolutionService = pathResolutionService;
} }
public BlogPart Get(string path) { public BlogPart Get(string path) {
return _contentManager.Query<AutoroutePart, AutoroutePartRecord>().Where(r => r.DisplayAlias == path).ForPart<BlogPart>().Slice(0, 1).FirstOrDefault(); var blog = _pathResolutionService.GetPath(path);
if (blog == null) {
return null;
}
if (!blog.Has<BlogPart>()) {
return null;
}
return blog.As<BlogPart>();
} }
public ContentItem Get(int id, VersionOptions versionOptions) { public ContentItem Get(int id, VersionOptions versionOptions) {

View File

@@ -50,5 +50,19 @@ namespace Orchard.ContentManagement.DataMigrations {
return 2; return 2;
} }
public int UpdateFrom2() {
SchemaBuilder.AlterTable("ContentTypeRecord",
table => table
.CreateIndex("IDX_ContentType_Name", "Name")
);
SchemaBuilder.AlterTable("ContentItemVersionRecord",
table => table
.CreateIndex("IDX_ContentItemVersionRecord_Published_Latest", "Published", "Latest")
);
return 3;
}
} }
} }