diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 465a6c3b58..f24a8c930a 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -568,7 +568,7 @@ namespace Umbraco.Core.Models [IgnoreDataMember] internal string ShortStringPropertyValue { get; set; } [IgnoreDataMember] - internal int IntegerropertyValue { get; set; } + internal int IntegerPropertyValue { get; set; } [IgnoreDataMember] internal bool BoolPropertyValue { get; set; } [IgnoreDataMember] diff --git a/src/Umbraco.Core/Persistence/Factories/MemberFactory.cs b/src/Umbraco.Core/Persistence/Factories/MemberFactory.cs index b64ceba9aa..0c24b0dd6d 100644 --- a/src/Umbraco.Core/Persistence/Factories/MemberFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/MemberFactory.cs @@ -8,52 +8,80 @@ namespace Umbraco.Core.Persistence.Factories { internal class MemberFactory : IEntityFactory { + private readonly IMemberType _contentType; private readonly Guid _nodeObjectTypeId; private readonly int _id; private int _primaryKey; + public MemberFactory(IMemberType contentType, Guid nodeObjectTypeId, int id) + { + _contentType = contentType; + _nodeObjectTypeId = nodeObjectTypeId; + _id = id; + } + public MemberFactory(Guid nodeObjectTypeId, int id) { _nodeObjectTypeId = nodeObjectTypeId; _id = id; } + #region Implementation of IEntityFactory + public IMember BuildEntity(MemberDto dto) { - throw new System.NotImplementedException(); + var member = new Member( + dto.ContentVersionDto.ContentDto.NodeDto.Text, + dto.Email,dto.LoginName,dto.Password, _contentType) + { + Id = _id, + Key = + dto.ContentVersionDto.ContentDto.NodeDto.UniqueId.HasValue + ? dto.ContentVersionDto.ContentDto.NodeDto.UniqueId.Value + : _id.ToGuid(), + Path = dto.ContentVersionDto.ContentDto.NodeDto.Path, + CreatorId = dto.ContentVersionDto.ContentDto.NodeDto.UserId.Value, + Level = dto.ContentVersionDto.ContentDto.NodeDto.Level, + ParentId = dto.ContentVersionDto.ContentDto.NodeDto.ParentId, + SortOrder = dto.ContentVersionDto.ContentDto.NodeDto.SortOrder, + Trashed = dto.ContentVersionDto.ContentDto.NodeDto.Trashed, + CreateDate = dto.ContentVersionDto.ContentDto.NodeDto.CreateDate, + UpdateDate = dto.ContentVersionDto.VersionDate, + Version = dto.ContentVersionDto.VersionId + }; + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + member.ResetDirtyProperties(false); + return member; } public MemberDto BuildDto(IMember entity) { - var member = new MemberDto - { - NodeId = entity.Id, - Email = entity.Email, - LoginName = entity.Username, - Password = entity.RawPasswordValue, - ContentVersionDto = BuildDto(entity as Member) - }; - return member; + var dto = new MemberDto + { + ContentVersionDto = new ContentVersionDto + { + NodeId = entity.Id, + VersionDate = entity.UpdateDate, + VersionId = entity.Version, + ContentDto = BuildContentDto(entity) + }, + Email = entity.Email, + LoginName = entity.Username, + NodeId = entity.Id, + Password = entity.RawPasswordValue + }; + return dto; } + #endregion + public void SetPrimaryKey(int primaryKey) { _primaryKey = primaryKey; } - private ContentVersionDto BuildDto(Member entity) - { - var dto = new ContentVersionDto - { - NodeId = entity.Id, - VersionDate = entity.UpdateDate, - VersionId = entity.Version, - ContentDto = BuildContentDto(entity) - }; - return dto; - } - - private ContentDto BuildContentDto(Member entity) + private ContentDto BuildContentDto(IMember entity) { var contentDto = new ContentDto { @@ -70,24 +98,109 @@ namespace Umbraco.Core.Persistence.Factories return contentDto; } - private NodeDto BuildNodeDto(IUmbracoEntity entity) + private NodeDto BuildNodeDto(IMember entity) { var nodeDto = new NodeDto - { - CreateDate = entity.CreateDate, - NodeId = entity.Id, - Level = short.Parse(entity.Level.ToString(CultureInfo.InvariantCulture)), - NodeObjectType = _nodeObjectTypeId, - ParentId = entity.ParentId, - Path = entity.Path, - SortOrder = entity.SortOrder, - Text = entity.Name, - Trashed = entity.Trashed, - UniqueId = entity.Key, - UserId = entity.CreatorId - }; + { + CreateDate = entity.CreateDate, + NodeId = entity.Id, + Level = short.Parse(entity.Level.ToString(CultureInfo.InvariantCulture)), + NodeObjectType = _nodeObjectTypeId, + ParentId = entity.ParentId, + Path = entity.Path, + SortOrder = entity.SortOrder, + Text = entity.Name, + Trashed = entity.Trashed, + UniqueId = entity.Key, + UserId = entity.CreatorId + }; return nodeDto; } } + + //internal class MemberFactory : IEntityFactory + //{ + // private readonly Guid _nodeObjectTypeId; + // private readonly int _id; + // private int _primaryKey; + + // public MemberFactory(Guid nodeObjectTypeId, int id) + // { + // _nodeObjectTypeId = nodeObjectTypeId; + // _id = id; + // } + + // public IMember BuildEntity(MemberDto dto) + // { + // throw new System.NotImplementedException(); + // } + + // public MemberDto BuildDto(IMember entity) + // { + // var member = new MemberDto + // { + // NodeId = entity.Id, + // Email = entity.Email, + // LoginName = entity.Username, + // Password = entity.RawPasswordValue, + // ContentVersionDto = BuildDto(entity as Member) + // }; + // return member; + // } + + // public void SetPrimaryKey(int primaryKey) + // { + // _primaryKey = primaryKey; + // } + + // private ContentVersionDto BuildDto(Member entity) + // { + // var dto = new ContentVersionDto + // { + // NodeId = entity.Id, + // VersionDate = entity.UpdateDate, + // VersionId = entity.Version, + // ContentDto = BuildContentDto(entity) + // }; + // return dto; + // } + + // private ContentDto BuildContentDto(Member entity) + // { + // var contentDto = new ContentDto + // { + // NodeId = entity.Id, + // ContentTypeId = entity.ContentTypeId, + // NodeDto = BuildNodeDto(entity) + // }; + + // if (_primaryKey > 0) + // { + // contentDto.PrimaryKey = _primaryKey; + // } + + // return contentDto; + // } + + // private NodeDto BuildNodeDto(IUmbracoEntity entity) + // { + // var nodeDto = new NodeDto + // { + // CreateDate = entity.CreateDate, + // NodeId = entity.Id, + // Level = short.Parse(entity.Level.ToString(CultureInfo.InvariantCulture)), + // NodeObjectType = _nodeObjectTypeId, + // ParentId = entity.ParentId, + // Path = entity.Path, + // SortOrder = entity.SortOrder, + // Text = entity.Name, + // Trashed = entity.Trashed, + // UniqueId = entity.Key, + // UserId = entity.CreatorId + // }; + + // return nodeDto; + // } + //} } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs b/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs index b5cb21c683..b8c5f1f3c1 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs @@ -62,7 +62,7 @@ namespace Umbraco.Core.Persistence.Mappers /* Internal experiment */ CacheMap(src => src.DateTimePropertyValue, dto => dto.Date); - CacheMap(src => src.IntegerropertyValue, dto => dto.Integer); + CacheMap(src => src.IntegerPropertyValue, dto => dto.Integer); CacheMap(src => src.BoolPropertyValue, dto => dto.Integer); CacheMap(src => src.LongStringPropertyValue, dto => dto.Text); CacheMap(src => src.ShortStringPropertyValue, dto => dto.VarChar); diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index da0420dbbd..8ed8f2ba63 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -607,30 +607,32 @@ namespace Umbraco.Core.Persistence.Repositories /// Gets paged content results /// /// Query to excute - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - public IEnumerable GetPagedResultsByQuery(IQuery query, int pageNumber, int pageSize, out int totalRecords, + public IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, string orderBy, Direction orderDirection, string filter = "") { // Get base query var sqlClause = GetBaseQuery(false); + + if (query == null) query = new Query(); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate() .Where(x => x.Newest); // Apply filter - if (!string.IsNullOrEmpty(filter)) + if (string.IsNullOrEmpty(filter) == false) { sql = sql.Where("cmsDocument.text LIKE @0", "%" + filter + "%"); } // Apply order according to parameters - if (!string.IsNullOrEmpty(orderBy)) + if (string.IsNullOrEmpty(orderBy) == false) { var orderByParams = new[] { GetDatabaseFieldNameForOrderBy(orderBy) }; if (orderDirection == Direction.Ascending) @@ -650,7 +652,7 @@ namespace Umbraco.Core.Persistence.Repositories // Get page of results and total count IEnumerable result; - var pagedResult = Database.Page(pageNumber, pageSize, modifiedSQL, sql.Arguments); + var pagedResult = Database.Page(pageIndex + 1, pageSize, modifiedSQL, sql.Arguments); totalRecords = Convert.ToInt32(pagedResult.TotalItems); if (totalRecords > 0) { @@ -694,17 +696,17 @@ namespace Umbraco.Core.Persistence.Repositories protected override string GetDatabaseFieldNameForOrderBy(string orderBy) { - var result = base.GetDatabaseFieldNameForOrderBy(orderBy); - if (result == orderBy) + //Some custom ones + switch (orderBy.ToUpperInvariant()) { - switch (orderBy.ToUpperInvariant()) - { - case "UPDATER": - //TODO: This isn't going to work very nicely because it's going to order by ID, not by letter - return "cmsDocument.documentUser"; - } + case "NAME": + return "cmsDocument.text"; + case "UPDATER": + //TODO: This isn't going to work very nicely because it's going to order by ID, not by letter + return "cmsDocument.documentUser"; } - return result; + + return base.GetDatabaseFieldNameForOrderBy(orderBy); } private IEnumerable ProcessQuery(Sql sql) diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs index 54dc8c2962..10ab5e7f91 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs @@ -72,14 +72,14 @@ namespace Umbraco.Core.Persistence.Repositories /// Gets paged content results /// /// Query to excute - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - IEnumerable GetPagedResultsByQuery(IQuery query, int pageNumber, int pageSize, out int totalRecords, + IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, string orderBy, Direction orderDirection, string filter = ""); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs index c8413f4d47..e571269b98 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs @@ -27,14 +27,14 @@ namespace Umbraco.Core.Persistence.Repositories /// Gets paged media results /// /// Query to excute - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - IEnumerable GetPagedResultsByQuery(IQuery query, int pageNumber, int pageSize, out int totalRecords, + IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, string orderBy, Direction orderDirection, string filter = ""); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs index 06447b7fbc..0538fe18fa 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs @@ -4,6 +4,7 @@ using System.Linq.Expressions; using System.Xml.Linq; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; namespace Umbraco.Core.Persistence.Repositories @@ -48,12 +49,15 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + /// + /// /// - IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, Expression> orderBy); + IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, + string orderBy, Direction orderDirection, string filter = ""); - IEnumerable GetPagedResultsByQuery( - Sql sql, int pageIndex, int pageSize, out int totalRecords, - Func, int[]> resolveIds); + //IEnumerable GetPagedResultsByQuery( + // Sql sql, int pageIndex, int pageSize, out int totalRecords, + // Func, int[]> resolveIds); /// /// Used to add/update published xml for the media item diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index f583bc5c84..4612acb470 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -89,7 +89,7 @@ namespace Umbraco.Core.Persistence.Repositories var sql = translator.Translate() .OrderBy(x => x.SortOrder); - return ProcessQuery(sqlClause); + return ProcessQuery(sql); } #endregion @@ -365,29 +365,31 @@ namespace Umbraco.Core.Persistence.Repositories /// Gets paged media results /// /// Query to excute - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - public IEnumerable GetPagedResultsByQuery(IQuery query, int pageNumber, int pageSize, out int totalRecords, + public IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, string orderBy, Direction orderDirection, string filter = "") { // Get base query var sqlClause = GetBaseQuery(false); + + if (query == null) query = new Query(); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); // Apply filter - if (!string.IsNullOrEmpty(filter)) + if (string.IsNullOrEmpty(filter) == false) { sql = sql.Where("umbracoNode.text LIKE @0", "%" + filter + "%"); } // Apply order according to parameters - if (!string.IsNullOrEmpty(orderBy)) + if (string.IsNullOrEmpty(orderBy) == false) { var orderByParams = new[] { GetDatabaseFieldNameForOrderBy(orderBy) }; if (orderDirection == Direction.Ascending) @@ -407,7 +409,7 @@ namespace Umbraco.Core.Persistence.Repositories // Get page of results and total count IEnumerable result; - var pagedResult = Database.Page(pageNumber, pageSize, modifiedSQL, sql.Arguments); + var pagedResult = Database.Page(pageIndex + 1, pageSize, modifiedSQL, sql.Arguments); totalRecords = Convert.ToInt32(pagedResult.TotalItems); if (totalRecords > 0) { diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index 067e8e537f..059f6f0a8f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -10,11 +10,13 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; -using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Relators; +using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Dynamics; namespace Umbraco.Core.Persistence.Repositories { @@ -61,11 +63,20 @@ namespace Umbraco.Core.Persistence.Repositories sql.Where(GetBaseWhereClause(), new { Id = id }); sql.OrderByDescending(x => x.VersionDate); - var dtos = - Database.Fetch( - new PropertyDataRelator().Map, sql); + var dto = Database.Fetch(sql).FirstOrDefault(); - return BuildFromDto(dtos, sql); + if (dto == null) + return null; + + var content = CreateMemberFromDto(dto, dto.ContentVersionDto.VersionId, sql); + + return content; + + //var dtos = + // Database.Fetch( + // new PropertyDataRelator().Map, sql); + + //return BuildFromDto(dtos, sql); } protected override IEnumerable PerformGetAll(params int[] ids) @@ -73,33 +84,72 @@ namespace Umbraco.Core.Persistence.Repositories var sql = GetBaseQuery(false); if (ids.Any()) { - var statement = string.Join(" OR ", ids.Select(x => string.Format("umbracoNode.id='{0}'", x))); - sql.Where(statement); + sql.Where("umbracoNode.id in (@ids)", new { ids = ids }); } - sql.OrderByDescending(x => x.VersionDate); - var dtos = - Database.Fetch( - new PropertyDataRelator().Map, sql); + return ProcessQuery(sql); - return BuildFromDtos(dtos, sql); + //var sql = GetBaseQuery(false); + //if (ids.Any()) + //{ + // var statement = string.Join(" OR ", ids.Select(x => string.Format("umbracoNode.id='{0}'", x))); + // sql.Where(statement); + //} + //sql.OrderByDescending(x => x.VersionDate); + + //var dtos = + // Database.Fetch( + // new PropertyDataRelator().Map, sql); + + //return BuildFromDtos(dtos, sql); } protected override IEnumerable PerformGetByQuery(IQuery query) { - var sqlSubquery = GetSubquery(); - var translator = new SqlTranslator(sqlSubquery, query); - var subquery = translator.Translate(); - var sql = GetBaseQuery(false) - .Append(new Sql("WHERE umbracoNode.id IN (" + subquery.SQL + ")", subquery.Arguments)) - .OrderByDescending(x => x.VersionDate) - .OrderBy(x => x.SortOrder); + var baseQuery = GetBaseQuery(false); - var dtos = - Database.Fetch( - new PropertyDataRelator().Map, sql); + //check if the query is based on properties or not + var query1 = query as Query; + if (query1 == null) + throw new Exception("Query cannot be null"); + var wheres = query1.WhereClauses(); + //this is a pretty rudimentary check but wil work, we just need to know if this query requires property + // level queries + if (wheres.Any(x => x.Contains("cmsPropertyType"))) + { + var sqlWithProps = GetNodeIdQueryWithPropertyData(); + var translator = new SqlTranslator(sqlWithProps, query); + var sql = translator.Translate(); - return BuildFromDtos(dtos, sql); + baseQuery.Append(new Sql("WHERE umbracoNode.id IN (" + sql.SQL + ")", sql.Arguments)) + .OrderBy(x => x.SortOrder); + + return ProcessQuery(baseQuery); + } + else + { + var translator = new SqlTranslator(baseQuery, query); + var sql = translator.Translate() + .OrderBy(x => x.SortOrder); + + return ProcessQuery(sql); + } + + + + //var sqlSubquery = GetSubquery(); + //var translator = new SqlTranslator(sqlSubquery, query); + //var subquery = translator.Translate(); + //var sql = GetBaseQuery(false) + // .Append(new Sql("WHERE umbracoNode.id IN (" + subquery.SQL + ")", subquery.Arguments)) + // .OrderByDescending(x => x.VersionDate) + // .OrderBy(x => x.SortOrder); + + //var dtos = + // Database.Fetch( + // new PropertyDataRelator().Map, sql); + + //return BuildFromDtos(dtos, sql); } #endregion @@ -109,38 +159,50 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - - if (isCount) - { - sql.Select("COUNT(*)") - .From() - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .InnerJoin().On(left => left.NodeId, right => right.ContentTypeId) - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .Where(x => x.NodeObjectType == NodeObjectTypeId); - return sql; - } - - sql.Select("umbracoNode.*", "cmsContent.contentType", "cmsContentType.alias AS ContentTypeAlias", "cmsContentVersion.VersionId", - "cmsContentVersion.VersionDate", "cmsContentVersion.LanguageLocale", "cmsMember.Email", - "cmsMember.LoginName", "cmsMember.Password", "cmsPropertyData.id AS PropertyDataId", "cmsPropertyData.propertytypeid", - "cmsPropertyData.dataDate", "cmsPropertyData.dataInt", "cmsPropertyData.dataNtext", "cmsPropertyData.dataNvarchar", - "cmsPropertyType.id", "cmsPropertyType.Alias", "cmsPropertyType.Description", - "cmsPropertyType.Name", "cmsPropertyType.mandatory", "cmsPropertyType.validationRegExp", - "cmsPropertyType.helpText", "cmsPropertyType.sortOrder AS PropertyTypeSortOrder", "cmsPropertyType.propertyTypeGroupId", - "cmsPropertyType.dataTypeId", "cmsDataType.propertyEditorAlias", "cmsDataType.dbType") - .From() - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .InnerJoin().On(left => left.NodeId, right => right.ContentTypeId) - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .InnerJoin().On(left => left.NodeId, right => right.NodeId) - .LeftJoin().On(left => left.ContentTypeId, right => right.ContentTypeId) - .LeftJoin().On(left => left.DataTypeId, right => right.DataTypeId) - .LeftJoin().On(left => left.PropertyTypeId, right => right.Id) - .Append("AND cmsPropertyData.versionId = cmsContentVersion.VersionId") + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; + + //var sql = new Sql(); + + //if (isCount) + //{ + // sql.Select("COUNT(*)") + // .From() + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .InnerJoin().On(left => left.NodeId, right => right.ContentTypeId) + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .Where(x => x.NodeObjectType == NodeObjectTypeId); + // return sql; + //} + + //sql.Select("umbracoNode.*", "cmsContent.contentType", "cmsContentType.alias AS ContentTypeAlias", "cmsContentVersion.VersionId", + // "cmsContentVersion.VersionDate", "cmsContentVersion.LanguageLocale", "cmsMember.Email", + // "cmsMember.LoginName", "cmsMember.Password", "cmsPropertyData.id AS PropertyDataId", "cmsPropertyData.propertytypeid", + // "cmsPropertyData.dataDate", "cmsPropertyData.dataInt", "cmsPropertyData.dataNtext", "cmsPropertyData.dataNvarchar", + // "cmsPropertyType.id", "cmsPropertyType.Alias", "cmsPropertyType.Description", + // "cmsPropertyType.Name", "cmsPropertyType.mandatory", "cmsPropertyType.validationRegExp", + // "cmsPropertyType.helpText", "cmsPropertyType.sortOrder AS PropertyTypeSortOrder", "cmsPropertyType.propertyTypeGroupId", + // "cmsPropertyType.dataTypeId", "cmsDataType.propertyEditorAlias", "cmsDataType.dbType") + // .From() + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .InnerJoin().On(left => left.NodeId, right => right.ContentTypeId) + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .InnerJoin().On(left => left.NodeId, right => right.NodeId) + // .LeftJoin().On(left => left.ContentTypeId, right => right.ContentTypeId) + // .LeftJoin().On(left => left.DataTypeId, right => right.DataTypeId) + // .LeftJoin().On(left => left.PropertyTypeId, right => right.Id) + // .Append("AND cmsPropertyData.versionId = cmsContentVersion.VersionId") + // .Where(x => x.NodeObjectType == NodeObjectTypeId); + //return sql; } protected override string GetBaseWhereClause() @@ -148,7 +210,7 @@ namespace Umbraco.Core.Persistence.Repositories return "umbracoNode.id = @Id"; } - protected Sql GetSubquery() + protected Sql GetNodeIdQueryWithPropertyData() { var sql = new Sql(); sql.Select("DISTINCT(umbracoNode.id)") @@ -165,16 +227,6 @@ namespace Umbraco.Core.Persistence.Repositories return sql; } - protected Sql GetMemberGroupSubquery() - { - var sql = new Sql(); - sql.Select("DISTINCT(cmsMember2MemberGroup.Member)") - .From() - .InnerJoin().On(left => left.NodeId, right => right.MemberGroup) - .Where(x => x.NodeObjectType == new Guid(Constants.ObjectTypes.MemberGroup)); - return sql; - } - protected override IEnumerable GetDeleteClauses() { var list = new List @@ -432,14 +484,37 @@ namespace Umbraco.Core.Persistence.Repositories public override IMember GetByVersion(Guid versionId) { var sql = GetBaseQuery(false); - sql.Where(x => x.VersionId == versionId); + sql.Where("cmsContentVersion.VersionId = @VersionId", new { VersionId = versionId }); sql.OrderByDescending(x => x.VersionDate); - var dtos = - Database.Fetch( - new PropertyDataRelator().Map, sql); + var dto = Database.Fetch(sql).FirstOrDefault(); - return BuildFromDto(dtos, sql); + if (dto == null) + return null; + + var memberType = _memberTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); + + var factory = new MemberFactory(memberType, NodeObjectTypeId, dto.NodeId); + var media = factory.BuildEntity(dto); + + var properties = GetPropertyCollection(sql, new DocumentDefinition(dto.NodeId, dto.ContentVersionDto.VersionId, media.UpdateDate, media.CreateDate, memberType)); + + media.Properties = properties[dto.NodeId]; + + //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; + + //var sql = GetBaseQuery(false); + //sql.Where(x => x.VersionId == versionId); + //sql.OrderByDescending(x => x.VersionDate); + + //var dtos = + // Database.Fetch( + // new PropertyDataRelator().Map, sql); + + //return BuildFromDto(dtos, sql); } protected override void PerformDeleteVersion(int id, Guid versionId) @@ -512,18 +587,22 @@ namespace Umbraco.Core.Persistence.Repositories var grpQry = new Query().Where(group => group.Name.Equals(groupName)); var memberGroup = _memberGroupRepository.GetByQuery(grpQry).FirstOrDefault(); if (memberGroup == null) return Enumerable.Empty(); + var subQuery = new Sql().Select("Member").From().Where(dto => dto.MemberGroup == memberGroup.Id); var sql = GetBaseQuery(false) + //TODO: This is NOT great!, do an inner join! .Append(new Sql("WHERE umbracoNode.id IN (" + subQuery.SQL + ")", subQuery.Arguments)) .OrderByDescending(x => x.VersionDate) .OrderBy(x => x.SortOrder); + + return ProcessQuery(sql); - var dtos = - Database.Fetch( - new PropertyDataRelator().Map, sql); + //var dtos = + // Database.Fetch( + // new PropertyDataRelator().Map, sql); - return BuildFromDtos(dtos, sql); + //return BuildFromDtos(dtos, sql); } public bool Exists(string username) @@ -539,14 +618,15 @@ namespace Umbraco.Core.Persistence.Repositories public int GetCountByQuery(IQuery query) { - var sqlSubquery = GetSubquery(); - var translator = new SqlTranslator(sqlSubquery, query); - var subquery = translator.Translate(); - //get the COUNT base query - var sql = GetBaseQuery(true) - .Append(new Sql("WHERE umbracoNode.id IN (" + subquery.SQL + ")", subquery.Arguments)); + var sqlWithProps = GetNodeIdQueryWithPropertyData(); + var translator = new SqlTranslator(sqlWithProps, query); + var sql = translator.Translate(); - return Database.ExecuteScalar(sql); + //get the COUNT base query + var fullSql = GetBaseQuery(true) + .Append(new Sql("WHERE umbracoNode.id IN (" + sql.SQL + ")", sql.Arguments)); + + return Database.ExecuteScalar(fullSql); } /// @@ -559,70 +639,132 @@ namespace Umbraco.Core.Persistence.Repositories /// /// /// + /// + /// /// /// /// The query supplied will ONLY work with data specifically on the cmsMember table because we are using PetaPoco paging (SQL paging) /// - public IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, Expression> orderBy) + public IEnumerable GetPagedResultsByQuery(IQuery query, int pageIndex, int pageSize, out int totalRecords, + string orderBy, Direction orderDirection, string filter = "") { if (orderBy == null) throw new ArgumentNullException("orderBy"); - var sql = new Sql(); - sql.Select("*").From(); + // Get base query + var sqlClause = GetBaseQuery(false); - Sql resultQuery; - if (query != null) + if (query == null) query = new Query(); + var translator = new SqlTranslator(sqlClause, query); + var sql = translator.Translate(); + + // Apply filter + if (string.IsNullOrEmpty(filter) == false) { - var translator = new SqlTranslator(sql, query); - resultQuery = translator.Translate(); + //TODO: Maybe other filters? + sql = sql.Where("cmsMember.LoginName LIKE @0", "%" + filter + "%"); + } + + // Apply order according to parameters + if (string.IsNullOrEmpty(orderBy) == false) + { + var orderByParams = new[] { GetDatabaseFieldNameForOrderBy( orderBy) }; + if (orderDirection == Direction.Ascending) + { + sql = sql.OrderBy(orderByParams); + } + else + { + sql = sql.OrderByDescending(orderByParams); + } + } + + // Note we can't do multi-page for several DTOs like we can multi-fetch and are doing in PerformGetByQuery, + // but actually given we are doing a Get on each one (again as in PerformGetByQuery), we only need the node Id. + // So we'll modify the SQL. + var modifiedSQL = sql.SQL.Replace("SELECT *", "SELECT cmsMember.nodeId"); + + // Get page of results and total count + IEnumerable result; + var pagedResult = Database.Page(pageIndex + 1, pageSize, modifiedSQL, sql.Arguments); + totalRecords = Convert.ToInt32(pagedResult.TotalItems); + if (totalRecords > 0) + { + // Parse out node Ids and load content (we need the cast here in order to be able to call the IQueryable extension + // methods OrderBy or OrderByDescending) + var content = GetAll(pagedResult.Items + .DistinctBy(x => x.NodeId) + .Select(x => x.NodeId).ToArray()) + .Cast() + .AsQueryable(); + + // Now we need to ensure this result is also ordered by the same order by clause + var orderByProperty = GetEntityPropertyNameForOrderBy(orderBy); + if (orderDirection == Direction.Ascending) + { + result = content.OrderBy(orderByProperty); + } + else + { + result = content.OrderByDescending(orderByProperty); + } } else { - resultQuery = sql; + result = Enumerable.Empty(); } - - //get the referenced column name - var expressionMember = ExpressionHelper.GetMemberInfo(orderBy); - //now find the mapped column name - var mapper = MappingResolver.Current.ResolveMapperByType(typeof(IMember)); - var mappedField = mapper.Map(expressionMember.Name); - if (mappedField.IsNullOrWhiteSpace()) - { - throw new ArgumentException("Could not find a mapping for the column specified in the orderBy clause"); - } - //need to ensure the order by is in brackets, see: https://github.com/toptensoftware/PetaPoco/issues/177 - resultQuery.OrderBy(string.Format("({0})", mappedField)); - - var result = GetPagedResultsByQuery(resultQuery, pageIndex, pageSize, out totalRecords, - dtos => dtos.Select(x => x.NodeId).ToArray()); - - //now we need to ensure this result is also ordered by the same order by clause - return result.OrderBy(orderBy.Compile()); + + return result; } - public IEnumerable GetPagedResultsByQuery( - Sql sql, int pageIndex, int pageSize, out int totalRecords, - Func, int[]> resolveIds) - { - //If a max size is passed in, just do a normal get all! - if (pageSize == int.MaxValue) - { - var result = GetAll().ToArray(); - totalRecords = result.Count(); - return result; - } + //public IEnumerable GetPagedResultsByQuery( + // Sql sql, int pageIndex, int pageSize, out int totalRecords, + // Func, int[]> resolveIds) + //{ + // ////If a max size is passed in, just do a normal get all! + // //if (pageSize == int.MaxValue) + // //{ + // // var result = GetAll().ToArray(); + // // totalRecords = result.Count(); + // // return result; + // //} - var pagedResult = Database.Page(pageIndex + 1, pageSize, sql); + // //// Get base query + // //var sqlClause = GetBaseQuery(false); + // //var translator = new SqlTranslator(sqlClause, query); + // //var sql = translator.Translate() + // // .Where(x => x.Newest); - totalRecords = Convert.ToInt32(pagedResult.TotalItems); + // //// Apply filter + // //if (!string.IsNullOrEmpty(filter)) + // //{ + // // sql = sql.Where("cmsDocument.text LIKE @0", "%" + filter + "%"); + // //} - //now that we have the member dto's we need to construct true members from the list. - if (totalRecords == 0) - { - return Enumerable.Empty(); - } - return GetAll(resolveIds(pagedResult.Items)).ToArray(); - } + // //// Apply order according to parameters + // //if (!string.IsNullOrEmpty(orderBy)) + // //{ + // // var orderByParams = new[] { GetDatabaseFieldNameForOrderBy(orderBy) }; + // // if (orderDirection == Direction.Ascending) + // // { + // // sql = sql.OrderBy(orderByParams); + // // } + // // else + // // { + // // sql = sql.OrderByDescending(orderByParams); + // // } + // //} + + // var pagedResult = Database.Page(pageIndex + 1, pageSize, sql); + + // totalRecords = Convert.ToInt32(pagedResult.TotalItems); + + // //now that we have the member dto's we need to construct true members from the list. + // if (totalRecords == 0) + // { + // return Enumerable.Empty(); + // } + // return GetAll(resolveIds(pagedResult.Items)).ToArray(); + //} public void AddOrUpdateContentXml(IMember content, Func xml) { @@ -640,55 +782,155 @@ namespace Umbraco.Core.Persistence.Repositories _contentPreviewRepository.AddOrUpdate(new ContentPreviewEntity(previewExists, content, xml)); } - private IMember BuildFromDto(List dtos, Sql docSql) + protected override string GetDatabaseFieldNameForOrderBy(string orderBy) { - if (dtos == null || dtos.Any() == false) - return null; - var dto = dtos.First(); + //Some custom ones + switch (orderBy.ToUpperInvariant()) + { + case "EMAIL": + return "cmsMember.Email"; + case "LOGINNAME": + return "cmsMember.LoginName"; + } - var memberTypes = new Dictionary - { - { - dto.ContentTypeAlias, - _memberTypeRepository.Get(dto.ContentTypeId) - } - }; + return base.GetDatabaseFieldNameForOrderBy(orderBy); + } - var factory = new MemberReadOnlyFactory(memberTypes); + protected override string GetEntityPropertyNameForOrderBy(string orderBy) + { + //Some custom ones + switch (orderBy.ToUpperInvariant()) + { + case "LOGINNAME": + return "Username"; + } + + return base.GetEntityPropertyNameForOrderBy(orderBy); + } + + 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 = _memberTypeRepository.GetAll(dtos.Select(x => x.ContentVersionDto.ContentDto.ContentTypeId).ToArray()) + .ToArray(); + + //Go get the property data for each document + var docDefs = dtos.Select(dto => new DocumentDefinition( + dto.NodeId, + dto.ContentVersionDto.VersionId, + dto.ContentVersionDto.VersionDate, + dto.ContentVersionDto.ContentDto.NodeDto.CreateDate, + contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId))) + .ToArray(); + + var propertyData = GetPropertyCollection(sql, docDefs); + + return dtos.Select(dto => CreateMemberFromDto( + dto, + contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId), + propertyData[dto.NodeId])); + } + + /// + /// Private method to create a member object from a MemberDto + /// + /// + /// + /// + /// + private IMember CreateMemberFromDto(MemberDto dto, + IMemberType contentType, + PropertyCollection propCollection) + { + var factory = new MemberFactory(contentType, NodeObjectTypeId, dto.ContentVersionDto.NodeId); var member = factory.BuildEntity(dto); - var properties = GetPropertyCollection(docSql, new DocumentDefinition(dto.NodeId, dto.VersionId, dto.UpdateDate, dto.CreateDate, member.ContentType)); - - member.Properties = properties[dto.NodeId]; + member.Properties = propCollection; + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + ((Entity)member).ResetDirtyProperties(false); return member; } - private IEnumerable BuildFromDtos(List dtos, Sql docSql) + /// + /// Private method to create a member object from a MemberDto + /// + /// + /// + /// + /// + private IMember CreateMemberFromDto(MemberDto dto, Guid versionId, Sql docSql) { - if (dtos == null || dtos.Any() == false) - return Enumerable.Empty(); + var memberType = _memberTypeRepository.Get(dto.ContentVersionDto.ContentDto.ContentTypeId); - //We assume that there won't exist a lot of MemberTypes, so the following should be fairly fast - var memberTypes = new Dictionary(); - - //TODO: We should do an SQL 'IN' here - var memberTypeList = _memberTypeRepository.GetAll(); - memberTypeList.ForEach(x => memberTypes.Add(x.Alias, x)); + var factory = new MemberFactory(memberType, NodeObjectTypeId, dto.ContentVersionDto.NodeId); + var member = factory.BuildEntity(dto); - var entities = new List(); - var factory = new MemberReadOnlyFactory(memberTypes); - foreach (var dto in dtos) - { - var entity = factory.BuildEntity(dto); + var docDef = new DocumentDefinition(dto.ContentVersionDto.NodeId, versionId, member.UpdateDate, member.CreateDate, memberType); - var properties = GetPropertyCollection(docSql,new DocumentDefinition(dto.NodeId, dto.VersionId, dto.UpdateDate, dto.CreateDate, entity.ContentType)); + var properties = GetPropertyCollection(docSql, docDef); - entity.Properties = properties[dto.NodeId]; - - entities.Add(entity); - } - return entities; + member.Properties = properties[dto.ContentVersionDto.NodeId]; + + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + ((Entity)member).ResetDirtyProperties(false); + return member; } + + //private IMember BuildFromDto(List dtos, Sql docSql) + //{ + // if (dtos == null || dtos.Any() == false) + // return null; + // var dto = dtos.First(); + + // var memberTypes = new Dictionary + // { + // { + // dto.ContentTypeAlias, + // _memberTypeRepository.Get(dto.ContentTypeId) + // } + // }; + + // var factory = new MemberReadOnlyFactory(memberTypes); + // var member = factory.BuildEntity(dto); + + // var properties = GetPropertyCollection(docSql, new DocumentDefinition(dto.NodeId, dto.VersionId, dto.UpdateDate, dto.CreateDate, member.ContentType)); + + // member.Properties = properties[dto.NodeId]; + + // return member; + //} + + //private IEnumerable BuildFromDtos(List dtos, Sql docSql) + //{ + // if (dtos == null || dtos.Any() == false) + // return Enumerable.Empty(); + + // //We assume that there won't exist a lot of MemberTypes, so the following should be fairly fast + // var memberTypes = new Dictionary(); + + // //TODO: We should do an SQL 'IN' here + // var memberTypeList = _memberTypeRepository.GetAll(); + // memberTypeList.ForEach(x => memberTypes.Add(x.Alias, x)); + + // var entities = new List(); + // var factory = new MemberReadOnlyFactory(memberTypes); + // foreach (var dto in dtos) + // { + // var entity = factory.BuildEntity(dto); + + // var properties = GetPropertyCollection(docSql,new DocumentDefinition(dto.NodeId, dto.VersionId, dto.UpdateDate, dto.CreateDate, entity.ContentType)); + + // entity.Properties = properties[dto.NodeId]; + + // entities.Add(entity); + // } + // return entities; + //} } } diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 4aaa4b1f0e..72a54a337f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -218,7 +218,7 @@ namespace Umbraco.Core.Persistence.Repositories } } } - + protected IDictionary GetPropertyCollection( Sql docSql, params DocumentDefinition[] documentDefs) @@ -340,7 +340,7 @@ ON cmsPropertyType.contentTypeId = docData.contentType", docSql.Arguments); switch (orderBy.ToUpperInvariant()) { case "NAME": - return "cmsDocument.text"; + return "umbracoNode.text"; case "OWNER": //TODO: This isn't going to work very nicely because it's going to order by ID, not by letter return "umbracoNode.nodeUser"; diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index fe587ba8cf..33e1b73628 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -477,22 +477,22 @@ namespace Umbraco.Core.Services /// Gets a collection of objects by Parent Id /// /// Id of the Parent to retrieve Children from - /// Page number + /// Page index (zero based) /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - public IEnumerable GetPagedChildren(int id, int pageNumber, int pageSize, out int totalChildren, + public IEnumerable GetPagedChildren(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy, Direction orderDirection, string filter = "") { - Mandate.ParameterCondition(pageNumber > 0, "pageSize"); + Mandate.ParameterCondition(pageIndex > 0, "pageSize"); Mandate.ParameterCondition(pageSize > 0, "pageSize"); using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ParentId == id); - var contents = repository.GetPagedResultsByQuery(query, pageNumber, pageSize, out totalChildren, orderBy, orderDirection, filter); + var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter); return contents; } diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index a2e44578a8..3cfd97d32e 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -113,14 +113,14 @@ namespace Umbraco.Core.Services /// Gets a collection of objects by Parent Id /// /// Id of the Parent to retrieve Children from - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - IEnumerable GetPagedChildren(int id, int pageNumber, int pageSize, out int totalChildren, + IEnumerable GetPagedChildren(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy, Direction orderDirection, string filter = ""); /// diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs index 9916b77905..aa7d5c49e6 100644 --- a/src/Umbraco.Core/Services/IMediaService.cs +++ b/src/Umbraco.Core/Services/IMediaService.cs @@ -66,14 +66,14 @@ namespace Umbraco.Core.Services /// Gets a collection of objects by Parent Id /// /// Id of the Parent to retrieve Children from - /// Page number + /// Page number /// Page size /// Total records query would return without paging /// Field to order by /// Direction to order by /// Search text filter /// An Enumerable list of objects - IEnumerable GetPagedChildren(int id, int pageNumber, int pageSize, out int totalChildren, + IEnumerable GetPagedChildren(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy, Direction orderDirection, string filter = ""); /// diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 0ea3a5867a..7859b9feae 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -394,22 +394,22 @@ namespace Umbraco.Core.Services /// Gets a collection of objects by Parent Id /// /// Id of the Parent to retrieve Children from - /// Page number + /// Page index (zero based) /// Page size - /// Total records query would return without paging + /// Total records query would return without paging /// Field to order by - /// Direction to order by + /// Direction to order by /// Search text filter /// An Enumerable list of objects - public IEnumerable GetPagedChildren(int id, int pageNumber, int pageSize, out int totalChildren, + public IEnumerable GetPagedChildren(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy, Direction orderDirection, string filter = "") { - Mandate.ParameterCondition(pageNumber > 0, "pageSize"); + Mandate.ParameterCondition(pageIndex > 0, "pageSize"); Mandate.ParameterCondition(pageSize > 0, "pageSize"); using (var repository = _repositoryFactory.CreateMediaRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ParentId == id); - var medias = repository.GetPagedResultsByQuery(query, pageNumber, pageSize, out totalChildren, orderBy, orderDirection, filter); + var medias = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter); return medias; } diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 21a063935f..d247a4564d 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -9,6 +9,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; @@ -283,39 +284,30 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - var sql = new Sql() - .Select("*") - .From() - .Where(dto => dto.NodeObjectType == new Guid(Constants.ObjectTypes.Member)); + var query = new Query(); switch (matchType) { case StringPropertyMatchType.Exact: - sql.Where(dto => dto.Text.Equals(displayNameToMatch)); + query.Where(member => member.Name.Equals(displayNameToMatch)); break; case StringPropertyMatchType.Contains: - sql.Where(dto => dto.Text.Contains(displayNameToMatch)); + query.Where(member => member.Email.Contains(displayNameToMatch)); break; case StringPropertyMatchType.StartsWith: - sql.Where(dto => dto.Text.StartsWith(displayNameToMatch)); + query.Where(member => member.Email.StartsWith(displayNameToMatch)); break; case StringPropertyMatchType.EndsWith: - sql.Where(dto => dto.Text.EndsWith(displayNameToMatch)); + query.Where(member => member.Email.EndsWith(displayNameToMatch)); break; case StringPropertyMatchType.Wildcard: - sql.Where(dto => dto.Text.SqlWildcard(displayNameToMatch, TextColumnType.NVarchar)); + query.Where(member => member.Email.SqlWildcard(displayNameToMatch, TextColumnType.NVarchar)); break; default: throw new ArgumentOutOfRangeException("matchType"); } - sql.OrderBy(dto => dto.Text); - - var result = repository.GetPagedResultsByQuery(sql, pageIndex, pageSize, out totalRecords, - dtos => dtos.Select(x => x.NodeId).ToArray()); - - //ensure this result is sorted correct just in case - return result.OrderBy(x => x.Name); + return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Name", Direction.Ascending); } } @@ -356,7 +348,7 @@ namespace Umbraco.Core.Services throw new ArgumentOutOfRangeException("matchType"); } - return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, dto => dto.Email); + return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Email", Direction.Ascending); } } @@ -397,7 +389,7 @@ namespace Umbraco.Core.Services throw new ArgumentOutOfRangeException("matchType"); } - return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, dto => dto.Username); + return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending); } } @@ -477,35 +469,35 @@ namespace Umbraco.Core.Services Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && - ((Member)x).IntegerropertyValue == value); + ((Member)x).IntegerPropertyValue == value); break; case ValuePropertyMatchType.GreaterThan: query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && - ((Member)x).IntegerropertyValue > value); + ((Member)x).IntegerPropertyValue > value); break; case ValuePropertyMatchType.LessThan: query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && - ((Member)x).IntegerropertyValue < value); + ((Member)x).IntegerPropertyValue < value); break; case ValuePropertyMatchType.GreaterThanOrEqualTo: query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && - ((Member)x).IntegerropertyValue >= value); + ((Member)x).IntegerPropertyValue >= value); break; case ValuePropertyMatchType.LessThanOrEqualTo: query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && - ((Member)x).IntegerropertyValue <= value); + ((Member)x).IntegerPropertyValue <= value); break; default: throw new ArgumentOutOfRangeException("matchType"); @@ -591,6 +583,7 @@ namespace Umbraco.Core.Services throw new ArgumentOutOfRangeException("matchType"); } + //TODO: Since this is by property value, we need a GetByPropertyQuery on the repo! var members = repository.GetByQuery(query); return members; } @@ -662,7 +655,7 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, member => member.Username); + return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending); } } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 3a55e61b0f..6cdc192c63 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -375,7 +375,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -396,7 +396,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 2, 1, out totalRecords, "Name", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -417,7 +417,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 2, out totalRecords, "Name", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -438,7 +438,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Descending); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Descending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -459,7 +459,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending, "Page 2"); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, "Page 2"); // Assert Assert.That(totalRecords, Is.EqualTo(1)); @@ -480,7 +480,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending, "Page"); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, "Page"); // Assert Assert.That(totalRecords, Is.EqualTo(2)); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index bd61eea4c7..26cc919c5c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -262,7 +262,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -283,7 +283,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 2, 1, out totalRecords, "SortOrder", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -304,7 +304,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 2, out totalRecords, "SortOrder", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "SortOrder", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -325,7 +325,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Descending); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Descending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -346,7 +346,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending); // Assert Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2)); @@ -367,7 +367,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending, "File"); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, "File"); // Assert Assert.That(totalRecords, Is.EqualTo(1)); @@ -388,7 +388,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act var query = Query.Builder.Where(x => x.Level == 2); int totalRecords; - var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending, "Test"); + var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, "Test"); // Assert Assert.That(totalRecords, Is.EqualTo(2)); diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 87a7340169..19b3fe82d4 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -161,7 +161,7 @@ namespace Umbraco.Web.Editors IContent[] children; if (pageNumber > 0 && pageSize > 0) { - children = Services.ContentService.GetPagedChildren(id, pageNumber, pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray(); + children = Services.ContentService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray(); } else { diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 84eedb000c..cc8c506e08 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -142,7 +142,7 @@ namespace Umbraco.Web.Editors IMedia[] children; if (pageNumber > 0 && pageSize > 0) { - children = Services.MediaService.GetPagedChildren(id, pageNumber, pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray(); + children = Services.MediaService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray(); } else {