diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index b2c3f91d1d..a4afcb52c9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -193,18 +193,7 @@ namespace Umbraco.Core.Persistence.Repositories public virtual IEnumerable GetByQuery(IQuery query) { - //TODO: We need to fix all of this and how it handles parameters! - - var wheres = query.GetWhereClauses().ToArray(); - - var sqlClause = GetBase(false, false, sql1 => - { - //adds the additional filters - foreach (var whereClause in wheres) - { - sql1.Where(whereClause.Item1, whereClause.Item2); - } - }); + var sqlClause = GetBase(false, false, null); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate().Append(GetGroupBy(false, false)); @@ -222,17 +211,7 @@ namespace Umbraco.Core.Persistence.Repositories bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document); bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media); - var wheres = query.GetWhereClauses().ToArray(); - - var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, sql1 => - { - //adds the additional filters - foreach (var whereClause in wheres) - { - sql1.Where(whereClause.Item1, whereClause.Item2); - } - - }, objectTypeId); + var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, null, objectTypeId); var translator = new SqlTranslator(sqlClause, query); var entitySql = translator.Translate(); @@ -241,6 +220,8 @@ namespace Umbraco.Core.Persistence.Repositories if (isMedia) { + var wheres = query.GetWhereClauses().ToArray(); + var mediaSql = GetFullSqlForMedia(entitySql.Append(GetGroupBy(isContent, true, false)), sql => { //adds the additional filters @@ -259,7 +240,8 @@ namespace Umbraco.Core.Persistence.Repositories else { //use dynamic so that we can get ALL properties from the SQL so we can chuck that data into our AdditionalData - var dtos = _work.Database.Fetch(entitySql.Append(GetGroupBy(isContent, false))); + var finalSql = entitySql.Append(GetGroupBy(isContent, false)); + var dtos = _work.Database.Fetch(finalSql); return dtos.Select(factory.BuildEntityFromDynamic).Cast().ToList(); } } @@ -362,10 +344,8 @@ namespace Umbraco.Core.Persistence.Repositories var entitySql = new Sql() .Select(columns.ToArray()) - .From("umbracoNode umbracoNode") - .LeftJoin("umbracoNode parent").On("parent.parentID = umbracoNode.id"); - - + .From("umbracoNode umbracoNode"); + if (isContent || isMedia) { entitySql.InnerJoin("cmsContent content").On("content.nodeId = umbracoNode.id") @@ -378,6 +358,8 @@ namespace Umbraco.Core.Persistence.Repositories .On("umbracoNode.id = latest.nodeId"); } + entitySql.LeftJoin("umbracoNode parent").On("parent.parentID = umbracoNode.id"); + if (customFilter != null) { customFilter(entitySql); diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index a63bfed35c..1714293361 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -536,7 +536,8 @@ namespace Umbraco.Core.Services { using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Path.StartsWith(content.Path) && x.Id != content.Id); + var pathMatch = content.Path + ","; + var query = Query.Builder.Where(x => x.Path.StartsWith(pathMatch) && x.Id != content.Id); var contents = repository.GetByQuery(query); return contents; diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index c78a55d6eb..4991912572 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -252,7 +252,8 @@ namespace Umbraco.Core.Services using (var repository = _repositoryFactory.CreateEntityRepository(_uowProvider.GetUnitOfWork())) { var entity = repository.Get(id); - var query = Query.Builder.Where(x => x.Path.StartsWith(entity.Path) && x.Id != id); + var pathMatch = entity.Path + ","; + var query = Query.Builder.Where(x => x.Path.StartsWith(pathMatch) && x.Id != id); var entities = repository.GetByQuery(query); return entities; diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index fce1f00261..a490bdf4cf 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -419,7 +419,8 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMediaRepository(uow)) { - var query = Query.Builder.Where(x => x.Path.StartsWith(media.Path) && x.Id != media.Id); + var pathMatch = media.Path + ","; + var query = Query.Builder.Where(x => x.Path.StartsWith(pathMatch) && x.Id != media.Id); var medias = repository.GetByQuery(query); return medias; diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index 0a34b59063..361bd4e8a2 100644 --- a/src/Umbraco.Tests/Services/EntityServiceTests.cs +++ b/src/Umbraco.Tests/Services/EntityServiceTests.cs @@ -76,6 +76,30 @@ namespace Umbraco.Tests.Services Assert.That(entities.Any(x => x.Trashed), Is.False); } + [Test] + public void EntityService_Can_Get_Children_By_ParentId() + { + var service = ServiceContext.EntityService; + + var entities = service.GetChildren(folderId); + + Assert.That(entities.Any(), Is.True); + Assert.That(entities.Count(), Is.EqualTo(3)); + Assert.That(entities.Any(x => x.Trashed), Is.False); + } + + [Test] + public void EntityService_Can_Get_Descendants_By_ParentId() + { + var service = ServiceContext.EntityService; + + var entities = service.GetDescendents(folderId); + + Assert.That(entities.Any(), Is.True); + Assert.That(entities.Count(), Is.EqualTo(4)); + Assert.That(entities.Any(x => x.Trashed), Is.False); + } + [Test] public void EntityService_Throws_When_Getting_All_With_Invalid_Type() { @@ -129,7 +153,7 @@ namespace Umbraco.Tests.Services var entities = service.GetAll(UmbracoObjectTypes.Media).ToArray(); Assert.That(entities.Any(), Is.True); - Assert.That(entities.Count(), Is.EqualTo(3)); + Assert.That(entities.Count(), Is.EqualTo(5)); Assert.That( entities.Any( @@ -150,6 +174,8 @@ namespace Umbraco.Tests.Services private static bool _isSetup = false; + private int folderId; + public override void CreateTestData() { if (_isSetup == false) @@ -160,8 +186,9 @@ namespace Umbraco.Tests.Services //Create and Save folder-Media -> 1050 var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031); - var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); + var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); ServiceContext.MediaService.Save(folder, 0); + folderId = folder.Id; //Create and Save image-Media -> 1051 var imageMediaType = ServiceContext.ContentTypeService.GetMediaType(1032); @@ -172,6 +199,12 @@ namespace Umbraco.Tests.Services var fileMediaType = ServiceContext.ContentTypeService.GetMediaType(1033); var file = MockedMedia.CreateMediaFile(fileMediaType, folder.Id); ServiceContext.MediaService.Save(file, 0); + + var subfolder = MockedMedia.CreateMediaFolder(folderMediaType, folder.Id); + ServiceContext.MediaService.Save(subfolder, 0); + var subfolder2 = MockedMedia.CreateMediaFolder(folderMediaType, subfolder.Id); + ServiceContext.MediaService.Save(subfolder2, 0); + } }