diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
index 7d3557a81d..5c66f2a19c 100644
--- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs
@@ -234,6 +234,7 @@ namespace Umbraco.Core.Persistence.Repositories
var processed = 0;
do
{
+ var descendants = GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending, true);
//NOTE: This is an important call, we cannot simply make a call to:
// GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending);
// because that method is used to query 'latest' content items where in this case we don't necessarily
@@ -766,10 +767,11 @@ namespace Umbraco.Core.Persistence.Repositories
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField, string filter = "")
{
//NOTE: This uses the GetBaseQuery method but that does not take into account the required 'newest' field which is
@@ -788,7 +790,7 @@ namespace Umbraco.Core.Persistence.Repositories
return GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords,
new Tuple("cmsDocument", "nodeId"),
- ProcessQuery, orderBy, orderDirection,
+ ProcessQuery, orderBy, orderDirection, orderBySystemField,
filterCallback);
}
diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs
index 9d3fcbb40b..ab176df6d0 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IContentRepository.cs
@@ -84,9 +84,10 @@ namespace Umbraco.Core.Persistence.Repositories
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "");
+ string orderBy, Direction orderDirection, bool orderBySystemField, 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 46bce6a03c..a2be89b32a 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaRepository.cs
@@ -33,9 +33,10 @@ namespace Umbraco.Core.Persistence.Repositories
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "");
+ string orderBy, Direction orderDirection, bool orderBySystemField, 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 9cb74d1806..a24116f0e2 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs
@@ -44,16 +44,17 @@ namespace Umbraco.Core.Persistence.Repositories
///
/// Gets paged member results
///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
+ /// The query.
+ /// Index of the page.
+ /// Size of the page.
+ /// The total records.
+ /// The order by column
+ /// The order direction.
+ /// Flag to indicate when ordering by system field
+ /// Search query
///
IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "");
+ string orderBy, Direction orderDirection, bool orderBySystemField, string filter = "");
//IEnumerable GetPagedResultsByQuery(
// Sql sql, int pageIndex, int pageSize, out int totalRecords,
diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs
index 162ad88ca0..cb427cd77c 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs
@@ -232,7 +232,7 @@ namespace Umbraco.Core.Persistence.Repositories
var processed = 0;
do
{
- var descendants = GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending);
+ var descendants = GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending, true);
var xmlItems = (from descendant in descendants
let xml = serializer(descendant)
@@ -442,10 +442,11 @@ namespace Umbraco.Core.Persistence.Repositories
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField, string filter = "")
{
var args = new List();
var sbWhere = new StringBuilder();
@@ -459,7 +460,7 @@ namespace Umbraco.Core.Persistence.Repositories
return GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords,
new Tuple("cmsContentVersion", "contentId"),
- ProcessQuery, orderBy, orderDirection,
+ ProcessQuery, orderBy, orderDirection, orderBySystemField,
filterCallback);
}
diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
index ac5529b523..4d7cf4b22f 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
@@ -447,7 +447,7 @@ namespace Umbraco.Core.Persistence.Repositories
var processed = 0;
do
{
- var descendants = GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending);
+ var descendants = GetPagedResultsByQuery(query, pageIndex, pageSize, out total, "Path", Direction.Ascending, true);
var xmlItems = (from descendant in descendants
let xml = serializer(descendant)
@@ -603,18 +603,19 @@ namespace Umbraco.Core.Persistence.Repositories
///
/// The where clause, if this is null all records are queried
///
- ///
- ///
- ///
- ///
- ///
- ///
+ /// Index of the page.
+ /// Size of the page.
+ /// The total records.
+ /// The order by column
+ /// The order direction.
+ /// Flag to indicate when ordering by system field
+ /// Search query
///
///
/// 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, long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField, string filter = "")
{
var args = new List();
var sbWhere = new StringBuilder();
@@ -629,7 +630,7 @@ namespace Umbraco.Core.Persistence.Repositories
return GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords,
new Tuple("cmsMember", "nodeId"),
- ProcessQuery, orderBy, orderDirection,
+ ProcessQuery, orderBy, orderDirection, orderBySystemField,
filterCallback);
}
diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
index 56b0b63ad5..50078a1327 100644
--- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs
@@ -25,6 +25,8 @@ using Umbraco.Core.IO;
namespace Umbraco.Core.Persistence.Repositories
{
+ using SqlSyntax;
+
internal abstract class VersionableRepositoryBase : PetaPocoRepositoryBase
where TEntity : class, IAggregateRoot
{
@@ -244,24 +246,59 @@ namespace Umbraco.Core.Persistence.Repositories
return filteredSql;
}
- private Sql GetSortedSqlForPagedResults(Sql sql, Direction orderDirection, string orderBy)
+ private Sql GetSortedSqlForPagedResults(Sql sql, Direction orderDirection, string orderBy, bool orderBySystemField)
{
//copy to var so that the original isn't changed
var sortedSql = new Sql(sql.SQL, sql.Arguments);
- // Apply order according to parameters
- if (string.IsNullOrEmpty(orderBy) == false)
+
+ if (orderBySystemField)
{
- var orderByParams = new[] { GetDatabaseFieldNameForOrderBy(orderBy) };
- if (orderDirection == Direction.Ascending)
+ // Apply order according to parameters
+ if (string.IsNullOrEmpty(orderBy) == false)
{
- sortedSql.OrderBy(orderByParams);
+ var orderByParams = new[] { GetDatabaseFieldNameForOrderBy(orderBy) };
+ if (orderDirection == Direction.Ascending)
+ {
+ sortedSql.OrderBy(orderByParams);
+ }
+ else
+ {
+ sortedSql.OrderByDescending(orderByParams);
+ }
}
- else
- {
- sortedSql.OrderByDescending(orderByParams);
- }
- return sortedSql;
}
+ else
+ {
+ // Sorting by a custom field, so set-up sub-query for ORDER BY clause to pull through valie
+ // from most recent content version for the given order by field
+ var sortedInt = string.Format(SqlSyntaxContext.SqlSyntaxProvider.ConvertIntegerToOrderableString, "dataInt");
+ var sortedDate = string.Format(SqlSyntaxContext.SqlSyntaxProvider.ConvertDateToOrderableString, "dataDate");
+ var sortedString = string.Format(SqlSyntaxContext.SqlSyntaxProvider.IsNull, "dataNvarchar", "''");
+
+ var orderBySql = string.Format(@"ORDER BY (
+ SELECT CASE
+ WHEN dataInt Is Not Null THEN {0}
+ WHEN dataDate Is Not Null THEN {1}
+ ELSE {2}
+ END
+ FROM cmsContent c
+ INNER JOIN cmsContentVersion cv ON cv.ContentId = c.nodeId AND VersionDate = (
+ SELECT Max(VersionDate)
+ FROM cmsContentVersion
+ WHERE ContentId = c.nodeId
+ )
+ INNER JOIN cmsPropertyData cpd ON cpd.contentNodeId = c.nodeId
+ AND cpd.versionId = cv.VersionId
+ INNER JOIN cmsPropertyType cpt ON cpt.Id = cpd.propertytypeId
+ WHERE c.nodeId = umbracoNode.Id and cpt.Alias = @0)", sortedInt, sortedDate, sortedString);
+
+ sortedSql.Append(orderBySql, orderBy);
+ if (orderDirection == Direction.Descending)
+ {
+ sortedSql.Append(" DESC");
+ }
+ }
+
return sortedSql;
}
@@ -279,6 +316,7 @@ namespace Umbraco.Core.Persistence.Repositories
/// A callback to process the query result
/// The order by column
/// The order direction.
+ /// Flag to indicate when ordering by system field
///
/// orderBy
protected IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords,
@@ -286,6 +324,7 @@ namespace Umbraco.Core.Persistence.Repositories
Func> processQuery,
string orderBy,
Direction orderDirection,
+ bool orderBySystemField,
Func> defaultFilter = null)
where TContentBase : class, IAggregateRoot, TEntity
{
@@ -308,7 +347,7 @@ namespace Umbraco.Core.Persistence.Repositories
//get sorted and filtered sql
var sqlNodeIdsWithSort = GetSortedSqlForPagedResults(
GetFilteredSqlForPagedResults(sqlNodeIds, defaultFilter),
- orderDirection, orderBy);
+ orderDirection, orderBy, orderBySystemField);
// Get page of results and total count
IEnumerable result;
@@ -346,22 +385,9 @@ namespace Umbraco.Core.Persistence.Repositories
//get sorted and filtered sql
var fullQuery = GetSortedSqlForPagedResults(
GetFilteredSqlForPagedResults(withInnerJoinSql, defaultFilter),
- orderDirection, orderBy);
-
- var content = processQuery(fullQuery)
- .Cast()
- .AsQueryable();
+ orderDirection, orderBy, orderBySystemField);
- // 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);
- }
+ return processQuery(fullQuery);
}
else
{
@@ -521,6 +547,10 @@ WHERE EXISTS(
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";
+
+ // Members only
+ case "USERNAME":
+ return "cmsMember.LoginName";
default:
//ensure invalid SQL cannot be submitted
return Regex.Replace(orderBy, @"[^\w\.,`\[\]@-]", "");
diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs
index 056d9c1d9a..e663c8e64b 100644
--- a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs
+++ b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs
@@ -70,6 +70,10 @@ namespace Umbraco.Core.Persistence.SqlSyntax
bool SupportsIdentityInsert();
bool? SupportsCaseInsensitiveQueries(Database db);
+ string IsNull { get; }
+ string ConvertIntegerToOrderableString { get; }
+ string ConvertDateToOrderableString { get; }
+
IEnumerable GetTablesInSchema(Database db);
IEnumerable GetColumnsInSchema(Database db);
IEnumerable> GetConstraintsPerTable(Database db);
diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs
index c18a5f8477..c201dd8c02 100644
--- a/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs
+++ b/src/Umbraco.Core/Persistence/SqlSyntax/MySqlSyntaxProvider.cs
@@ -361,6 +361,10 @@ ORDER BY TABLE_NAME, INDEX_NAME",
public override string RenameColumn { get { return "ALTER TABLE {0} CHANGE {1} {2}"; } }
+ public override string IsNull { get { return "IFNULL({0},{1})"; } }
+ public override string ConvertIntegerToOrderableString { get { return "LPAD({0}, 8, '0')"; } }
+ public override string ConvertDateToOrderableString { get { return "DATE_FORMAT({0}, '%Y%m%d')"; } }
+
public override bool? SupportsCaseInsensitiveQueries(Database db)
{
bool? supportsCaseInsensitiveQueries = null;
diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs
index c2b81aa753..cacfa855a3 100644
--- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs
+++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs
@@ -536,5 +536,9 @@ namespace Umbraco.Core.Persistence.SqlSyntax
public virtual string CreateConstraint { get { return "ALTER TABLE {0} ADD CONSTRAINT {1} {2} ({3})"; } }
public virtual string DeleteConstraint { get { return "ALTER TABLE {0} DROP CONSTRAINT {1}"; } }
public virtual string CreateForeignKeyConstraint { get { return "ALTER TABLE {0} ADD CONSTRAINT {1} FOREIGN KEY ({2}) REFERENCES {3} ({4}){5}{6}"; } }
+
+ public virtual string IsNull { get { return "ISNULL({0},{1})"; } }
+ public virtual string ConvertIntegerToOrderableString { get { return "RIGHT('00000000' + CAST({0} AS varchar(8)),8)"; } }
+ public virtual string ConvertDateToOrderableString { get { return "CONVERT(varchar, {0}, 102)"; } }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs
index e7298a5c6e..ed9dab8e29 100644
--- a/src/Umbraco.Core/Services/ContentService.cs
+++ b/src/Umbraco.Core/Services/ContentService.cs
@@ -514,10 +514,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedChildren(int id, long pageIndex, int pageSize, out long totalChildren,
- string orderBy, Direction orderDirection, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField = true, string filter = "")
{
Mandate.ParameterCondition(pageIndex >= 0, "pageIndex");
Mandate.ParameterCondition(pageSize > 0, "pageSize");
@@ -530,7 +531,7 @@ namespace Umbraco.Core.Services
{
query.Where(x => x.ParentId == id);
}
- var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter);
+ var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter);
return contents;
}
@@ -567,9 +568,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalChildren, string orderBy = "Path", Direction orderDirection = Direction.Ascending, string filter = "")
+ public IEnumerable GetPagedDescendants(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy = "Path", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "")
{
Mandate.ParameterCondition(pageIndex >= 0, "pageIndex");
Mandate.ParameterCondition(pageSize > 0, "pageSize");
@@ -582,7 +585,7 @@ namespace Umbraco.Core.Services
{
query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar));
}
- var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter);
+ var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter);
return contents;
}
diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs
index c686cf4891..8f90e8a779 100644
--- a/src/Umbraco.Core/Services/IContentService.cs
+++ b/src/Umbraco.Core/Services/IContentService.cs
@@ -214,10 +214,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedChildren(int id, long pageIndex, int pageSize, out long totalRecords,
- string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, string filter = "");
+ string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "");
[Obsolete("Use the overload with 'long' parameter types instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
@@ -233,10 +234,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalRecords,
- string orderBy = "Path", Direction orderDirection = Direction.Ascending, string filter = "");
+ string orderBy = "Path", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "");
///
/// Gets a collection of an objects versions by its Id
diff --git a/src/Umbraco.Core/Services/IMediaService.cs b/src/Umbraco.Core/Services/IMediaService.cs
index d104b95ddc..c97da39b21 100644
--- a/src/Umbraco.Core/Services/IMediaService.cs
+++ b/src/Umbraco.Core/Services/IMediaService.cs
@@ -132,10 +132,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedChildren(int id, long pageIndex, int pageSize, out long totalRecords,
- string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, string filter = "");
+ string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "");
[Obsolete("Use the overload with 'long' parameter types instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
@@ -151,10 +152,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalRecords,
- string orderBy = "Path", Direction orderDirection = Direction.Ascending, string filter = "");
+ string orderBy = "Path", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "");
///
/// Gets descendants of a object by its Id
diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs
index 20eef54b3c..62d6c3250e 100644
--- a/src/Umbraco.Core/Services/IMemberService.cs
+++ b/src/Umbraco.Core/Services/IMemberService.cs
@@ -34,13 +34,14 @@ namespace Umbraco.Core.Services
/// Current page index
/// Size of the page
/// Total number of records found (out)
- ///
- ///
+ /// Field to order by
+ /// Direction to order by
+ /// Flag to indicate when ordering by system field
///
- ///
+ /// Search text filter
///
IEnumerable GetAll(long pageIndex, int pageSize, out long totalRecords,
- string orderBy, Direction orderDirection, string memberTypeAlias = null, string filter = "");
+ string orderBy, Direction orderDirection, bool orderBySystemField = true, string memberTypeAlias = null, string filter = "");
///
/// Creates an object without persisting it
diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs
index accbebfe0b..b60a66451e 100644
--- a/src/Umbraco.Core/Services/MediaService.cs
+++ b/src/Umbraco.Core/Services/MediaService.cs
@@ -421,10 +421,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedChildren(int id, long pageIndex, int pageSize, out long totalChildren,
- string orderBy, Direction orderDirection, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField = true, string filter = "")
{
Mandate.ParameterCondition(pageIndex >= 0, "pageIndex");
Mandate.ParameterCondition(pageSize > 0, "pageSize");
@@ -433,7 +434,7 @@ namespace Umbraco.Core.Services
var query = Query.Builder;
query.Where(x => x.ParentId == id);
- var medias = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter);
+ var medias = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter);
return medias;
}
@@ -470,9 +471,11 @@ namespace Umbraco.Core.Services
/// Total records query would return without paging
/// Field to order by
/// Direction to order by
+ /// Flag to indicate when ordering by system field
/// Search text filter
/// An Enumerable list of objects
public IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalChildren, string orderBy = "Path", Direction orderDirection = Direction.Ascending, string filter = "")
+ public IEnumerable GetPagedDescendants(int id, int pageIndex, int pageSize, out int totalChildren, string orderBy = "Path", Direction orderDirection = Direction.Ascending, bool orderBySystemField = true, string filter = "")
{
Mandate.ParameterCondition(pageIndex >= 0, "pageIndex");
Mandate.ParameterCondition(pageSize > 0, "pageSize");
@@ -485,7 +488,7 @@ namespace Umbraco.Core.Services
{
query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar));
}
- var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, filter);
+ var contents = repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter);
return contents;
}
diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs
index 4f0647dbf7..db3bfbbd61 100644
--- a/src/Umbraco.Core/Services/MemberService.cs
+++ b/src/Umbraco.Core/Services/MemberService.cs
@@ -289,7 +289,7 @@ namespace Umbraco.Core.Services
throw new ArgumentOutOfRangeException("matchType");
}
- return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Name", Direction.Ascending);
+ return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Name", Direction.Ascending, true);
}
}
@@ -340,7 +340,7 @@ namespace Umbraco.Core.Services
throw new ArgumentOutOfRangeException("matchType");
}
- return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Email", Direction.Ascending);
+ return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "Email", Direction.Ascending, true);
}
}
@@ -391,7 +391,7 @@ namespace Umbraco.Core.Services
throw new ArgumentOutOfRangeException("matchType");
}
- return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending);
+ return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending, true);
}
}
@@ -688,14 +688,14 @@ namespace Umbraco.Core.Services
var uow = UowProvider.GetUnitOfWork();
using (var repository = RepositoryFactory.CreateMemberRepository(uow))
{
- return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending);
+ return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, "LoginName", Direction.Ascending, true);
}
}
[Obsolete("Use the overload with 'long' parameter types instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public IEnumerable GetAll(int pageIndex, int pageSize, out int totalRecords,
- string orderBy, Direction orderDirection, string memberTypeAlias = null, string filter = "")
+ string orderBy, Direction orderDirection, bool orderBySystemField = true, string memberTypeAlias = null, string filter = "")
{
long total;
var result = GetAll(Convert.ToInt64(pageIndex), pageSize, out total, orderBy, orderDirection, memberTypeAlias, filter);
@@ -711,10 +711,10 @@ namespace Umbraco.Core.Services
{
if (memberTypeAlias == null)
{
- return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filter);
+ return repository.GetPagedResultsByQuery(null, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, orderBySystemField, filter);
}
var query = new Query().Where(x => x.ContentTypeAlias == memberTypeAlias);
- return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filter);
+ return repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, orderBySystemField, filter);
}
}
diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
index c8ccecdb95..5d5be7c5ff 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs
@@ -555,7 +555,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -576,7 +576,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "Name", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -597,7 +597,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "Name", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "Name", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -618,7 +618,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Descending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Descending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -639,7 +639,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, "Page 2");
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true, "Page 2");
// Assert
Assert.That(totalRecords, Is.EqualTo(1));
@@ -660,7 +660,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, "Page");
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true, "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 60c49f89cd..fb464e52b1 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs
@@ -319,7 +319,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -340,7 +340,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 1, 1, out totalRecords, "SortOrder", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -361,7 +361,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "SortOrder", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 2, out totalRecords, "SortOrder", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -382,7 +382,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Descending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Descending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -403,7 +403,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending);
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "Name", Direction.Ascending, true);
// Assert
Assert.That(totalRecords, Is.GreaterThanOrEqualTo(2));
@@ -424,7 +424,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, "File");
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true, "File");
// Assert
Assert.That(totalRecords, Is.EqualTo(1));
@@ -445,7 +445,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var query = Query.Builder.Where(x => x.Level == 2);
long totalRecords;
- var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, "Test");
+ var result = repository.GetPagedResultsByQuery(query, 0, 1, out totalRecords, "SortOrder", Direction.Ascending, true, "Test");
// Assert
Assert.That(totalRecords, Is.EqualTo(2));
diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs
index 6c56c76ef7..f0a662b4a6 100644
--- a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs
+++ b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs
@@ -74,7 +74,7 @@ namespace Umbraco.Tests.UmbracoExamine
mediaService = Mock.Of(
x => x.GetPagedDescendants(
- It.IsAny(), It.IsAny(), It.IsAny(), out totalRecs, It.IsAny(), It.IsAny(), It.IsAny())
+ It.IsAny(), It.IsAny(), It.IsAny(), out totalRecs, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())
==
allRecs);
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
index 2cf7127707..9d896180bf 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
@@ -444,7 +444,8 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
pageNumber: 0,
filter: '',
orderDirection: "Ascending",
- orderBy: "SortOrder"
+ orderBy: "SortOrder",
+ orderBySystemField: true
};
if (options === undefined) {
options = {};
@@ -472,6 +473,7 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
{ pageSize: options.pageSize },
{ orderBy: options.orderBy },
{ orderDirection: options.orderDirection },
+ { orderBySystemField: options.orderBySystemField },
{ filter: options.filter }
])),
'Failed to retrieve children for content item ' + parentId);
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
index 9a2310299f..e0d6e97127 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
@@ -305,7 +305,8 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
pageNumber: 0,
filter: '',
orderDirection: "Ascending",
- orderBy: "SortOrder"
+ orderBy: "SortOrder",
+ orderBySystemField: true
};
if (options === undefined) {
options = {};
@@ -333,6 +334,7 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
{ pageSize: options.pageSize },
{ orderBy: options.orderBy },
{ orderDirection: options.orderDirection },
+ { orderBySystemField: options.orderBySystemField },
{ filter: options.filter }
])),
'Failed to retrieve children for media item ' + parentId);
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/member.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/member.resource.js
index 42db4f6366..e8746d9ecc 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/member.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/member.resource.js
@@ -34,7 +34,8 @@ function memberResource($q, $http, umbDataFormatter, umbRequestHelper) {
pageNumber: 1,
filter: '',
orderDirection: "Ascending",
- orderBy: "LoginName"
+ orderBy: "LoginName",
+ orderBySystemField: true
};
if (options === undefined) {
options = {};
@@ -56,6 +57,7 @@ function memberResource($q, $http, umbDataFormatter, umbRequestHelper) {
{ pageSize: options.pageSize },
{ orderBy: options.orderBy },
{ orderDirection: options.orderDirection },
+ { orderBySystemField: options.orderBySystemField },
{ filter: options.filter }
];
if (memberTypeAlias != null) {
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
index 59ea03aa91..c9d31b3a36 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
@@ -150,6 +150,7 @@ function listViewController($rootScope, $scope, $routeParams, $injector, $cookie
layouts: $scope.model.config.layouts,
activeLayout: listViewHelper.getLayout($routeParams.id, $scope.model.config.layouts)
},
+ orderBySystemField: true,
allowBulkPublish: $scope.entityType === 'content' && $scope.model.config.bulkActionPermissions.allowBulkPublish,
allowBulkUnpublish: $scope.entityType === 'content' && $scope.model.config.bulkActionPermissions.allowBulkUnpublish,
allowBulkCopy: $scope.entityType === 'content' && $scope.model.config.bulkActionPermissions.allowBulkCopy,
@@ -160,15 +161,24 @@ function listViewController($rootScope, $scope, $routeParams, $injector, $cookie
//update all of the system includeProperties to enable sorting
_.each($scope.options.includeProperties, function(e, i) {
+ //NOTE: special case for contentTypeAlias, it's a system property that cannot be sorted
+ // to do that, we'd need to update the base query for content to include the content type alias column
+ // which requires another join and would be slower. BUT We are doing this for members so not sure it makes a diff?
+ if (e.alias != "contentTypeAlias") {
+ e.allowSorting = true;
+ }
+
+ // Another special case for lasted edited data/update date for media, again this field isn't available on the base table so we can't sort by it
+ if (e.isSystem && $scope.entityType == "media") {
+ e.allowSorting = e.alias != 'updateDate';
+ }
+
+ // Another special case for members, only fields on the base table (cmsMember) can be used for sorting
+ if (e.isSystem && $scope.entityType == "member") {
+ e.allowSorting = e.alias == 'username' || e.alias == 'email';
+ }
+
if (e.isSystem) {
-
- //NOTE: special case for contentTypeAlias, it's a system property that cannot be sorted
- // to do that, we'd need to update the base query for content to include the content type alias column
- // which requires another join and would be slower. BUT We are doing this for members so not sure it makes a diff?
- if (e.alias != "contentTypeAlias") {
- e.allowSorting = true;
- }
-
//localize the header
var key = getLocalizedKey(e.alias);
localizationService.localize(key).then(function (v) {
diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs
index a65821cfa0..c7ad9b9683 100644
--- a/src/Umbraco.Web/Editors/ContentController.cs
+++ b/src/Umbraco.Web/Editors/ContentController.cs
@@ -184,13 +184,14 @@ namespace Umbraco.Web.Editors
int pageSize = 0,
string orderBy = "SortOrder",
Direction orderDirection = Direction.Ascending,
+ bool orderBySystemField = true,
string filter = "")
{
long totalChildren;
IContent[] children;
if (pageNumber > 0 && pageSize > 0)
{
- children = Services.ContentService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray();
+ children = Services.ContentService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter).ToArray();
}
else
{
diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs
index 9e845e4649..6ec9bcb0f8 100644
--- a/src/Umbraco.Web/Editors/MediaController.cs
+++ b/src/Umbraco.Web/Editors/MediaController.cs
@@ -180,13 +180,14 @@ namespace Umbraco.Web.Editors
int pageSize = 0,
string orderBy = "SortOrder",
Direction orderDirection = Direction.Ascending,
+ bool orderBySystemField = true,
string filter = "")
{
int totalChildren;
IMedia[] children;
if (pageNumber > 0 && pageSize > 0)
{
- children = Services.MediaService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, filter).ToArray();
+ children = Services.MediaService.GetPagedChildren(id, (pageNumber - 1), pageSize, out totalChildren, orderBy, orderDirection, orderBySystemField, filter).ToArray();
}
else
{
diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs
index 909189b7ad..0790997b0e 100644
--- a/src/Umbraco.Web/Editors/MemberController.cs
+++ b/src/Umbraco.Web/Editors/MemberController.cs
@@ -78,6 +78,7 @@ namespace Umbraco.Web.Editors
int pageSize = 100,
string orderBy = "Name",
Direction orderDirection = Direction.Ascending,
+ bool orderBySystemField = true,
string filter = "",
string memberTypeAlias = null)
{
@@ -90,6 +91,7 @@ namespace Umbraco.Web.Editors
if (MembershipScenario == MembershipScenario.NativeUmbraco)
{
long totalRecords;
+ var members = Services.MemberService.GetAll((pageNumber - 1), pageSize, out totalRecords, orderBy, orderDirection, orderBySystemField, memberTypeAlias, filter).ToArray();
var members = Services.MemberService.GetAll((pageNumber - 1), pageSize, out totalRecords, orderBy, orderDirection, memberTypeAlias, filter).ToArray();
if (totalRecords == 0)
{
diff --git a/src/UmbracoExamine/UmbracoMemberIndexer.cs b/src/UmbracoExamine/UmbracoMemberIndexer.cs
index 873391da50..8c3aced77c 100644
--- a/src/UmbracoExamine/UmbracoMemberIndexer.cs
+++ b/src/UmbracoExamine/UmbracoMemberIndexer.cs
@@ -142,6 +142,7 @@ namespace UmbracoExamine
do
{
long total;
+ var members = _memberService.GetAll(pageIndex, pageSize, out total, "LoginName", Direction.Ascending, true, nodeType).ToArray();
members = _memberService.GetAll(pageIndex, pageSize, out total, "LoginName", Direction.Ascending, nodeType).ToArray();
AddNodesToIndex(GetSerializedMembers(members), type);