From 60c56ed346cb2e484705d19c69467e1b6cc57afd Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 18 May 2012 11:03:50 -0700 Subject: [PATCH] Optimizing import task --HG-- branch : 1.x --- .../RecipeHandlers/DataRecipeHandler.cs | 11 +-- .../DefaultContentManager.cs | 2 - .../ContentManagement/ImportContentSession.cs | 89 +++++++++---------- 3 files changed, 47 insertions(+), 55 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs index bd7911657..0203102c8 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs @@ -34,15 +34,10 @@ namespace Orchard.Recipes.RecipeHandlers { var identity = elementId.Value; var status = element.Attribute("Status"); - + + importContentSession.Set(identity, element.Name.LocalName); + var item = importContentSession.Get(identity); - if (item == null) { - item = _orchardServices.ContentManager.New(element.Name.LocalName); - } - else { - item = _orchardServices.ContentManager.Get(item.Id, VersionOptions.DraftRequired); - } - importContentSession.Store(identity, item); } // Second pass to import the content items. diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index f5e6f4e7a..eaac9b045 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -589,8 +589,6 @@ namespace Orchard.ContentManagement { }; } - importContentSession.Store(identity, item); - var context = new ImportContentContext(item, element, importContentSession); foreach (var contentHandler in Handlers) { contentHandler.Importing(context); diff --git a/src/Orchard/ContentManagement/ImportContentSession.cs b/src/Orchard/ContentManagement/ImportContentSession.cs index f541e0417..70f60383c 100644 --- a/src/Orchard/ContentManagement/ImportContentSession.cs +++ b/src/Orchard/ContentManagement/ImportContentSession.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Orchard.ContentManagement { @@ -8,13 +9,19 @@ namespace Orchard.ContentManagement { private const int BulkPage = 128; private int _lastIndex = 0; - private readonly Dictionary _identities; + private readonly Dictionary _identities; private readonly Dictionary _contentItemIds; + private readonly Dictionary _contentTypes; public ImportContentSession(IContentManager contentManager) { _contentManager = contentManager; - _identities = new Dictionary(new ContentIdentity.ContentIdentityEqualityComparer()); + _identities = new Dictionary(new ContentIdentity.ContentIdentityEqualityComparer()); _contentItemIds = new Dictionary(); + _contentTypes = new Dictionary(new ContentIdentity.ContentIdentityEqualityComparer()); + } + public void Set(string id, string contentType) { + var contentIdentity = new ContentIdentity(id); + _contentTypes[contentIdentity] = contentType; } public ContentItem Get(string id) { @@ -22,64 +29,56 @@ namespace Orchard.ContentManagement { // lookup in local cache if (_identities.ContainsKey(contentIdentity)) - return _identities[contentIdentity]; + return _contentManager.Get(_identities[contentIdentity], VersionOptions.DraftRequired); // no result ? then check if there are some more content items to load from the db - - if(_lastIndex == int.MaxValue) { - // everything has already been loaded from db - return null; - } - - var equalityComparer = new ContentIdentity.ContentIdentityEqualityComparer(); - IEnumerable block; + if(_lastIndex != int.MaxValue) { + + var equalityComparer = new ContentIdentity.ContentIdentityEqualityComparer(); + IEnumerable block; - // load identities in blocks - while ((block = _contentManager.HqlQuery() - .ForVersion(VersionOptions.Latest) - .OrderBy(x => x.ContentItemVersion(), x => x.Asc("Id")) - .Slice(_lastIndex, BulkPage)).Any()) { + // load identities in blocks + while ((block = _contentManager.HqlQuery() + .ForVersion(VersionOptions.Latest) + .OrderBy(x => x.ContentItemVersion(), x => x.Asc("Id")) + .Slice(_lastIndex, BulkPage)).Any()) { - foreach (var item in block) { - _lastIndex++; + foreach (var item in block) { + _lastIndex++; - // ignore content item if it has already been imported - if (_contentItemIds.ContainsKey(item.Id)) { - continue; - } + // ignore content item if it has already been imported + if (_contentItemIds.ContainsKey(item.Id)) { + continue; + } - var identity = _contentManager.GetItemMetadata(item).Identity; + var identity = _contentManager.GetItemMetadata(item).Identity; - // ignore content item if the same identity is already present - if (_identities.ContainsKey(identity)) { - continue; - } + // ignore content item if the same identity is already present + if (_identities.ContainsKey(identity)) { + continue; + } - _identities.Add(identity, item); - _contentItemIds.Add(item.Id, identity); + _identities.Add(identity, item.Id); + _contentItemIds.Add(item.Id, identity); - if (equalityComparer.Equals(identity, contentIdentity)) { - return item; + if (equalityComparer.Equals(identity, contentIdentity)) { + return _contentManager.Get(item.Id, VersionOptions.DraftRequired); + } } - } + + _contentManager.Flush(); + _contentManager.Clear(); + } } _lastIndex = int.MaxValue; - return null; - } - public void Store(string id, ContentItem item) { - var contentIdentity = new ContentIdentity(id); - if (_identities.ContainsKey(contentIdentity)) { - _identities.Remove(contentIdentity); - _contentItemIds.Remove(item.Id); + if(!_contentTypes.ContainsKey(contentIdentity)) { + throw new ArgumentException("Unknown content type for " + id); + } - _identities.Add(contentIdentity, item); - if (!_contentItemIds.ContainsKey(item.Id)) { - _contentItemIds.Add(item.Id, contentIdentity); - } + return _contentManager.New(_contentTypes[contentIdentity]); } - } }