From f79f8adac7dbc83aace254d37a850d5ddbeaa809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C5=9Eafak=20K=C4=B1l=C4=B1=C3=A7?= Date: Thu, 10 Sep 2020 16:37:38 +0300 Subject: [PATCH] Global config structure was developed for DynamicQueryAttribute. --- .../OnActionExecutingTests.cs | 41 ++++++++++++------- DynamicQueryBuilder/DynamicQueryAttribute.cs | 31 ++++++++------ .../DynamicQueryAttributeGlobalConfig.cs | 22 ++++++++++ docs/dqb.org | 2 + 4 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 DynamicQueryBuilder/DynamicQueryAttributeGlobalConfig.cs diff --git a/DynamicQueryBuilder.UnitTests/DynamicQueryAttributeTests/OnActionExecutingTests.cs b/DynamicQueryBuilder.UnitTests/DynamicQueryAttributeTests/OnActionExecutingTests.cs index 4f2dc1a..277b857 100644 --- a/DynamicQueryBuilder.UnitTests/DynamicQueryAttributeTests/OnActionExecutingTests.cs +++ b/DynamicQueryBuilder.UnitTests/DynamicQueryAttributeTests/OnActionExecutingTests.cs @@ -26,10 +26,6 @@ namespace DynamicQueryBuilder.UnitTests.DynamicQueryAttributeTests { public class OnActionExecutingTests : TestBase { - private const int _defaultMaxCountSize = 100; - private const bool _defaultIncludeDataSetCount = true; - private const PaginationBehaviour _defaultPaginationBehaviour = PaginationBehaviour.GetMax; - [Fact] public void OnActionExecutingShouldModifyDynamicQueryOptionsActionParameterWhenItsPresent() { @@ -53,19 +49,32 @@ public void ShouldSetGivenCtorValues() var parameterlessInstance = new DynamicQueryAttribute(); var parameteredInstance = new DynamicQueryAttribute(200, false, PaginationBehaviour.Throw); - Assert.Equal(parameterlessInstance._maxCountSize, _defaultMaxCountSize); - Assert.Equal(parameterlessInstance._includeDataSetCountToPagination, _defaultIncludeDataSetCount); - Assert.Equal(parameterlessInstance._exceededPaginationCountBehaviour, _defaultPaginationBehaviour); + Assert.Equal(parameterlessInstance._maxCountSize, null); + Assert.Equal(parameterlessInstance._includeDataSetCountToPagination, null); + Assert.Equal(parameterlessInstance._exceededPaginationCountBehaviour, null); Assert.Equal(parameteredInstance._maxCountSize, changedMaxCountSize); Assert.Equal(parameteredInstance._includeDataSetCountToPagination, changedIncludedataSetCount); Assert.Equal(parameteredInstance._exceededPaginationCountBehaviour, changedPaginationBehaviour); } + [Fact] + public void ShouldNotSetCTorValuesWhenApplyGlobalFilter() + { + var defaultInstance = new DynamicQueryAttribute(); + string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={DynamicQueryAttributeGlobalConfig.MaxCountSize + 1}"); + DynamicQueryOptions executedOptions = ExecuteAction(defaultInstance, queryExceedingMaxCount); + + Assert.Equal(DynamicQueryAttributeGlobalConfig.IncludeDataSetCountToPagination, executedOptions.PaginationOption.AssignDataSetCount); + Assert.Equal(DynamicQueryAttributeGlobalConfig.MaxCountSize, executedOptions.PaginationOption.Count); + } + [Fact] public void ShouldSetGivenAssignDataSetCountWhenOptionsNotNull() { - bool changedIncludeDataSetCount = !_defaultIncludeDataSetCount; + DynamicQueryAttributeGlobalConfig.LoadDefaultConfigs(); + + bool changedIncludeDataSetCount = !DynamicQueryAttributeGlobalConfig.IncludeDataSetCountToPagination; var parameterlessInstance = new DynamicQueryAttribute(includeDataSetCountToPagination: changedIncludeDataSetCount); DynamicQueryOptions executedOptions = ExecuteAction(parameterlessInstance); Assert.Equal(executedOptions.PaginationOption.AssignDataSetCount, changedIncludeDataSetCount); @@ -74,22 +83,26 @@ public void ShouldSetGivenAssignDataSetCountWhenOptionsNotNull() [Fact] public void ShouldSetCountToMaxWhenCountExceedsAndOptionsWereSetToGetMaxOrDefault() { - var behaviourSetInstance = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.GetMax); + int maxCountSizeDefination = 10; + + var behaviourSetInstance = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.GetMax, maxCountSize: maxCountSizeDefination); var defaultBehaviourInstance = new DynamicQueryAttribute(); - string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={_defaultMaxCountSize + 1}"); + string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={maxCountSizeDefination + 1}"); DynamicQueryOptions executedOptionsWithSetOptions = ExecuteAction(behaviourSetInstance, queryExceedingMaxCount); DynamicQueryOptions executedOptionsWithDefaultOptions = ExecuteAction(defaultBehaviourInstance, queryExceedingMaxCount); - Assert.Equal(executedOptionsWithSetOptions.PaginationOption.Count, _defaultMaxCountSize); - Assert.Equal(executedOptionsWithDefaultOptions.PaginationOption.Count, _defaultMaxCountSize); + Assert.Equal(executedOptionsWithSetOptions.PaginationOption.Count, maxCountSizeDefination); + Assert.Equal(executedOptionsWithDefaultOptions.PaginationOption.Count, maxCountSizeDefination + 1); } [Fact] public void ShouldSetCountToMaxWhenCountExceedsAndOptionsWereSetToThrow() { - var behaviourSetInstance = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.Throw); - string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={_defaultMaxCountSize + 1}"); + int maxCountSizeDefination = 10; + + var behaviourSetInstance = new DynamicQueryAttribute(exceededPaginationCountBehaviour: PaginationBehaviour.Throw, maxCountSize: maxCountSizeDefination); + string queryExceedingMaxCount = DYNAMIC_QUERY_STRING.Replace("count=10", $"count={maxCountSizeDefination + 1}"); Assert.Throws(() => { ExecuteAction(behaviourSetInstance, queryExceedingMaxCount); }); } diff --git a/DynamicQueryBuilder/DynamicQueryAttribute.cs b/DynamicQueryBuilder/DynamicQueryAttribute.cs index 0373039..d0dbec2 100644 --- a/DynamicQueryBuilder/DynamicQueryAttribute.cs +++ b/DynamicQueryBuilder/DynamicQueryAttribute.cs @@ -21,22 +21,22 @@ namespace DynamicQueryBuilder /// public sealed class DynamicQueryAttribute : ActionFilterAttribute { - internal readonly int _maxCountSize = 0; - internal readonly bool _includeDataSetCountToPagination; - internal readonly PaginationBehaviour _exceededPaginationCountBehaviour; + internal readonly int? _maxCountSize; + internal readonly bool? _includeDataSetCountToPagination; + internal readonly PaginationBehaviour? _exceededPaginationCountBehaviour; /// /// Initializes a new instance of the class. + /// DynamicQueryAttributeGlobalConfig definations is used for parameters with a null value. /// Also, Finds and constructs DynamicQueryOptions class in the parameters. /// /// Max data set count for the result set. /// Includes the total data set count to the options class. /// Behaviour when the requested data set count greater than max count size. - /// Resolves the dynamic query string from the given query parameter value. public DynamicQueryAttribute( - int maxCountSize = 100, - bool includeDataSetCountToPagination = true, - PaginationBehaviour exceededPaginationCountBehaviour = PaginationBehaviour.GetMax) + int? maxCountSize = null, + bool? includeDataSetCountToPagination = null, + PaginationBehaviour? exceededPaginationCountBehaviour = null) { _maxCountSize = maxCountSize; _includeDataSetCountToPagination = includeDataSetCountToPagination; @@ -100,18 +100,23 @@ public override void OnActionExecuting(ActionExecutingContext context) parsedOptions.UsesCaseInsensitiveSource = dqbSettings.UsesCaseInsensitiveSource; parsedOptions.IgnorePredefinedOrders = dqbSettings.IgnorePredefinedOrders; + + bool includeDataSetCountToPagination = _includeDataSetCountToPagination == null ? DynamicQueryAttributeGlobalConfig.IncludeDataSetCountToPagination : _includeDataSetCountToPagination.GetValueOrDefault(); if (parsedOptions.PaginationOption != null) { - parsedOptions.PaginationOption.AssignDataSetCount = _includeDataSetCountToPagination; - if (parsedOptions.PaginationOption.Count > _maxCountSize) + parsedOptions.PaginationOption.AssignDataSetCount = includeDataSetCountToPagination; + + int maxCountSize = _maxCountSize == null ? DynamicQueryAttributeGlobalConfig.MaxCountSize : _maxCountSize.GetValueOrDefault(); + if (parsedOptions.PaginationOption.Count > maxCountSize) { - if (_exceededPaginationCountBehaviour == PaginationBehaviour.GetMax) + PaginationBehaviour exceededPaginationCountBehaviour = _exceededPaginationCountBehaviour == null ? DynamicQueryAttributeGlobalConfig.ExceededPaginationCountBehaviour : _exceededPaginationCountBehaviour.GetValueOrDefault(); + if (exceededPaginationCountBehaviour == PaginationBehaviour.GetMax) { - parsedOptions.PaginationOption.Count = _maxCountSize; + parsedOptions.PaginationOption.Count = maxCountSize; } else { - throw new MaximumResultSetExceededException($"Given count {parsedOptions.PaginationOption.Count} exceeds the maximum amount"); + throw new MaximumResultSetExceededException($"Given count {parsedOptions.PaginationOption.Count} exceeds the maximum amount of {maxCountSize}"); } } else if (parsedOptions.PaginationOption.Count <= 0) @@ -124,7 +129,7 @@ public override void OnActionExecuting(ActionExecutingContext context) parsedOptions.PaginationOption.Offset = 0; } } - else if (_includeDataSetCountToPagination && parsedOptions.PaginationOption == null) + else if (includeDataSetCountToPagination && parsedOptions.PaginationOption == null) { parsedOptions.PaginationOption = new PaginationOption { diff --git a/DynamicQueryBuilder/DynamicQueryAttributeGlobalConfig.cs b/DynamicQueryBuilder/DynamicQueryAttributeGlobalConfig.cs new file mode 100644 index 0000000..51857f4 --- /dev/null +++ b/DynamicQueryBuilder/DynamicQueryAttributeGlobalConfig.cs @@ -0,0 +1,22 @@ +using DynamicQueryBuilder.Models.Enums; + +namespace DynamicQueryBuilder +{ + public static class DynamicQueryAttributeGlobalConfig + { + internal static readonly int MaxCountSizeDefault = 100; + internal static readonly bool IncludeDataSetCountToPaginationDefault = true; + internal static readonly PaginationBehaviour ExceededPaginationCountBehaviourDefault = PaginationBehaviour.GetMax; + + public static int MaxCountSize { get; set; } = MaxCountSizeDefault; + public static bool IncludeDataSetCountToPagination { get; set; } = IncludeDataSetCountToPaginationDefault; + public static PaginationBehaviour ExceededPaginationCountBehaviour { get; set; } = ExceededPaginationCountBehaviourDefault; + + public static void LoadDefaultConfigs() + { + MaxCountSize = MaxCountSizeDefault; + IncludeDataSetCountToPagination = IncludeDataSetCountToPaginationDefault; + ExceededPaginationCountBehaviour = ExceededPaginationCountBehaviourDefault; + } + } +} \ No newline at end of file diff --git a/docs/dqb.org b/docs/dqb.org index e886980..f1c1df4 100644 --- a/docs/dqb.org +++ b/docs/dqb.org @@ -212,6 +212,8 @@ int totalDataSetCount = paginationOption.DataSetCount; Web development is actually where DQB shines the most. DQB comes with an ~ActionFilter~ that can parse HTTP queries into ~DynamicQueryOptions~ class. +If you want change global config for ~ActionFilter~, this can be use ~DynamicQueryAttributeGlobalConfig~. + ** Setting up DynamicQueryBuilderSettings This is a singleton object that can hold static configurations for DQB like operation shortcodes, query resolution methods and data source case sensitivity.