Skip to content

Commit

Permalink
feature/empty and not any sequence IN
Browse files Browse the repository at this point in the history
* #empty in

* #not any in

* #fix c# 7.0
  • Loading branch information
ZEXSM committed Aug 15, 2019
1 parent d25c92d commit 3af0066
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 7 deletions.
44 changes: 37 additions & 7 deletions src/OData.QueryBuilder/Extensions/ExpressionExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,29 @@ public static object GetMemberExpressionValue(this MemberExpression memberExpres
return memberExpression.Member.GetValue(default(object));
}

public static string GetInSequence(this object arrayObj)
{
if (arrayObj is IEnumerable<int>)
{
var inSequenceInt = string.Join(",", arrayObj as IEnumerable<int>);
if (!string.IsNullOrEmpty(inSequenceInt))
{
return $"in ({inSequenceInt})";
}
}

if (arrayObj is IEnumerable<string>)
{
var inSequenceInt = string.Join("','", arrayObj as IEnumerable<string>);
if (!string.IsNullOrEmpty(inSequenceInt))
{
return $"in ('{inSequenceInt}')";
}
}

return string.Empty;
}

public static string ToODataOperator(this ExpressionType expressionType)
{
switch (expressionType)
Expand Down Expand Up @@ -173,6 +196,16 @@ public static string ToODataQuery(this Expression expression, string queryString
var leftQueryString = binaryExpression.Left.ToODataQuery(queryString);
var rightQueryString = binaryExpression.Right.ToODataQuery(queryString);

if (string.IsNullOrEmpty(leftQueryString))
{
return rightQueryString;
}

if (string.IsNullOrEmpty(rightQueryString))
{
return leftQueryString;
}

return $"{leftQueryString} {binaryExpression.NodeType.ToODataOperator()} {rightQueryString}";

case MemberExpression memberExpression:
Expand Down Expand Up @@ -220,18 +253,15 @@ public static string ToODataQuery(this Expression expression, string queryString
filter = methodCallExpression.Arguments[0].ToODataQuery(queryString);
}

if (resource is IEnumerable<int>)
{
return $"{filter} in ({string.Join(",", (IEnumerable<int>)resource)})";
}
var inSequence = resource.GetInSequence();

if (resource is IEnumerable<string>)
if (!string.IsNullOrEmpty(inSequence))
{
return $"{filter} in ('{string.Join("','", (IEnumerable<string>)resource)}')";
return $"{filter} {inSequence}";
}
}

return methodName.ToLower();
return string.Empty;

case NewExpression newExpression:
return newExpression.ToODataQuery();
Expand Down
27 changes: 27 additions & 0 deletions test/OData.QueryBuilder.Test/ODataQueryBuilderByListTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using OData.QueryBuilder.Builders;
using OData.QueryBuilder.Test.Fakes;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;

Expand Down Expand Up @@ -211,6 +212,32 @@ public void ODataQueryBuilderList_Operator_In_Success()
uri.OriginalString.Should().Be("http://mock/odata/ODataType?$filter=ODataKind/ODataCode/Code in ('123','512') and ODataKind/ODataCode/Code in ('123','512') and IdType in (123,512) and IdType in (123,512) and IdRule in (123,512) and IdRule in (123,512) and ODataKind/IdKind in (123,512) and ODataKind/ODataCode/IdCode in (123,512)");
}

[Fact(DisplayName = "(ODataQueryBuilderList) Operator IN empty => Success")]
public void ODataQueryBuilderList_Operator_In_Empty_Success()
{
var constStrIds = default(IEnumerable<string>);
var constStrListIds = new string[] { }.ToList();
var constIntIds = default(int[]);
var constIntListIds = new[] { 123, 512 }.ToList();
var newObject = new ODataTypeEntity { ODataKind = new ODataKindEntity { Sequence = constIntListIds } };
var newObjectSequenceArray = new ODataTypeEntity { ODataKind = new ODataKindEntity { SequenceArray = constIntIds } };

var uri = _odataQueryBuilder
.For<ODataTypeEntity>(s => s.ODataType)
.ByList()
.Filter(s => constStrIds.Contains(s.ODataKind.ODataCode.Code)
&& constStrListIds.Contains(s.ODataKind.ODataCode.Code)
&& constIntIds.Contains(s.IdType)
&& constIntListIds.Contains(s.IdType)
&& constIntIds.Contains((int)s.IdRule)
&& constIntListIds.Contains((int)s.IdRule)
&& newObject.ODataKind.Sequence.Contains(s.ODataKind.IdKind)
&& newObjectSequenceArray.ODataKind.SequenceArray.Contains(s.ODataKind.ODataCode.IdCode))
.ToUri();

uri.OriginalString.Should().Be("http://mock/odata/ODataType?$filter=IdType in (123,512) and IdRule in (123,512) and ODataKind/IdKind in (123,512)");
}

[Fact(DisplayName = "(ODataQueryBuilderList) Filter boolean values => Success")]
public void ODataQueryBuilderList_Filter_Boolean_Values_Success()
{
Expand Down

0 comments on commit 3af0066

Please sign in to comment.