From bf8c25ba5aa62765434fb9d421b684cfbf041793 Mon Sep 17 00:00:00 2001 From: Nils Goovaerts Date: Fri, 10 Aug 2018 11:02:50 +0200 Subject: [PATCH 1/2] added ReturnAllValues to ClauseValueManager to handle getting ALL values --- .../Core/Clauses/ClauseValueManager.cs | 5 +++ .../Core/Clauses/IClauseValueManager.cs | 4 ++ .../Core/Models/AutoQueryHandler.cs | 37 ++++++++++++++++--- src/AutoQueryable/Helpers/QueryBuilder.cs | 16 ++++---- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/AutoQueryable/Core/Clauses/ClauseValueManager.cs b/src/AutoQueryable/Core/Clauses/ClauseValueManager.cs index 0ec915d..a8bd6ea 100644 --- a/src/AutoQueryable/Core/Clauses/ClauseValueManager.cs +++ b/src/AutoQueryable/Core/Clauses/ClauseValueManager.cs @@ -35,6 +35,11 @@ public ClauseValueManager(ISelectClauseHandler selectClauseHandler, IOrderByClau public int? Page { get; set; } public int? PageSize { get; set; } public IEnumerable WrapWith { get; set; } + /// + /// + /// Return all values without pagination + /// + public bool ReturnAllValues { get; set; } public void SetDefaults(Type type) { diff --git a/src/AutoQueryable/Core/Clauses/IClauseValueManager.cs b/src/AutoQueryable/Core/Clauses/IClauseValueManager.cs index b32bdbc..fb1ad3a 100644 --- a/src/AutoQueryable/Core/Clauses/IClauseValueManager.cs +++ b/src/AutoQueryable/Core/Clauses/IClauseValueManager.cs @@ -17,6 +17,10 @@ public interface IClauseValueManager int? Take { get; set; } int? Top { get; set; } IEnumerable WrapWith { get; set; } + /// + /// Return all items without pagination + /// + bool ReturnAllValues { get; set; } void SetDefaults(Type type); } } \ No newline at end of file diff --git a/src/AutoQueryable/Core/Models/AutoQueryHandler.cs b/src/AutoQueryable/Core/Models/AutoQueryHandler.cs index c159e12..c198e09 100644 --- a/src/AutoQueryable/Core/Models/AutoQueryHandler.cs +++ b/src/AutoQueryable/Core/Models/AutoQueryHandler.cs @@ -80,20 +80,45 @@ private void _getClauses(IAutoQueryableProfile profile) where T : class // Set the defaults to start with, then fill/overwrite with the query string values ClauseValueManager.SetDefaults(typeof(T)); + if(ClauseValueManager.Top != null && ClauseValueManager.Top == 0) + { + // Setting ReturnAllValues to true because Top is 0 + ClauseValueManager.ReturnAllValues = true; + } if (ClauseValueManager.PageSize != null) { - ClauseValueManager.Top = ClauseValueManager.PageSize; + if(ClauseValueManager.PageSize == 0) + { + // Setting ReturnAllValues to true because PageSize is 0 + ClauseValueManager.ReturnAllValues = true; + } + else + { + ClauseValueManager.Top = ClauseValueManager.PageSize; + } } if (ClauseValueManager.Page != null) { - //this.Logger.Information("Overwriting 'skip' clause value because 'page' is set"); - // Calculate skip from page if page query param was set - ClauseValueManager.Top = ClauseValueManager.Top ?? profile.DefaultToTake; - ClauseValueManager.Skip = (ClauseValueManager.Page - 1) * ClauseValueManager.Top; + if(ClauseValueManager.Page == 0) + { + // Setting ReturnAllValues to true because Page is 0 + ClauseValueManager.ReturnAllValues = true; + } + else + { + // Calculate skip from page if page query param was set + ClauseValueManager.Top = ClauseValueManager.Top ?? profile.DefaultToTake; + // Overwriting 'skip' clause value because 'page' is set + ClauseValueManager.Skip = (ClauseValueManager.Page - 1) * ClauseValueManager.Top; + } } - + if(ClauseValueManager.WrapWith.Any() && ClauseValueManager.WrapWith.Contains("none")) + { + // Setting ReturnAllValues to true because WrapWith contains 'none' + ClauseValueManager.ReturnAllValues = true; + } if (ClauseValueManager.OrderBy == null && profile.DefaultOrderBy != null) { diff --git a/src/AutoQueryable/Helpers/QueryBuilder.cs b/src/AutoQueryable/Helpers/QueryBuilder.cs index 5607b44..3471cb3 100644 --- a/src/AutoQueryable/Helpers/QueryBuilder.cs +++ b/src/AutoQueryable/Helpers/QueryBuilder.cs @@ -68,17 +68,19 @@ private static IQueryable _handlePaging(IClauseValueManager clauseValueMan } query = query.Skip(clauseValueManager.Skip.Value); } - // Top or DefaultToTake = 0 => return ALL values + // ReturnAllValues or DefaultToTake = 0 => return ALL values + if(clauseValueManager.ReturnAllValues || profile == null || profile.DefaultToTake == 0) + { + return query; + } + if (clauseValueManager.Top.HasValue) { - if (clauseValueManager.Top != 0 && (profile == null || profile.DefaultToTake != 0)) + if (profile?.MaxToTake != null && clauseValueManager.Top > profile.MaxToTake) { - if (profile?.MaxToTake != null && clauseValueManager.Top > profile.MaxToTake) - { - clauseValueManager.Top = profile.MaxToTake.Value; - } - query = query.Take(clauseValueManager.Top.Value); + clauseValueManager.Top = profile.MaxToTake.Value; } + query = query.Take(clauseValueManager.Top.Value); } else if (profile?.MaxToTake != null) { From 1a6a25f4cf0e4d5dfebc7e912fc497b673804fc0 Mon Sep 17 00:00:00 2001 From: Nils Goovaerts Date: Fri, 10 Aug 2018 11:03:32 +0200 Subject: [PATCH 2/2] change PagedResult result collection to Values to be consistent with old version of AQ --- src/AutoQueryable/Extensions/QueryableExtension.cs | 2 +- src/AutoQueryable/Models/PagedResult.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AutoQueryable/Extensions/QueryableExtension.cs b/src/AutoQueryable/Extensions/QueryableExtension.cs index 61d519f..d7f5d52 100644 --- a/src/AutoQueryable/Extensions/QueryableExtension.cs +++ b/src/AutoQueryable/Extensions/QueryableExtension.cs @@ -53,7 +53,7 @@ public static dynamic ToAutoQueryListResult(this IQueryable qu { TotalCount = context.TotalCountQuery?.Count() ?? result.Count, RowCount = result.Count, - Result = result + Values = result }; } //private static dynamic _getWrappedResult(QueryResult queryResult, IAutoQueryableContext context) diff --git a/src/AutoQueryable/Models/PagedResult.cs b/src/AutoQueryable/Models/PagedResult.cs index fb8f449..622cb33 100644 --- a/src/AutoQueryable/Models/PagedResult.cs +++ b/src/AutoQueryable/Models/PagedResult.cs @@ -4,7 +4,7 @@ namespace AutoQueryable.Models { public class PagedResult : IPagedResult { - public ICollection Result { get; set; } + public ICollection Values { get; set; } public string NextLink { get; set; } public int RowCount { get; set; } public int TotalCount { get; set; } @@ -12,7 +12,7 @@ public class PagedResult : IPagedResult } public interface IPagedResult { - ICollection Result { get; set; } + ICollection Values { get; set; } string NextLink { get; set; } int RowCount { get; set; } int TotalCount { get; set; }