package Ġgraphql . n adel . engine kt . transform . hyd ration Ċ Ċ import Ġgraphql . language . Array Value Ċ import Ġgraphql . language . Boolean Value Ċ import Ġgraphql . language . Float Value Ċ import Ġgraphql . language . Int Value Ċ import Ġgraphql . language . NullValue Ċ import Ġgraphql . language . Object Field Ċ import Ġgraphql . language . Object Value Ċ import Ġgraphql . language . StringValue Ċ import Ġgraphql . language . Value Ċ import Ġgraphql . n adel . engine kt . blueprint . N adel H yd ration Field Instruction Ċ import Ġgraphql . n adel . engine kt . blueprint . hyd ration . N adel H yd ration Actor Input Def Ċ import Ġgraphql . n adel . engine kt . blueprint . hyd ration . N adel H yd ration Actor Input Def . Value Source Ċ import Ġgraphql . n adel . engine kt . blueprint . hyd ration . N adel H yd ration Strategy Ċ import Ġgraphql . n adel . engine kt . transform . art ificial . N adel Alias Helper Ċ import Ġgraphql . n adel . engine kt . transform . result . json . JsonNode Ċ import Ġgraphql . n adel . engine kt . transform . result . json . JsonNode Extractor Ċ import Ġgraphql . n adel . engine kt . util . Any List Ċ import Ġgraphql . n adel . engine kt . util . Any Map Ċ import Ġgraphql . n adel . engine kt . util . as Json Map Ċ import Ġgraphql . n adel . engine kt . util . empty Or Single Ċ import Ġgraphql . n adel . engine kt . util . flatten Ċ import Ġgraphql . n adel . engine kt . util . map From Ċ import Ġgraphql . normalized . Executable Normalized Field Ċ import Ġgraphql . normalized . Normalized Input Value Ċ import Ġgraphql . schema . GraphQL Argument Ċ import Ġgraphql . schema . GraphQL Type Util Ċ Ċ internal Ġtype alias ĠAny Ast Value Ġ= ĠValue < *> Ċ Ċ internal Ġobject ĠN adel H yd ration Input Builder Ġ{ ĊĠĠĠ Ġfun Ġget Input Values ( ĊĠĠĠĠĠĠĠ Ġinstruction : ĠN adel H yd ration Field Instruction , ĊĠĠĠĠĠĠĠ Ġalias Helper : ĠN adel Alias Helper , ĊĠĠĠĠĠĠĠ Ġhy dr ated Field : ĠExec utable Normalized Field , ĊĠĠĠĠĠĠĠ Ġparent Node : ĠJsonNode , ĊĠĠĠ Ġ): ĠList < Map < String , ĠNormal ized Input Value >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Defs ForAll Calls Ġ= Ġinstruction . actor Input Value Defs . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdefs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġh yd ration Strategy Ġ= Ġinstruction . hyd ration Strategy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN adel H yd ration Strategy . One ToOne Ġ-> Ġdefs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN adel H yd ration Strategy . ManyToOne Ġ-> Ġdefs . filter Ġ{ Ġdef Ġ-> Ġdef Ġ!= Ġh yd ration Strategy . input Def To Split Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġargs ForAll Calls Ġ= Ġmap From ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Defs ForAll Calls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġactor Input Def Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Def Ġ= Ġinstruction . actor Field Def . get Argument ( actor Input Def . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Value Ġ= Ġmake Input Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactor Input Def Ġ= Ġactor Input Def , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Def Ġ= Ġargument Def , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Node Ġ= Ġparent Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh yd ration Field Ġ= Ġhy dr ated Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalias Helper Ġ= Ġalias Helper , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactor Input Def . name Ġto Ġinput Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġh yd ration Strategy Ġ= Ġinstruction . hyd ration Strategy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN adel H yd ration Strategy . One ToOne Ġ-> ĠlistOf ( args ForAll Calls ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN adel H yd ration Strategy . ManyToOne Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Def To Split Ġ= Ġh yd ration Strategy . input Def To Split ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues To Split Ġ= Ġwhen Ġ( val Ġvalue Source Ġ= Ġinput Def To Split . value Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValue Source . Field Result Value Ġ-> Ġget Result Values ( value Source , Ġparent Node , Ġalias Helper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Can Ġonly Ġsplit Ġfield Ġresult Ġvalue Ġinto Ġmultiple Ġh yd ration Ġcalls ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues To Split ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten ( re cursively Ġ= Ġtrue ) Ġ// ĠH on est ly : ĠI Ġthink Ġwe Ġneed Ġto Ġre visit Ġthis , Ġwe Ġkind Ġof Ġmake Ġbig Ġassumptions Ġon Ġthe Ġschema ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Value Per Call Ġ= Ġinput Def To Split . name Ġto Ġmake Normalized Input Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Def To Split . actor Argument Def , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue To Ast Value ( value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs ForAll Calls Ġ+ Ġinput Value Per Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Input Value ( ĊĠĠĠĠĠĠĠ Ġactor Input Def : ĠN adel H yd ration Actor Input Def , ĊĠĠĠĠĠĠĠ Ġargument Def : ĠGraphQL Argument , ĊĠĠĠĠĠĠĠ Ġparent Node : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġh yd ration Field : ĠExec utable Normalized Field , ĊĠĠĠĠĠĠĠ Ġalias Helper : ĠN adel Alias Helper , ĊĠĠĠ Ġ): ĠNormal ized Input Value ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġvalue Source Ġ= Ġactor Input Def . value Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValue Source . Argument Value Ġ-> Ġh yd ration Field . get Normalized Argument ( value Source . argument Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValue Source . Field Result Value Ġ-> Ġmake Normalized Input Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Def , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue To Ast Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Result Value ( value Source , Ġparent Node , Ġalias Helper ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Result Value ( ĊĠĠĠĠĠĠĠ Ġvalue Source : ĠValue Source . Field Result Value , ĊĠĠĠĠĠĠĠ Ġparent Node : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġalias Helper : ĠN adel Alias Helper , ĊĠĠĠ Ġ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJsonNode Extractor . get Nodes At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Node Ġ= Ġparent Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Path Ġ= Ġalias Helper . getQuery Path ( value Source . query Path To Field ), ĊĠĠĠĠĠĠĠ Ġ). empty Or Single ()?. value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Result Values ( ĊĠĠĠĠĠĠĠ Ġvalue Source : ĠValue Source . Field Result Value , ĊĠĠĠĠĠĠĠ Ġparent Node : ĠJsonNode , ĊĠĠĠĠĠĠĠ Ġalias Helper : ĠN adel Alias Helper , ĊĠĠĠ Ġ): ĠList < Any ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJsonNode Extractor . get Nodes At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Node Ġ= Ġparent Node , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Path Ġ= Ġalias Helper . getQuery Path ( value Source . query Path To Field ), ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Normalized Input Value ( ĊĠĠĠĠĠĠĠ Ġargument Def : ĠGraphQL Argument , ĊĠĠĠĠĠĠĠ Ġvalue : ĠAny Ast Value , ĊĠĠĠ Ġ): ĠNormal ized Input Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNormal ized Input Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Type Util . simple Print ( argument Def . type ), Ġ// Ġtype Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , Ġ// Ġvalue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalue To Ast Value ( value : ĠAny ?): ĠAny Ast Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny List Ġ-> ĠArray Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . map ( this :: value To Ast Value ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Map Ġ-> ĠObject Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. new Object Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. object Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . as Json Map (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject Field ( it . key , Ġvalue To Ast Value ( it . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠNull Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. new NullValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> ĠFloat Value . new Float Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( value . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> ĠFloat Value . new Float Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( value . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber Ġ-> ĠInt Value . new Int Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( value . to Long (). to BigInteger ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠString Value . new StringValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> ĠBoolean Value . new Boolean Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġvalue Ġtype Ġ'${ value . java Class . name }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ