@@ -12,6 +12,7 @@ open FSharp.Data.GraphQL.Execution
1212open FSharp.Data .GraphQL .Server .Middleware
1313open FSharp.Data .GraphQL .Server .Middleware .ObjectListFilter
1414open FSharp.Data .GraphQL .Server .Middleware .ObjectListFilterExtensions
15+ open System.Linq .Expressions
1516
1617type Contact =
1718 { Email : string }
@@ -54,6 +55,7 @@ let data =
5455 Contact
= { Email
= " [email protected] " } 5556 Friends
= [ { Email
= " [email protected] " } ] } ] 5657
58+
5759let internal undefined < 't > = Unchecked.defaultof< 't>
5860
5961let resolveRoot ctx () =
@@ -352,7 +354,7 @@ let ``ObjectListFilter works with Contains operator``() =
352354 result.FirstName |> equals " Ben"
353355 result.LastName |> equals " Adams"
354356 result.Contact
|> equals
{ Email
= " [email protected] " } 355- result.Friends
|> equals
[ { Email
= " [email protected] " }; { Email
= " [email protected] " } ] 357+ result.Friends
|> equals
[ { Email
= " [email protected] " }; { Email
= " [email protected] " } ] 356358
357359[<Fact>]
358360let ``ObjectListFilter works with EndsWith operator`` () =
@@ -365,11 +367,11 @@ let ``ObjectListFilter works with EndsWith operator``() =
365367 result.FirstName |> equals " Ben"
366368 result.LastName |> equals " Adams"
367369 result.Contact
|> equals
{ Email
= " [email protected] " } 368- result.Friends
|> equals
[ { Email
= " [email protected] " }; { Email
= " [email protected] " } ] 370+ result.Friends
|> equals
[ { Email
= " [email protected] " }; { Email
= " [email protected] " } ] 369371
370372[<Fact>]
371373let ``ObjectListFilter works with AND operator`` () =
372- let filter =
374+ let filter =
373375 And (
374376 Contains { FieldName = " firstName" ; Value = " en" },
375377 Equals { FieldName = " lastName" ; Value = " Adams" }
@@ -386,7 +388,7 @@ let ``ObjectListFilter works with AND operator``() =
386388
387389[<Fact>]
388390let ``ObjectListFilter works with OR operator`` () =
389- let filter =
391+ let filter =
390392 Or (
391393 GreaterThan { FieldName = " id" ; Value = 4 },
392394 Equals { FieldName = " lastName" ; Value = " Adams" }
@@ -403,7 +405,7 @@ let ``ObjectListFilter works with OR operator``() =
403405
404406//[<Fact>]
405407//let ``ObjectListFilter works with FilterField operator``() =
406- // let filter =
408+ // let filter =
407409// FilterField { FieldName = "Friends"; Value = Contains { FieldName = "Email"; Value = "[email protected] " } } 408410// let queryable = data.AsQueryable()
409411// let filteredData = filter.Apply(queryable) |> Seq.toList
@@ -417,7 +419,7 @@ let ``ObjectListFilter works with OR operator``() =
417419
418420[<Fact>]
419421let ``ObjectListFilter works with NOT operator`` () =
420- let filter =
422+ let filter =
421423 Not ( Equals { FieldName = " lastName" ; Value = " Adams" })
422424 let queryable = data.AsQueryable()
423425 let filteredData = filter.Apply( queryable) |> Seq.toList
@@ -429,3 +431,140 @@ let ``ObjectListFilter works with NOT operator``() =
429431 result1.Contact
|> equals
{ Email
= " [email protected] " } 430432 result1.Friends |> equals []
431433
434+ type Complex =
435+ { ID : int
436+ Name : string
437+ Discriminator : string }
438+
439+ type Building =
440+ { ID : int
441+ Name : string
442+ Discriminator : string }
443+
444+ type Community =
445+ { ID : int
446+ Name : string
447+ Discriminator : string
448+ Complexes : int list
449+ Buildings : int list }
450+
451+ type Property =
452+ | Complex of Complex
453+ | Building of Building
454+ | Community of Community
455+
456+ [<Fact>]
457+ let ``ObjectListFilter works with getDiscriminator for Complex`` () =
458+ let propertyData : Property list =
459+ [
460+ Complex { ID = 1 ; Name = " Complex A" ; Discriminator = typeof< Complex>. FullName}
461+ Building { ID = 2 ; Name = " Building B" ; Discriminator = typeof< Building>. FullName }
462+ Community { ID = 3 ; Name = " Community C" ; Discriminator = typeof< Community>. FullName; Complexes = [ 1 ]; Buildings = [ 2 ] }
463+ Complex { ID = 4 ; Name = " Complex AA" ; Discriminator = typeof< Complex>. FullName }
464+ Building { ID = 5 ; Name = " Building BB" ; Discriminator = typeof< Building>. FullName }
465+ Community { ID = 6 ; Name = " Community CC" ; Discriminator = typeof< Community>. FullName; Complexes = [ 4 ]; Buildings = [ 5 ] }
466+ ]
467+ let queryable = propertyData.AsQueryable()
468+ let filter = OfTypes [ typeof< Complex>]
469+ let filteredData =
470+ filter.Apply(
471+ queryable,
472+ getDiscriminator =
473+ fun p ->
474+ match p with
475+ | Complex c -> c.Discriminator
476+ | Building b -> b.Discriminator
477+ | Community c -> c.Discriminator
478+ )
479+ |> Seq.toList
480+ List.length filteredData |> equals 2
481+ let result1 = List.head filteredData
482+ match result1 with
483+ | Complex c ->
484+ c.ID |> equals 1
485+ c.Name |> equals " Complex A"
486+ | _ -> failwith " Expected Complex"
487+ let result2 = List.last filteredData
488+ match result2 with
489+ | Complex c ->
490+ c.ID |> equals 4
491+ c.Name |> equals " Complex AA"
492+ | _ -> failwith " Expected Complex"
493+
494+
495+ [<Fact>]
496+ let ``ObjectListFilter works with getDiscriminator and getDiscriminatorValue for Complex`` () =
497+ let propertyData : Property list =
498+ [
499+ Complex { ID = 1 ; Name = " Complex A" ; Discriminator = " Complex" }
500+ Building { ID = 2 ; Name = " Building B" ; Discriminator = " Building" }
501+ Community { ID = 3 ; Name = " Community C" ; Discriminator = " Community" ; Complexes = [ 1 ]; Buildings = [ 2 ] }
502+ Complex { ID = 4 ; Name = " Complex AA" ; Discriminator = " Complex" }
503+ Building { ID = 5 ; Name = " Building BB" ; Discriminator = " Building" }
504+ Community { ID = 6 ; Name = " Community CC" ; Discriminator = " Community" ; Complexes = [ 4 ]; Buildings = [ 5 ] }
505+ ]
506+ let queryable = propertyData.AsQueryable()
507+ let filter = OfTypes [ typeof< Complex>]
508+ let filteredData =
509+ filter.Apply(
510+ queryable,
511+ ( fun p ->
512+ match p with
513+ | Complex c -> c.Discriminator
514+ | Building b -> b.Discriminator
515+ | Community c -> c.Discriminator),
516+ ( function
517+ | t when t = typeof< Complex> -> " Complex"
518+ | t when t = typeof< Building> -> " Building"
519+ | t when t = typeof< Community> -> " Community"
520+ | _ -> raise ( NotSupportedException " Type not supported" ))
521+ )
522+ |> Seq.toList
523+ List.length filteredData |> equals 2
524+ let result1 = List.head filteredData
525+ match result1 with
526+ | Complex c ->
527+ c.ID |> equals 1
528+ c.Name |> equals " Complex A"
529+ | _ -> failwith " Expected Complex"
530+ let result2 = List.last filteredData
531+ match result2 with
532+ | Complex c ->
533+ c.ID |> equals 4
534+ c.Name |> equals " Complex AA"
535+ | _ -> failwith " Expected Complex"
536+
537+
538+
539+ [<Fact>]
540+ let ``ObjectListFilter works with getDiscriminatorValue for Complex`` () =
541+ let propertyData : Property list =
542+ [
543+ Complex { ID = 1 ; Name = " Complex A" ; Discriminator = typeof< Complex>. FullName}
544+ Building { ID = 2 ; Name = " Building B" ; Discriminator = typeof< Building>. FullName }
545+ Community { ID = 3 ; Name = " Community C" ; Discriminator = typeof< Community>. FullName; Complexes = [ 1 ]; Buildings = [ 2 ] }
546+ Complex { ID = 4 ; Name = " Complex AA" ; Discriminator = typeof< Complex>. FullName }
547+ Building { ID = 5 ; Name = " Building BB" ; Discriminator = typeof< Building>. FullName }
548+ Community { ID = 6 ; Name = " Community CC" ; Discriminator = typeof< Community>. FullName; Complexes = [ 4 ]; Buildings = [ 5 ] }
549+ ]
550+ let queryable = propertyData.AsQueryable()
551+ let filter = OfTypes [ typeof< Complex>]
552+ let filteredData =
553+ filter.Apply(
554+ queryable,
555+ getDiscriminatorValue = ( fun t -> t.FullName)
556+ )
557+ |> Seq.toList
558+ List.length filteredData |> equals 2
559+ let result1 = List.head filteredData
560+ match result1 with
561+ | Complex c ->
562+ c.ID |> equals 1
563+ c.Name |> equals " Complex A"
564+ | _ -> failwith " Expected Complex"
565+ let result2 = List.last filteredData
566+ match result2 with
567+ | Complex c ->
568+ c.ID |> equals 4
569+ c.Name |> equals " Complex AA"
570+ | _ -> failwith " Expected Complex"
0 commit comments