Skip to content

Commit e788d7d

Browse files
author
Viktor Tochonov
committed
Revert "Revert Implemented IN case"
This reverts commit da759ab.
1 parent fd37e4a commit e788d7d

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type ObjectListFilter =
1313
| Equals of FieldFilter<System.IComparable>
1414
| GreaterThan of FieldFilter<System.IComparable>
1515
| LessThan of FieldFilter<System.IComparable>
16+
| In of FieldFilter<System.IComparable list>
1617
| StartsWith of FieldFilter<string>
1718
| EndsWith of FieldFilter<string>
1819
| Contains of FieldFilter<string>
@@ -177,6 +178,11 @@ module ObjectListFilter =
177178
Expression.Call (getEnumerableContainsMethod field.FieldType, Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value))
178179
| _ ->
179180
Expression.Call (``member``, StringContainsMethod, Expression.Constant (f.Value))
181+
| In f ->
182+
let ``member`` = Expression.PropertyOrField (param, f.FieldName)
183+
let values = f.Value |> List.map (fun v -> Expression.Equal(``member``, Expression.Constant(v)))
184+
(values |> List.reduce (fun acc expr -> Expression.OrElse(acc, expr))) :> Expression
185+
180186
| OfTypes types ->
181187
types
182188
|> Seq.map (fun t -> buildTypeDiscriminatorCheck param t)

tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqTests.fs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,40 @@ let ``ObjectListFilter works with OR operator``() =
119119
result.Contact |> equals { Email = "[email protected]" }
120120
result.Friends |> equals [ { Email = "[email protected]" }; { Email = "[email protected]" } ]
121121

122+
[<Fact>]
123+
let ``ObjectListFilter works with IN operator for string type field``() =
124+
let filter =
125+
In { FieldName = "firstName"; Value = ["Jeneffer"; "Ben"] }
126+
let queryable = data.AsQueryable()
127+
let filteredData = queryable.Apply(filter) |> Seq.toList
128+
List.length filteredData |> equals 2
129+
let result = List.head filteredData
130+
result.ID |> equals 4
131+
result.FirstName |> equals "Ben"
132+
result.LastName |> equals "Adams"
133+
result.Contact |> equals { Email = "[email protected]" }
134+
result.Friends |> equals [ { Email = "[email protected]" }; { Email = "[email protected]" } ]
135+
let result2 = List.last filteredData
136+
result2.ID |> equals 7
137+
result2.FirstName |> equals "Jeneffer"
138+
result2.LastName |> equals "Trif"
139+
result2.Contact |> equals { Email = "[email protected]" }
140+
result2.Friends |> equals [ { Email = "[email protected]" } ]
141+
142+
[<Fact>]
143+
let ``ObjectListFilter works with IN operator for int type field``() =
144+
let filter =
145+
In { FieldName = "id"; Value = [4; 2; 7] }
146+
let queryable = data.AsQueryable()
147+
let filteredData = queryable.Apply(filter) |> Seq.toList
148+
List.length filteredData |> equals 3
149+
let result = List.head filteredData
150+
result.ID |> equals 4
151+
result.FirstName |> equals "Ben"
152+
result.LastName |> equals "Adams"
153+
result.Contact |> equals { Email = "[email protected]" }
154+
result.Friends |> equals [ { Email = "[email protected]" }; { Email = "[email protected]" } ]
155+
122156
[<Fact>]
123157
let ``ObjectListFilter works with FilterField operator``() =
124158
let filter =

0 commit comments

Comments
 (0)