From db0a87e3ca87cc0a822ad51c5bd7d9cd9f102c53 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 2 Sep 2014 16:40:17 +1000 Subject: [PATCH] fixes n+1 queries in MediaRepository.PerformGetAll --- .../Repositories/ContentRepository.cs | 8 +- .../Repositories/MediaRepository.cs | 89 ++++++++----------- 2 files changed, 39 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index bd395ed077..388e25fd06 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -88,17 +88,17 @@ namespace Umbraco.Core.Persistence.Repositories protected override IEnumerable PerformGetAll(params int[] ids) { - var sqlClause = GetBaseQuery(false); + var sql = GetBaseQuery(false); if (ids.Any()) { - sqlClause.Where("umbracoNode.id in (@ids)", new {ids = ids}); + sql.Where("umbracoNode.id in (@ids)", new {ids = ids}); } else { - sqlClause.Where(x => x.NodeObjectType == NodeObjectTypeId); + sql.Where(x => x.NodeObjectType == NodeObjectTypeId); } - return ProcessQuery(sqlClause); + return ProcessQuery(sql); } protected override IEnumerable PerformGetByQuery(IQuery query) diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index 166bb8e75a..21a7734366 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -66,36 +66,24 @@ namespace Umbraco.Core.Persistence.Repositories if (dto == null) return null; - var mediaType = _mediaTypeRepository.Get(dto.ContentDto.ContentTypeId); + var content = CreateMediaFromDto(dto, dto.VersionId); - var factory = new MediaFactory(mediaType, NodeObjectTypeId, id); - var media = factory.BuildEntity(dto); - - media.Properties = GetPropertyCollection(id, dto.VersionId, mediaType, media.CreateDate, media.UpdateDate); - - //on initial construction we don't want to have dirty properties tracked - // http://issues.umbraco.org/issue/U4-1946 - ((Entity)media).ResetDirtyProperties(false); - return media; + return content; } protected override IEnumerable PerformGetAll(params int[] ids) { + var sql = GetBaseQuery(false); if (ids.Any()) { - foreach (var id in ids) - { - yield return Get(id); - } + sql.Where("umbracoNode.id in (@ids)", new { ids = ids }); } else { - var nodeDtos = Database.Fetch("WHERE nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); - foreach (var nodeDto in nodeDtos) - { - yield return Get(nodeDto.NodeId); - } + sql.Where(x => x.NodeObjectType == NodeObjectTypeId); } + + return ProcessQuery(sql); } protected override IEnumerable PerformGetByQuery(IQuery query) @@ -105,41 +93,7 @@ namespace Umbraco.Core.Persistence.Repositories var sql = translator.Translate() .OrderBy(x => x.SortOrder); - //NOTE: This doesn't allow properties to be part of the query - var dtos = Database.Fetch(sql); - - //content types - var contentTypes = _mediaTypeRepository.GetAll(dtos.Select(x => x.ContentDto.ContentTypeId).ToArray()) - .ToArray(); - - //Go get the property data for each document - var docDefs = dtos.Select(dto => new Tuple( - dto.NodeId, - dto.VersionId, - contentTypes.First(ct => ct.Id == dto.ContentDto.ContentTypeId), - dto.ContentDto.NodeDto.CreateDate, - dto.VersionDate)) - .ToArray(); - - var propertyData = GetPropertyCollection(docDefs); - - return dtos.Select(dto => CreateMediaFromDto( - dto, - dto.VersionId, - contentTypes.First(ct => ct.Id == dto.ContentDto.ContentTypeId), - propertyData[dto.NodeId])); - - - //var sqlClause = GetBaseQuery(false); - //var translator = new SqlTranslator(sqlClause, query); - //var sql = translator.Translate(); - - //var dtos = Database.Fetch(sql); - - //foreach (var dto in dtos) - //{ - // yield return Get(dto.ContentDto.NodeDto.NodeId); - //} + return ProcessQuery(sqlClause); } #endregion @@ -507,6 +461,33 @@ namespace Umbraco.Core.Persistence.Repositories return result; } + private IEnumerable ProcessQuery(Sql sql) + { + //NOTE: This doesn't allow properties to be part of the query + var dtos = Database.Fetch(sql); + + //content types + var contentTypes = _mediaTypeRepository.GetAll(dtos.Select(x => x.ContentDto.ContentTypeId).ToArray()) + .ToArray(); + + //Go get the property data for each document + var docDefs = dtos.Select(dto => new Tuple( + dto.NodeId, + dto.VersionId, + contentTypes.First(ct => ct.Id == dto.ContentDto.ContentTypeId), + dto.ContentDto.NodeDto.CreateDate, + dto.VersionDate)) + .ToArray(); + + var propertyData = GetPropertyCollection(docDefs); + + return dtos.Select(dto => CreateMediaFromDto( + dto, + dto.VersionId, + contentTypes.First(ct => ct.Id == dto.ContentDto.ContentTypeId), + propertyData[dto.NodeId])); + } + private string GetDatabaseFieldNameForOrderBy(string orderBy) { // Translate the passed order by field (which were originally defined for in-memory object sorting