package Ġgraphql . n adel . engine kt . transform Ċ Ċ import Ġgraphql . int rospection . Int rospection Ċ import Ġgraphql . n adel . Service Ċ import Ġgraphql . n adel . Service Execution Result Ċ import Ġgraphql . n adel . engine kt . N adel ExecutionContext Ċ import Ġgraphql . n adel . engine kt . blueprint . Int rospection Service Ċ import Ġgraphql . n adel . engine kt . blueprint . N adel Overall Execution Blueprint Ċ import Ġgraphql . n adel . engine kt . transform . N adel ServiceType Filter Transform . State Ċ import Ġgraphql . n adel . engine kt . transform . art ificial . N adel Alias Helper Ċ import Ġgraphql . n adel . engine kt . transform . query . N adel Query Transformer Ċ import Ġgraphql . n adel . engine kt . transform . result . N adel Result Instruction Ċ import Ġgraphql . n adel . engine kt . transform . result . json . Json Nodes Ċ import Ġgraphql . n adel . engine kt . util . resolve Object Types Ċ import Ġgraphql . n adel . engine kt . util . to Builder Ċ import Ġgraphql . normalized . Executable Normalized Field Ċ import Ġgraphql . normalized . Executable Normalized Field . new Normalized Field Ċ Ċ /** Ċ Ġ* ĠN adel Ġends Ġup Ġbuilding Ġa Ġcomplex Ġschema Ġfrom Ġmultiple Ġdifferent Ġservices . ĠThis Ġclass Ċ Ġ* Ġensures Ġthat Ġa Ġquery Ġgoing Ġto Ġa Ġspecific Ġservice Ġdoesn 't Ġget Ġtypes Ġfrom Ġanother Ġservice . Ċ Ġ* ĠYou Ġmay Ġthink Ġthis Ġnever Ġhappens Ġbut Ġwith Ġshared Ġtypes Ġthis Ġbecomes Ġa Ġpossibility . Ċ Ġ* Ċ Ġ* Ġe . g . Ġgiven Ġan Ġoverall Ġschema Ċ Ġ* Ċ Ġ* Ġ``` graphql Ċ Ġ* Ġservice Ġshared Ġ{ Ċ Ġ* ĠĠ Ġinterface ĠError Ġ{ Ġid : ĠID Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġservice ĠA Ġ{ Ċ Ġ* ĠĠ Ġtype ĠQuery Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġa Errors : Ġ[ Error ] Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġtype ĠA Error Ġimplements ĠError Ġ{ Ġid : ĠID Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġservice ĠB Ġ{ Ċ Ġ* ĠĠ Ġtype ĠB Error Ġimplements ĠError Ġ{ Ċ Ġ* ĠĠĠĠ Ġid : ĠID Ċ Ġ* ĠĠĠĠ Ġb : ĠString Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠA Ġgiven Ġquery Ġis Ġcompletely Ġvalid : Ċ Ġ* Ċ Ġ* Ġ``` graphql Ċ Ġ* Ġquery Ġ{ Ċ Ġ* ĠĠ Ġa Errors Ġ{ Ċ Ġ* ĠĠĠĠ Ġ... Ġon ĠB Error Ġ{ Ċ Ġ* ĠĠĠĠĠĠ Ġid Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠBut Ġ` a Errors ` Ġgoes Ġto Ġthe Ġ` A ` Ġservice Ġwhere Ġthe Ġtype Ġ` B Error ` Ġdoesn 't Ġexist . Ċ Ġ* Ċ Ġ* ĠSee Ġthe Ġtests Ġfor Ġmore Ġexamples . Ċ Ġ* Ċ Ġ* Ġ- Ġservice - types - are - filtered . yml Ċ Ġ* Ġ- Ġservice - types - are - comp let ely - filtered . yml Ċ Ġ*/ Ċ class ĠN adel ServiceType Filter Transform Ġ: ĠN adel Transform < State > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠState ( ĊĠĠĠĠĠĠĠ Ġval Ġalias Helper : ĠN adel Alias Helper , ĊĠĠĠĠĠĠĠ Ġval Ġtype Names Owned By Service : ĠSet < String >, ĊĠĠĠĠĠĠĠ Ġval Ġfield ObjectType Names Owned By Service : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġoverall Field : ĠExec utable Normalized Field , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġis Applicable ( ĊĠĠĠĠĠĠĠ Ġexecution Context : ĠN adel ExecutionContext , ĊĠĠĠĠĠĠĠ Ġexecution Blueprint : ĠN adel Overall Execution Blueprint , ĊĠĠĠĠĠĠĠ Ġservices : ĠMap < String , ĠService >, ĊĠĠĠĠĠĠĠ Ġservice : ĠService , ĊĠĠĠĠĠĠĠ Ġoverall Field : ĠExec utable Normalized Field , ĊĠĠĠ Ġ): ĠState ? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġtop Ġlevel Ġfields , Ġthey Ġwon 't Ġbelong Ġto Ġmultiple Ġservices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġrandomly Ġremove Ġthis , Ġwe Ġrely Ġon Ġthis Ġlater Ġon Ġtoo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġtransform Ġnever Ġruns Ġfor Ġtop Ġlevel Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverall Field . parent Ġ== Ġnull Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInt rospection Ġ- Ġdo Ġnothing . ĠINT RO SPE CTION ĠRE ALLY ĠSHO UL DN ' T ĠBE ĠEXEC UT ING ĠTHIS ĠCODE ĠPATH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . name Ġ== ĠInt rospection Service . name Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Names Owned By Service Ġ= ĠgetType Names Service Ow ns ( execution Blueprint , Ġservice ) ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġunderlying Ġtype Ġnames Ġas Ġwell Ġto Ġhandle Ġcombination Ġof Ġh yd ration Ġand Ġre names . ĊĠĠĠĠĠĠĠ Ġ// ĠTrans forms Ġare Ġapplied Ġto Ġh yd ration Ġfields Ġas Ġwell , Ġand Ġthose Ġfields Ġalways Ġreference ĊĠĠĠĠĠĠĠ Ġ// Ġelements Ġfrom Ġthe Ġunderlying Ġschema ĊĠĠĠĠĠĠĠ Ġval Ġunderlying Type Names Owned By Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Under lying Type Names Service Ow ns ( execution Blueprint , Ġservice , Ġtype Names Owned By Service ) ĊĊĠĠĠĠĠĠĠ Ġval Ġall Type Names Owned By Service Ġ= Ġtype Names Owned By Service Ġ+ Ġunderlying Type Names Owned By Service ĊĊĠĠĠĠĠĠĠ Ġval Ġfield ObjectType Names Owned By Service Ġ= Ġoverall Field . object Type Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġin Ġall Type Names Owned By Service Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAll Ġtypes Ġare Ġowned Ġby Ġservice ĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġone Ġlist Ġis Ġa Ġsubset Ġof Ġthe Ġother , Ġso Ġif Ġsize Ġis Ġsame , Ġcontents Ġare Ġtoo ĊĠĠĠĠĠĠĠ Ġif Ġ( field ObjectType Names Owned By Service . size Ġ== Ġoverall Field . object Type Names . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn ĠState ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalias Helper Ġ= ĠN adel Alias Helper . for Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġ" type _ filter ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġoverall Field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Names Owned By Service Ġ= Ġtype Names Owned By Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ObjectType Names Owned By Service Ġ= Ġfield ObjectType Names Owned By Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverall Field Ġ= Ġoverall Field , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtransform Field ( ĊĠĠĠĠĠĠĠ Ġexecution Context : ĠN adel ExecutionContext , ĊĠĠĠĠĠĠĠ Ġtransformer : ĠN adel Query Transformer , ĊĠĠĠĠĠĠĠ Ġexecution Blueprint : ĠN adel Overall Execution Blueprint , ĊĠĠĠĠĠĠĠ Ġservice : ĠService , ĊĠĠĠĠĠĠĠ Ġfield : ĠExec utable Normalized Field , ĊĠĠĠĠĠĠĠ Ġstate : ĠState , ĊĠĠĠ Ġ): ĠN adel Transform Field Result Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġquery Ġif Ġthere Ġare Ġno Ġfields , Ġwe Ġneed Ġto Ġadd Ġselection ĊĠĠĠĠĠĠĠ Ġif Ġ( state . field ObjectType Names Owned By Service . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Type Names Ġ= Ġstate . overall Field . parent . getField Definitions ( execution Blueprint . schema ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfield Def Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Object Types ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Blueprint . schema , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġfield Def . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Not ObjectType Ġ= Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unable Ġto Ġresolve Ġto Ġobject Ġtype : Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġin Ġstate . type Names Owned By Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( object Type Names . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Service Ġdoes Ġnot Ġown Ġreturn Ġtype . ĠUnable Ġto Ġinsert Ġ__ typename Ġas Ġschema Ġis Ġnot Ġconfigured Ġproperly .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠN adel Transform Field Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Field Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ificial Fields Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Normalized Field () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. object Type Names ( object Type Names ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. alias ( state . alias Helper . typeName Result Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fieldName ( Int rospection . TypeName Meta Field Def . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠN adel Transform Field Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Field Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clear Object Types Names () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. object Type Names ( state . field ObjectType Names Owned By Service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Result Instructions ( ĊĠĠĠĠĠĠĠ Ġexecution Context : ĠN adel ExecutionContext , ĊĠĠĠĠĠĠĠ Ġexecution Blueprint : ĠN adel Overall Execution Blueprint , ĊĠĠĠĠĠĠĠ Ġservice : ĠService , ĊĠĠĠĠĠĠĠ Ġoverall Field : ĠExec utable Normalized Field , ĊĠĠĠĠĠĠĠ Ġunderlying Parent Field : ĠExec utable Normalized Field ?, ĊĠĠĠĠĠĠĠ Ġresult : ĠService Execution Result , ĊĠĠĠĠĠĠĠ Ġstate : ĠState , ĊĠĠĠĠĠĠĠ Ġnodes : ĠJson Nodes , ĊĠĠĠ Ġ): ĠList < N adel Result Instruction > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġtype Ġnames Ġa Ġservice Ġowns . ĠThese Ġare Ġthe Ġoverall Ġtype Ġnames . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ__ WARNING :__ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThese Ġalso Ġinclude Ġtypes Ġthat Ġare Ġnot Ġexposed , Ġso Ġuse Ġthis Ġlist Ġcarefully . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnly Ġuse Ġthis Ġto Ġcreate Ġsub sets Ġof ĠOTHER Ġlists . ĠNever Ġuse Ġthis Ġlist Ġdirectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetType Names Service Ow ns ( ĊĠĠĠĠĠĠĠ Ġexecution Blueprint : ĠN adel Overall Execution Blueprint , ĊĠĠĠĠĠĠĠ Ġservice : ĠService , ĊĠĠĠ Ġ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservice . underlying Schema ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. type Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Blueprint . get Overall TypeName ( service , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Under lying Type Names Service Ow ns ( ĊĠĠĠĠĠĠĠ Ġexecution Blueprint : ĠN adel Overall Execution Blueprint , ĊĠĠĠĠĠĠĠ Ġservice : ĠService , ĊĠĠĠĠĠĠĠ Ġoverall Type Names : ĠSet < String > ĊĠĠĠ Ġ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoverall Type Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Blueprint . get Under lying TypeName ( service , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} Ċ } Ċ