From 246dfba8ac9b04ee151e0ca6e33995ac8861bcbc Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 2 Oct 2014 18:06:15 +0200 Subject: [PATCH 1/5] Bump version --- build/NuSpecs/build/UmbracoCms.targets | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/NuSpecs/build/UmbracoCms.targets b/build/NuSpecs/build/UmbracoCms.targets index 894e29409d..c033bb7ace 100644 --- a/build/NuSpecs/build/UmbracoCms.targets +++ b/build/NuSpecs/build/UmbracoCms.targets @@ -1,7 +1,7 @@  - 6.2.2 + 6.2.3 diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 904eb17624..0314848a7f 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2675,9 +2675,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True True - 6220 + 6230 / - http://localhost:6220 + http://localhost:6230 False False From b5594517bd0e810d24d1eeb6ea35bc054299f902 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Oct 2014 17:13:28 +1100 Subject: [PATCH 2/5] Fixes: U4-5583 Can no longer link to Media Items from RTE in 6.2.3 - Due to a cherry pick/merge issue since the newer 7.x EntityRepository deals with NVarchar and NText values whereas the 6.x one did not. Have backported the mapping poco classes to now also support NVarchar and NText for the EntityRepository. Have also fixed the basic query to ensure that there are no left joins before inner joins which can also cause problems. Fixed up the duplicate where clause. Adds more tests to entity service. --- .../Factories/UmbracoEntityFactory.cs | 12 ++-- .../Repositories/EntityRepository.cs | 58 ++++++++----------- .../Services/EntityServiceTests.cs | 37 +++++++++++- 3 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs index cdbab3d0c1..3c4611ffe7 100644 --- a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs @@ -99,11 +99,13 @@ namespace Umbraco.Core.Persistence.Factories foreach (var propertyDto in dto.UmbracoPropertyDtos) { entity.UmbracoProperties.Add(new UmbracoEntity.UmbracoProperty - { - DataTypeControlId = - propertyDto.DataTypeControlId, - Value = propertyDto.UmbracoFile - }); + { + DataTypeControlId = + propertyDto.DataTypeControlId, + Value = propertyDto.NTextValue.IsNullOrWhiteSpace() + ? propertyDto.NVarcharValue + : propertyDto.NTextValue + }); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index f2b899ac7b..996d62191d 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); @@ -510,10 +492,16 @@ namespace Umbraco.Core.Persistence.Repositories [Column("controlId")] public Guid DataTypeControlId { get; set; } - [Column("umbracoFile")] - public string UmbracoFile { get; set; } - } + [Column("propertyTypeAlias")] + public string PropertyAlias { get; set; } + [Column("dataNvarchar")] + public string NVarcharValue { get; set; } + + [Column("dataNtext")] + public string NTextValue { get; set; } + } + /// /// This is a special relator in that it is not returning a DTO but a real resolved entity and that it accepts /// a dynamic instance. @@ -546,7 +534,9 @@ namespace Umbraco.Core.Persistence.Repositories Current.UmbracoProperties.Add(new UmbracoEntity.UmbracoProperty { DataTypeControlId = p.DataTypeControlId, - Value = p.UmbracoFile + Value = p.NTextValue.IsNullOrWhiteSpace() + ? p.NVarcharValue + : p.NTextValue }); // Return null to indicate we're not done with this UmbracoEntity yet return null; @@ -568,7 +558,9 @@ namespace Umbraco.Core.Persistence.Repositories new UmbracoEntity.UmbracoProperty { DataTypeControlId = p.DataTypeControlId, - Value = p.UmbracoFile + Value = p.NTextValue.IsNullOrWhiteSpace() + ? p.NVarcharValue + : p.NTextValue } }; diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index 0c92545334..cc27aaf49e 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); Assert.That(entities.Any(), Is.True); - Assert.That(entities.Count(), Is.EqualTo(3)); + Assert.That(entities.Count(), Is.EqualTo(5)); //Assert.That(entities.Any(x => ((UmbracoEntity)x).UmbracoFile != string.Empty), Is.True); Assert.That( entities.Any( @@ -140,6 +164,8 @@ namespace Umbraco.Tests.Services private static bool _isSetup = false; + private int folderId; + public override void CreateTestData() { if (_isSetup == false) @@ -150,8 +176,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); @@ -162,6 +189,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); + } } From 646e5f173d812e9416f3a1bd0134b620fcf8a447 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Oct 2014 17:23:14 +1100 Subject: [PATCH 3/5] Fixes descendant queries to ensure that the comma is suffixed to the path, otherwise strange things could happen when there are longer ids! --- src/Umbraco.Core/Services/ContentService.cs | 3 ++- src/Umbraco.Core/Services/EntityService.cs | 3 ++- src/Umbraco.Core/Services/MediaService.cs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 6988189cdc..f746262dee 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -500,7 +500,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 3837603d88..5c1e137917 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 5402290872..54bf792868 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; From 0543c620eb757eba02a23a4d0b2b558ab8a218df Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Oct 2014 17:25:06 +1100 Subject: [PATCH 4/5] bumps version --- build/NuSpecs/build/UmbracoCms.targets | 2 +- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/NuSpecs/build/UmbracoCms.targets b/build/NuSpecs/build/UmbracoCms.targets index c033bb7ace..bdb5889a47 100644 --- a/build/NuSpecs/build/UmbracoCms.targets +++ b/build/NuSpecs/build/UmbracoCms.targets @@ -1,7 +1,7 @@  - 6.2.3 + 6.2.4 diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 1ad70b5b8d..ecf4a90c1d 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("6.2.3"); + private static readonly Version Version = new Version("6.2.4"); /// /// Gets the current version of Umbraco. diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 0314848a7f..18f621e518 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2677,7 +2677,7 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True 6230 / - http://localhost:6230 + http://localhost:6240 False False From 1eab26c0f61b362ffaf9fa840288279c502a7bbe Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 8 Oct 2014 17:26:55 +1100 Subject: [PATCH 5/5] reverts IQuery --- .../Persistence/Querying/IQuery.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Querying/IQuery.cs b/src/Umbraco.Core/Persistence/Querying/IQuery.cs index b484465540..b158943cb4 100644 --- a/src/Umbraco.Core/Persistence/Querying/IQuery.cs +++ b/src/Umbraco.Core/Persistence/Querying/IQuery.cs @@ -4,6 +4,28 @@ using System.Linq.Expressions; namespace Umbraco.Core.Persistence.Querying { + /// + /// SD: This is a horrible hack but unless we break compatibility with anyone who's actually implemented IQuery{T} there's not much we can do. + /// The IQuery{T} interface is useless without having a GetWhereClauses method and cannot be used for tests. + /// We have to wait till v8 to make this change I suppose. + /// + internal static class QueryExtensions + { + /// + /// Returns all translated where clauses and their sql parameters + /// + /// + public static IEnumerable> GetWhereClauses(this IQuery query) + { + var q = query as Query; + if (q == null) + { + throw new NotSupportedException(typeof(IQuery) + " cannot be cast to " + typeof(Query)); + } + return q.GetWhereClauses(); + } + } + /// /// Represents a query for building Linq translatable SQL queries /// @@ -17,10 +39,6 @@ namespace Umbraco.Core.Persistence.Querying /// This instance so calls to this method are chainable IQuery Where(Expression> predicate); - /// - /// Returns all translated where clauses and their sql parameters - /// - /// - IEnumerable> GetWhereClauses(); + } } \ No newline at end of file