Skip to content

Commit ee4c17f

Browse files
committed
Optimized ResolveAbstractionFilter to return filter only if not all union cases are specified
1 parent c7d6b45 commit ee4c17f

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ namespace FSharp.Data.GraphQL.Server.Middleware
22

33
open System
44
open System.Collections.Immutable
5+
open System.Linq
56
open FsToolkit.ErrorHandling
67

78
open FSharp.Data.GraphQL
@@ -28,13 +29,21 @@ module TypeSystemExtensions =
2829
member this.ResolveAbstractionFilter (typeMap : TypeMap) =
2930
match this.Kind with
3031
| ResolveAbstraction typeFields ->
31-
let getType name =
32-
match typeMap.TryFind name with
33-
| ValueSome tdef -> tdef.Type
34-
| ValueNone -> raise (MalformedGQLQueryException ($"Type '{name}' not found in schema."))
35-
match typeFields.Keys |> Seq.map getType |> Seq.toList with
36-
| [] -> ValueNone
37-
| filters -> ValueSome (OfTypes filters)
32+
match this.ReturnDef with
33+
| :? UnionDef as union when
34+
union.Options
35+
|> Seq.map _.Name
36+
|> Seq.sort
37+
|> _.SequenceEqual(typeFields.Keys |> Seq.sort)
38+
->
39+
ValueNone
40+
| _ ->
41+
let getType name = typeMap[name].Type
42+
typeFields.Keys
43+
|> Seq.map getType
44+
|> Seq.toList
45+
|> OfTypes
46+
|> ValueSome
3847
| _ -> ValueNone
3948

4049
type ResolveFieldContext with

0 commit comments

Comments
 (0)