Skip to content

Commit

Permalink
Optional Any func (#72)
Browse files Browse the repository at this point in the history
* Optional Any func (#71)

* throw error when func is null, return default if supressed
  • Loading branch information
h3rmanj committed Jul 10, 2021
1 parent 83d7052 commit 6531eb2
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ public interface IODataOperator

bool All<T>(IEnumerable<T> columnName, Func<T, bool> func);

bool Any<T>(IEnumerable<T> columnName);

bool Any<T>(IEnumerable<T> columnName, Func<T, bool> func);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,22 @@ protected override string VisitMethodCallExpression(MethodCallExpression methodC
return $"{all0}/{nameof(IODataOperator.All).ToLowerInvariant()}({all1})";
case nameof(IODataOperator.Any):
var any0 = VisitExpression(methodCallExpression.Arguments[0]);
var any1 = VisitExpression(methodCallExpression.Arguments[1]);
var any1 = default(string);

if (methodCallExpression.Arguments.Count > 1)
{
any1 = VisitExpression(methodCallExpression.Arguments[1]);

if (any1.IsNullOrQuotes())
{
if (!_odataQueryBuilderOptions.SuppressExceptionOfNullOrEmptyOperatorArgs)
{
throw new ArgumentException("Func is null");
}

return default;
}
}

return $"{any0}/{nameof(IODataOperator.Any).ToLowerInvariant()}({any1})";
case nameof(IODataFunction.Date):
Expand Down
44 changes: 44 additions & 0 deletions test/OData.QueryBuilder.Test/ODataQueryCollectionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,50 @@ public void ODataQueryBuilderList_Filter_Any_With_Func_Success()
uri.Should().Be("http://mock/odata/ODataType?$filter=ODataKind/ODataCodes/any(v:date(v/Created) eq 2019-02-09T00:00:00Z)");
}

[Fact(DisplayName = "(ODataQueryBuilderList) Filter Any without func => Success")]
public void ODataQueryBuilderList_Filter_Any_Without_Func()
{
var uri = _odataQueryBuilderDefault
.For<ODataTypeEntity>(s => s.ODataType)
.ByList()
.Filter((s, f, o) => o.Any(s.Labels))
.ToUri();

uri.Should().Be("http://mock/odata/ODataType?$filter=Labels/any()");
}

[Fact(DisplayName = "(ODataQueryBuilderList) Filter Any with func null supressed => Success")]
public void ODataQueryBuilderList_Filter_Any_With_Func_null_Supressed()
{
var odataQueryBuilderOptions = new ODataQueryBuilderOptions { SuppressExceptionOfNullOrEmptyOperatorArgs = true };
var odataQueryBuilder = new ODataQueryBuilder<ODataInfoContainer>(
_commonFixture.BaseUri, odataQueryBuilderOptions);

var func = default(Func<string, bool>);

var uri = odataQueryBuilder
.For<ODataTypeEntity>(s => s.ODataType)
.ByList()
.Filter((s, _, o) => o.Any(s.Labels, func))
.ToUri();

uri.Should().Be("http://mock/odata/ODataType?$filter=");
}

[Fact(DisplayName = "(ODataQueryBuilderList) Filter Any with func null => ArgumentException")]
public void ODataQueryBuilderList_Filter_Any_With_Func_null()
{
var func = default(Func<string, bool>);

_odataQueryBuilderDefault.Invoking(
(r) => r
.For<ODataTypeEntity>(s => s.ODataType)
.ByList()
.Filter((s, _, o) => o.Any(s.Labels, func))
.ToUri())
.Should().Throw<ArgumentException>().WithMessage("Func is null");
}

[Fact(DisplayName = "Expand,Filter,Select,OrderBy,OrderByDescending,Skip,Top,Count => Success")]
public void ODataQueryBuilderList_Expand_Filter_Select_OrderBy_OrderByDescending_Skip_Top_Count_Success()
{
Expand Down

0 comments on commit 6531eb2

Please sign in to comment.