package Ġorg . neo 4 j . graphql Ċ Ċ import Ġgraphql . Scalars Ċ import Ġgraphql . int rospection . Int rospection Ċ import Ġgraphql . language .* Ċ import Ġgraphql . parser . Parser Ċ import Ġgraphql . schema .* Ċ import Ġgraphql . schema . idl . Runtime W iring Ċ import Ġgraphql . schema . idl . Schema Generator Ċ import Ġgraphql . schema . idl . Schema Parser Ċ import Ġgraphql . schema . idl . Type Definition Registry Ċ import Ġorg . antlr . v 4 . runtime . misc . Parse Cancellation Exception Ċ import Ġjava . lang . RuntimeException Ċ import Ġjava . util .* Ċ Ċ class ĠTrans lator ( val Ġschema : ĠGraphQL Schema ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠContext Ġ@ Jvm Over loads Ġconstructor ( val Ġtop Level Where : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragments Ġ: ĠMap < String , Fragment Definition > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemporal Ġ: ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery : ĠCRUD Config Ġ= ĠCRUD Config (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmutation : ĠCRUD Config Ġ= ĠCRUD Config ()) ĊĠĠĠ Ġdata Ġclass ĠCRUD Config ( val Ġenabled : Boolean Ġ= Ġtrue , Ġval Ġexclude : ĠList < String > Ġ= Ġempty List ()) ĊĠĠĠ Ġdata Ġclass ĠCy pher ( Ġval Ġquery : ĠString , Ġval Ġparams Ġ: ĠMap < String , Any ?> Ġ= Ġempty Map ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= ĠCy pher ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġwith ( p : ĠMap < String , Any ?> ) Ġ= Ġthis . copy ( params Ġ= Ġthis . params Ġ+ Ġp ) ĊĠĠĠĠĠĠĠ Ġfun Ġescaped Query () Ġ= Ġquery . replace ("\" "," \\ \"" ). replace ("' "," \\ '") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun Ġtranslate ( query : ĠString , Ġparams : ĠMap < String , ĠAny > Ġ= Ġempty Map (), Ġcontext : ĠContext Ġ= ĠContext ()) Ġ: ĠList < Cy pher > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparse ( query ) Ġ// Ġtodo Ġpre parsed Document Provider ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= Ġcontext . copy ( fragments Ġ= Ġast . definitions . filter Is Instance < Fragment Definition >(). map Ġ{ Ġit . name Ġto Ġit Ġ}. toMap ()) ĊĠĠĠĠĠĠĠ Ġval Ġqueries Ġ= Ġast . definitions . filter Is Instance < Operation Definition >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . operation Ġ== ĠOperation Definition . Operation . QUERY Ġ|| Ġit . operation Ġ== ĠOperation Definition . Operation . MUT ATION Ġ} Ġ// Ġtodo Ġvariable definitions , Ġdirectives , Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . selection Set . selections Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Field >() Ġ// ĠFragment Spread , ĠInline Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Query ( it , Ġctx ). with ( params ) Ġ} Ġ// Ġarguments , Ġalias , Ġdirectives , Ġselection Set ĊĠĠĠĠĠĠĠ Ġreturn Ġqueries ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Query ( field : ĠField , Ġctx : Context Ġ= ĠContext ()): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfield . name ĊĠĠĠĠĠĠĠ Ġval Ġquery Type Ġ= Ġschema . query Type . field Definitions . filter Ġ{ Ġit . name Ġ== Ġname Ġ}. first OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġmutation Type Ġ= Ġschema . mutation Type . field Definitions . filter Ġ{ Ġit . name Ġ== Ġname Ġ}. first OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġfield Definition Ġ= Ġquery Type Ġ?: Ġmutation Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Unknown ĠQuery Ġ$ name Ġavailable Ġqueries : Ġ" Ġ+ Ġschema . query Type . field Definitions . map Ġ{ Ġit . name Ġ}. join ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġis Query Ġ= Ġquery Type Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġfield Definition . type . inner () Ċ // ĠĠĠĠĠĠĠ Ġprintln ( returnType ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġschema . getType ( returnType . name ) ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġtype . name . quote () ĊĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġfield . alias Or Name (). de capitalize () ĊĠĠĠĠĠĠĠ Ġval Ġcy pher Directive Ġ= Ġfield Definition . cy pher Directive () ĊĠĠĠĠĠĠĠ Ġval Ġmap Projection Ġ= Ġproject Fields ( variable , Ġfield , Ġtype , Ġctx ) ĊĠĠĠĠĠĠĠ Ġval Ġskip Limit Ġ= Ġformat ( skip Limit ( field . arguments )) ĊĠĠĠĠĠĠĠ Ġval Ġordering Ġ= ĠorderBy ( variable , Ġfield . arguments ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cy pher Directive Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġfilters Ġand Ġsuch Ġfrom Ġnested Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcy pher Query Or Mutation ( variable , Ġfield Definition , Ġfield , Ġcy pher Directive , Ġmap Projection , Ġordering , Ġskip Limit , Ġis Query ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= Ġif Ġ( ctx . top Level Where ) Ġwhere ( variable , Ġfield Definition , Ġtype , Ġproperty Arguments ( field )) Ġelse ĠCy pher . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġif Ġ( ctx . top Level Where ) ĠCy pher . EMPTY Ġelse Ġproperties ( variable , Ġfield Definition , Ġproperty Arguments ( field )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCy pher (" MATCH Ġ($ variable :$ label ${ properties . query }) ${ where . query } ĠRETURN Ġ${ map Projection . query } ĠAS Ġ$ variable $ ordering $ skip Limit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( map Projection . params Ġ+ Ġproperties . params Ġ+ Ġwhere . params )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġextract Ġmethod Ġor Ġbetter Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġproperties ( variable , Ġfield Definition , Ġproperty Arguments ( field )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Property Ġ= Ġfield Definition . arguments . find Ġ{ Ġit . type . inner () Ġ== ĠScal ars . GraphQL ID Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Statement Ġ= Ġ" ĠWITH Ġ$ variable ĠRETURN Ġ${ map Projection . query } ĠAS Ġ$ variable $ ordering $ skip Limit "; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" create "+ type . name Ġ-> ĠCy pher (" CREATE Ġ($ variable :$ label ${ properties . query }) "+ return Statement , Ġ( map Projection . params Ġ+ Ġproperties . params )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" update "+ type . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Properties Ġ= Ġset Properties ( variable , Ġfield Definition , Ġproperty Arguments ( field )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher (" MATCH Ġ($ variable :$ label Ġ{ ${ id Property !!. name . quote ()} :\ $ ${ param Name ( variable , Ġid Property . name , Ġproperties . params [ id Property . name ]) }}) Ġ"+ set Properties . query Ġ+ Ġreturn Statement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( map Projection . params Ġ+ Ġset Properties . params )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" delete "+ type . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġparam Name ( variable , Ġid Property !!. name , Ġproperties . params [ id Property . name ]) Ġ// Ġtodo Ġcurrently Ġwrong , Ġneeds Ġto Ġbe Ġparam Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher (" MATCH Ġ($ variable :$ label Ġ{ ${ id Property . name . quote ()} :\ $$ param Name }) Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WITH Ġ$ variable Ġas Ġto Delete , Ġ${ map Projection . query } ĠAS Ġ$ variable Ġ$ ordering $ skip Limit ĠDET ACH ĠDELETE Ġto Delete ĠRETURN Ġ$ variable ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( map Projection . params Ġ+ Ġmap Of ( param Name Ġto Ġproperties . params [ param Name ]))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown ĠMutation Ġ"+ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcy pher Query Or Mutation ( variable : ĠString , Ġfield Definition : ĠGraphQL Field Definition , Ġfield : ĠField , Ġcy pher Directive : ĠCy pher , Ġmap Projection : ĠCy pher , Ġordering : ĠString , Ġskip Limit : ĠString , Ġis Query : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( query , Ġparams ) Ġ= Ġcy pher Directive ( variable , Ġfield Definition , Ġfield , Ġcy pher Directive , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher (" UN W IND Ġ$ query ĠAS Ġ$ variable ĠRETURN Ġ${ map Projection . query } ĠAS Ġ$ variable $ ordering $ skip Limit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( params Ġ+ Ġmap Projection . params )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( query , Ġparams ) Ġ= Ġcy pher Directive Query ( variable , Ġfield Definition , Ġfield , Ġcy pher Directive , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher (" CALL Ġap oc . cy pher . do It ($ query ) ĠY I ELD Ġvalue ĠWITH Ġvalue [ head ( keys ( value ))] ĠAS Ġ$ variable ĠRETURN Ġ${ map Projection . query } ĠAS Ġ$ variable $ ordering $ skip Limit ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( params Ġ+ Ġmap Projection . params )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġproperty Arguments ( query Field : ĠField ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Field . arguments . filter Not Ġ{ ĠlistOf (" first ", Ġ" offset ", Ġ" orderBy "). contains ( it . name ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠorderBy ( variable : ĠString , Ġargs : ĠMutable List < Argument >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs . find Ġ{ Ġit . name Ġ== Ġ" orderBy " Ġ&& Ġit . value Ġis ĠArray Value Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( arg Ġ== Ġnull ) Ġ"" ĊĠĠĠĠĠĠĠ Ġelse Ġ" ĠORDER ĠBY Ġ"+ Ġ( arg . value Ġas ĠArray Value ). values . map Ġ{ Ġit . to Java Value (). toString (). split ("_ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ"$ variable .${ it [ 0 ]} Ġ${ it [ 1 ]. toUpperCase () }" Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (", Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwhere ( variable : ĠString , Ġfield : ĠGraphQL Field Definition , Ġtype : ĠGraphQL Type , Ġarguments : ĠList < Argument >) Ġ: ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġprepare Predicate Arguments ( field , Ġarguments ). filter Not Ġ{ ĠlistOf (" first ", Ġ" offset ", Ġ" orderBy "). contains ( it . name ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( all . isEmpty ()) Ġreturn ĠCy pher ("") ĊĠĠĠĠĠĠĠ Ġval Ġ( filter Expressions , Ġfilter Params ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Expressions ( all . find { Ġit . name Ġ== Ġ" filter " Ġ} ?. value , Ġtype Ġas ĠGraphQL ObjectType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Expression ( variable , Ġschema ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġexpressions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions . map Ġ{ Ġit . first Ġ} Ġto Ġexpressions . fold ( empty Map < String , Any ?> ()) Ġ{ Ġres , Ġexp Ġ-> Ġres Ġ+ Ġexp . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġno Filter Ġ= Ġall . filter Ġ{ Ġit . name Ġ!= Ġ" filter " Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġturn Ġit Ġinto Ġa ĠPredicate Ġtoo ĊĠĠĠĠĠĠĠ Ġval Ġeq Expression Ġ= Ġno Filter . map Ġ{ Ġ( k , Ġp , Ġv ) Ġ-> Ġ"$ variable .${ p . quote ()} Ġ= Ġ\$ ${ param Name ( variable , Ġk , Ġv )}" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġ( eq Expression Ġ+ Ġfilter Expressions ). join Non Empty (" ĠAND Ġ") Ġ// ĠTODO Ġtalk Ġto ĠWill Ġ," (",") ") ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher (" ĠWHERE Ġ$ expression ", Ġfilter Params Ġ+ Ġno Filter . map Ġ{ Ġ( k , _, v ) Ġ-> Ġparam Name ( variable , Ġk , Ġv ) Ġto Ġv Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Expressions ( value : ĠAny ?, Ġtype : ĠGraphQL ObjectType ): ĠList < Predicate > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġvariable / parameter ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠMap < *, * >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompound Predicate ( value . map Ġ{ Ġ( k , Ġv ) Ġ-> Ġto Expression ( k . toString (), Ġv , Ġtype ) Ġ}, Ġ" AND "). parts ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproperties ( variable : ĠString , Ġfield : ĠGraphQL Field Definition , Ġarguments : ĠList < Argument >) Ġ: ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġprepare Predicate Arguments ( field , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ( all . map Ġ{ Ġ( k , p , Ġv ) Ġ-> Ġ"${ p . quote ()} :\ $ ${ param Name ( variable , Ġk , Ġv )} "} . join ToString (" Ġ, Ġ"," Ġ{ "," }") Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall . map Ġ{ Ġ( k , _, v ) Ġ-> Ġparam Name ( variable , Ġk , Ġv ) Ġto Ġv Ġ}. toMap ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġset Properties ( variable : ĠString , Ġfield : ĠGraphQL Field Definition , Ġarguments : ĠList < Argument >) Ġ: ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġprepare Predicate Arguments ( field , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ( all . map Ġ{ Ġ( k , p , Ġv ) Ġ-> Ġ"${ variable . quote ()}. ${ p . quote ()} =\ $ ${ param Name ( variable , Ġk , Ġv )} "} . join ToString (", "," ĠSET Ġ"," Ġ") Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall . map Ġ{ Ġ( k , _, v ) Ġ-> Ġparam Name ( variable , Ġk , Ġv ) Ġto Ġv Ġ}. toMap ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCy pher Argument ( val Ġname : String , Ġval ĠpropertyName : String , Ġval Ġvalue : Any ?) ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Predicate Arguments ( field : ĠGraphQL Field Definition , Ġarguments : ĠList < Argument >): ĠList < Cy pher Argument > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arguments . isEmpty ()) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġresult ObjectType Ġ= Ġschema . getType ( field . type . inner (). name ) Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġval Ġpredicates Ġ= Ġarguments . map Ġ{ Ġit . name Ġto ĠCy pher Argument ( it . name , Ġresult ObjectType . getField Definition ( it . name )?. property Directive Name () Ġ?: Ġit . name , Ġit . value . to Java Value ()) Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġval Ġdefaults Ġ= Ġfield . arguments . filter Ġ{ Ġit . defaultValue Ġ!= Ġnull Ġ&& Ġ! predicates . containsKey ( it . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCy pher Argument ( it . name , Ġit . name , Ġit . defaultValue ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpredicates . values Ġ+ Ġdefaults ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Field Arguments ( field : ĠGraphQL Field Definition , Ġarguments : ĠList < Argument >): ĠList < Cy pher Argument > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( arguments . isEmpty ()) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġpredicates Ġ= Ġarguments . map Ġ{ Ġit . name Ġto ĠCy pher Argument ( it . name , Ġit . name , Ġit . value . to Java Value ()) Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġval Ġdefaults Ġ= Ġfield . arguments . filter Ġ{ Ġit . defaultValue Ġ!= Ġnull Ġ&& Ġ! predicates . containsKey ( it . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCy pher Argument ( it . name , Ġit . name , Ġit . defaultValue ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpredicates . values Ġ+ Ġdefaults ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproject Fields ( variable : ĠString , Ġfield : ĠField , Ġtype : ĠGraphQL Type , Ġctx : ĠContext ): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġhandle Ġnon - object Ġcase ĊĠĠĠĠĠĠĠ Ġval Ġobject Type Ġ= Ġtype Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġfield . selection Set . selections . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠField Ġ-> ĠlistOf ( project Field ( variable , Ġit , Ġobject Type , Ġctx )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInline Fragment Ġ-> Ġproject Inline Fragment ( variable , Ġit , Ġobject Type , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFragment Spread Ġ-> Ġproject Named Fragments ( variable , Ġit , Ġobject Type , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= Ġproperties . map Ġ{ Ġit . query Ġ}. join ToString (",", Ġ"{ Ġ", Ġ" Ġ} ") ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġproperties . map { Ġit . params Ġ}. fold ( empty Map < String , Any ?> ()) Ġ{ Ġres , Ġmap Ġ-> Ġres Ġ+ Ġmap Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ("$ variable Ġ$ projection ", params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproject Field ( variable : ĠString , Ġfield : ĠField , Ġtype : ĠGraphQL ObjectType , Ġctx : Context ) Ġ: ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Definition Ġ= Ġtype . getField Definition ( field . name ) Ġ?: Ġthrow ĠIllegalStateException (" No Ġfield Ġ${ field . name } Ġin Ġ${ type . name }") ĊĠĠĠĠĠĠĠ Ġval Ġcy pher Directive Ġ= Ġfield Definition . cy pher Directive () ĊĠĠĠĠĠĠĠ Ġval Ġis Object Field Ġ= Ġfield Definition . type . inner () Ġis ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġreturn Ġcy pher Directive ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirective Ġ= Ġcy pher Directive ( variable , Ġfield Definition , Ġfield , Ġit , ĠlistOf ( Cy pher Argument (" this ", Ġ" this ", Ġvariable ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isObject Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Comp reh ensions Ġ= Ġproject List Comp reh ension ( variable , Ġfield , Ġfield Definition , Ġctx , directive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher ( field . alias Or Name () Ġ+ Ġ":" Ġ+ Ġpattern Comp reh ensions . query , Ġpattern Comp reh ensions . params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher ( field . alias Or Name () Ġ+ ":" Ġ Ġ+ Ġdirective . query , Ġdirective . params ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġif Ġ( isObject Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Comp reh ensions Ġ= Ġproject Relationship ( variable , Ġfield , Ġfield Definition , Ġtype , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher ( field . alias Or Name () Ġ+ Ġ":" Ġ+ Ġpattern Comp reh ensions . query , Ġpattern Comp reh ensions . params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . alias Or Name () Ġ== Ġfield . propertyName ( field Definition )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher (" ." Ġ+ Ġfield . propertyName ( field Definition )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCy pher ( field . alias Or Name () Ġ+ Ġ":" Ġ+ Ġvariable Ġ+ Ġ"." Ġ+ Ġfield . propertyName ( field Definition )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcy pher Directive ( variable : ĠString , Ġfield Definition : ĠGraphQL Field Definition , Ġfield : ĠField , Ġcy pher Directive : ĠCy pher , Ġadditional Args : ĠList < Cy pher Argument >): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuffix Ġ= Ġif Ġ( field Definition . type . is List ()) Ġ" Many " Ġelse Ġ" Single " ĊĠĠĠĠĠĠĠ Ġval Ġ( query , Ġargs ) Ġ= Ġcy pher Directive Query ( variable , Ġfield Definition , Ġfield , Ġcy pher Directive , Ġadditional Args ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher (" ap oc . cy pher . run First Column $ suffix ($ query )", Ġargs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcy pher Directive Query ( variable : ĠString , Ġfield Definition : ĠGraphQL Field Definition , Ġfield : ĠField , Ġcy pher Directive : ĠCy pher , Ġadditional Args : ĠList < Cy pher Argument >): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġadditional Args Ġ+ Ġprepare Field Arguments ( field Definition , Ġfield . arguments ) ĊĠĠĠĠĠĠĠ Ġval Ġarg Params Ġ= Ġargs . map Ġ{ Ġ'$ ' Ġ+ Ġit . name Ġ+ Ġ" ĠAS Ġ" Ġ+ Ġit . name Ġ}. join Non Empty (",") ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ( if Ġ( arg Params . isEmpty ()) Ġ"" Ġelse Ġ" WITH Ġ$ arg Params Ġ") Ġ+ Ġcy pher Directive . escaped Query () ĊĠĠĠĠĠĠĠ Ġval Ġarg String Ġ= Ġ( args . map Ġ{ Ġit . name Ġ+ Ġ':' Ġ+ Ġif Ġ( it . name Ġ== Ġ" this ") Ġit . value Ġelse Ġ(' $ ' Ġ+ Ġparam Name ( variable , Ġit . name , Ġit . value )) Ġ}). join ToString (",", Ġ"{ ", Ġ" }") ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ("' $ query ',$ arg String ", Ġargs . filter Ġ{ Ġit . name Ġ!= Ġ" this " Ġ}. associate Ġ{ Ġparam Name ( variable , Ġit . name , Ġit . value ) Ġto Ġit . value Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproject Named Fragments ( variable : ĠString , Ġfragment Spread : ĠFragment Spread , Ġtype : ĠGraphQL ObjectType , Ġctx : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . fragments . getValue ( fragment Spread . name ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Fragment ( it . type Condition . name , Ġtype , Ġvariable , Ġctx , Ġit . selection Set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproject Fragment ( fragment TypeName : ĠString ?, Ġtype : ĠGraphQL ObjectType , Ġvariable : ĠString , Ġctx : ĠContext , Ġselection Set : ĠSelection Set ): ĠList < Cy pher > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Type Ġ= Ġschema . getType ( fragment TypeName ) !! Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Type Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthese Ġare Ġthe Ġnested Ġfields Ġof Ġthe Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġcould Ġbe Ġthat Ġwe Ġhave Ġto Ġadapt Ġthe Ġvariable Ġname Ġtoo , Ġand Ġperhaps Ġadd Ġsome Ġkind Ġof Ġrename ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselection Set . selections . filter Is Instance < Field >(). map Ġ{ Ġproject Field ( variable , Ġit , Ġfragment Type , Ġctx ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproject Inline Fragment ( variable : ĠString , Ġfragment : ĠInline Fragment , Ġtype : ĠGraphQL ObjectType , Ġctx : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Fragment ( fragment . type Condition . name , Ġtype , Ġvariable , Ġctx , Ġfragment . selection Set ) ĊĊĊĠĠĠ Ġprivate Ġfun Ġproject Relationship ( variable : ĠString , Ġfield : ĠField , Ġfield Definition : ĠGraphQL Field Definition , Ġparent : ĠGraphQL ObjectType , Ġctx : ĠContext ): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Is Relationship Ġ= Ġparent . definition . directives ByName . containsKey (" relation ") ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( parent Is Relationship ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġproject Relationship Parent ( variable , Ġfield , Ġfield Definition , Ġparent , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġproject Rich And Regular Relationship ( variable , Ġfield , Ġfield Definition , Ġparent , Ġctx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproject List Comp reh ension ( variable : ĠString , Ġfield : ĠField , Ġfield Definition : ĠGraphQL Field Definition , Ġctx : ĠContext , Ġexpression : Cy pher ): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġfield Definition . type ĊĠĠĠĠĠĠĠ Ġval Ġfield ObjectType Ġ= ĠfieldType . inner () Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġval Ġchild Variable Ġ= Ġvariable Ġ+ Ġfield . name . capitalize () ĊĊĠĠĠĠĠĠĠ Ġ// Ġval Ġwhere Ġ= Ġwhere ( child Variable , Ġfield Definition , Ġfield ObjectType , Ġproperty Arguments ( field )) ĊĠĠĠĠĠĠĠ Ġval Ġfield Projection Ġ= Ġproject Fields ( child Variable , Ġfield , Ġfield ObjectType , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompreh ension Ġ= Ġ" [$ child Variable ĠIN Ġ${ expression . query } Ġ| Ġ${ field Projection . query }] " ĊĠĠĠĠĠĠĠ Ġval Ġskip Limit Ġ= Ġskip Limit ( field . arguments ) ĊĠĠĠĠĠĠĠ Ġval Ġslice Ġ= Ġslice ( skip Limit , ĠfieldType . is List ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ( comp reh ension Ġ+ Ġslice , Ġ( expression . params Ġ+ Ġfield Projection . params )) Ġ// Ġ+ Ġwhere . params ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġproject Rich And Regular Relationship ( variable : ĠString , Ġfield : ĠField , Ġfield Definition : ĠGraphQL Field Definition , Ġparent : ĠGraphQL ObjectType , Ġctx : ĠContext ): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġfield Definition . type ĊĠĠĠĠĠĠĠ Ġval Ġfield ObjectType Ġ= ĠfieldType . inner () Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġcombine Ġboth Ġnest ings Ġif Ġrel - entity ĊĠĠĠĠĠĠĠ Ġval Ġ( rel Directive , Ġis Rel From Type ) Ġ= Ġfield ObjectType . definition . get Directive (" relation ") ?. let Ġ{ Ġit Ġto Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfield Definition . definition . get Directive (" relation ") ?. let Ġ{ Ġit Ġto Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Field Ġ$ field Ġneeds Ġan Ġ@ relation Ġdirective ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġrel Info Ġ= Ġrel Details ( field ObjectType , Ġrel Directive ) ĊĠĠĠĠĠĠĠ Ġval Ġinverse Ġ= Ġis Rel From Type Ġ&& Ġfield ObjectType . getField Definition ( rel Info . start Field ). type . inner (). name Ġ!= Ġparent . name ĊĠĠĠĠĠĠĠ Ġif Ġ( inverse ) Ġrel Info Ġ= Ġrel Info . copy ( out Ġ= Ġrel Info . out ?. let Ġ{ Ġ! it Ġ}, Ġstart Field Ġ= Ġrel Info . end Field , Ġend Field Ġ= Ġrel Info . start Field ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( in Arrow , Ġout Arrow ) Ġ= Ġrel Info . arrows ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Variable Ġ= Ġvariable Ġ+ Ġfield . name . capitalize () ĊĊĠĠĠĠĠĠĠ Ġval Ġend Node Pattern Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Rel From Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġfield ObjectType . getField Definition ( rel Info . end Field !! ). type . inner (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ child Variable ${ rel Info . end Field !!. capitalize ()} :$ label " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ child Variable :${ field ObjectType . name }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrel Pattern Ġ= Ġif Ġ( is Rel From Type ) Ġ"$ child Variable :${ rel Info . type }" Ġelse Ġ": ${ rel Info . type }" ĊĊĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= Ġwhere ( child Variable , Ġfield Definition , Ġfield ObjectType , Ġproperty Arguments ( field )) ĊĠĠĠĠĠĠĠ Ġval Ġfield Projection Ġ= Ġproject Fields ( child Variable , Ġfield , Ġfield ObjectType , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcompreh ension Ġ= Ġ"[ ($ variable )$ in Arrow - [$ rel Pattern ]- $ out Arrow ($ end Node Pattern ) ${ where . query } Ġ| Ġ${ field Projection . query }] " ĊĠĠĠĠĠĠĠ Ġval Ġskip Limit Ġ= Ġskip Limit ( field . arguments ) ĊĠĠĠĠĠĠĠ Ġval Ġslice Ġ= Ġslice ( skip Limit , ĠfieldType . is List ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ( comp reh ension Ġ+ Ġslice , Ġ( where . params Ġ+ Ġfield Projection . params )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproject Relationship Parent ( variable : ĠString , Ġfield : ĠField , Ġfield Definition : ĠGraphQL Field Definition , Ġparent : ĠGraphQL ObjectType , Ġctx : ĠContext ): ĠCy pher Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġfield Definition . type ĊĠĠĠĠĠĠĠ Ġval Ġfield ObjectType Ġ= ĠfieldType . inner () Ġas ĠGraphQL ObjectType ĊĠĠĠĠĠĠĠ Ġval Ġrel Directive Ġ= Ġparent . definition . directives ByName . getValue (" relation ") ĊĠĠĠĠĠĠĠ Ġvar Ġrel Info Ġ= Ġrel Details ( field ObjectType , Ġrel Directive ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinverse Ġ= Ġparent . getField Definition ( rel Info . end Field !! ). type . inner (). name Ġ!= Ġfield ObjectType . name ĊĠĠĠĠĠĠĠ Ġif Ġ( inverse ) Ġrel Info Ġ= Ġrel Info . copy ( out Ġ= Ġrel Info . out ?. let Ġ{ Ġ! it Ġ}, Ġstart Field Ġ= Ġrel Info . end Field , Ġend Field Ġ= Ġrel Info . start Field ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfield Projection Ġ= Ġproject Fields ( variable Ġ+ Ġrel Info . end Field !!. capitalize (), Ġfield , Ġfield ObjectType , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCy pher ( field Projection . query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrel Details ( target : GraphQL ObjectType , Ġrel Directive : ĠDirective ) Ġ= Ġrel Details ( target , Ġrel Directive , Ġschema ) ĊĊĠĠĠ Ġprivate Ġfun Ġslice ( skip Limit : ĠPair < Int , ĠInt >, Ġlist : ĠBoolean Ġ= Ġfalse ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Limit . first Ġ== Ġ 0 Ġ&& Ġskip Limit . second Ġ== Ġ- 1 ) Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( skip Limit . second Ġ== Ġ- 1 ) Ġ"[ ${ skip Limit . first } .. ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"[ ${ skip Limit . first } .. ${ skip Limit . first Ġ+ Ġskip Limit . second }] " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ"[ ${ skip Limit . first }] " ĊĊĠĠĠ Ġprivate Ġfun Ġformat ( skip Limit : ĠPair < Int , ĠInt >) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( skip Limit . first Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Limit . second Ġ> Ġ- 1 ) Ġ" ĠSKIP Ġ${ skip Limit . first } ĠLIMIT Ġ${ skip Limit . second }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" ĠSKIP Ġ${ skip Limit . first }" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Limit . second Ġ> Ġ- 1 ) Ġ" ĠLIMIT Ġ${ skip Limit . second }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Limit ( arguments : ĠList < Argument >): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġnumeric Argument ( arguments , Ġ" first ", Ġ- 1 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġnumeric Argument ( arguments , Ġ" offset "). toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġskip Ġto Ġlimit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnumeric Argument ( arguments : ĠList < Argument >, Ġname : ĠString , ĠdefaultValue : ĠNumber Ġ= Ġ 0 ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( arguments . find Ġ{ Ġit . name . toLowerCase () Ġ== Ġname Ġ} ?. value ?. to Java Value () Ġas ĠNumber ?) Ġ?: ĠdefaultValue ĊĊĊĠĠĠ Ġprivate Ġfun Ġto Cy pher String ( value : Any , Ġtype : ĠGraphQL Type Ġ): ĠString Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ"' "+ value +" '" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse ( query : String ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparser . parse Document ( query ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParse Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġproper Ġstructured Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ object ĠSchema Builder Ġ{ ĊĠĠĠ Ġ@ Jvm Static Ġfun Ġbuild Schema ( sdl : ĠString , Ġctx : ĠTrans lator . Context Ġ= ĠTrans lator . Context () Ġ) Ġ: ĠGraphQL Schema Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Parser Ġ= ĠSchema Parser () ĊĠĠĠĠĠĠĠ Ġval Ġtype Definition Registry Ġ= Ġaugment Schema ( schema Parser . parse ( sdl ), Ġschema Parser , Ġctx ) ĊĊĠĠĠĠĠĠĠ Ġval Ġruntime W iring Ġ= ĠRuntime W iring . new Runtime W iring () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. type (" Query ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . data Fetcher (" hello ") Ġ{ Ġenv Ġ-> Ġ" Hello Ġ${ env . get Argument < Any >(" what ")} !" Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Generator Ġ= ĠSchema Generator () ĊĠĠĠĠĠĠĠ Ġreturn Ġschema Generator . make Executable Schema ( type Definition Registry , Ġruntime W iring ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Ġ{ Ġbc Ġ-> Ġbc . additional Directives ( additional Directives ()). build () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Ġ{ Ġsc Ġ-> Ġsc . build () Ġ} Ġ// Ġtodo Ġadd Ġnew Ġqueries , Ġfilters , Ġenums Ġetc . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadditional Directives (): ĠSet < GraphQL Directive > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectives Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Directive . new Directive (). name (" property "). description (" additional Ġmetadata Ġper Ġfield ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. argument { Ġb Ġ-> Ġb . name (" name "). description (" name Ġof Ġthe Ġgraph Ġproperty "). type ( Scalars . GraphQL String )}. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Directive (" relation ", Ġ" relation Ġdirective ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Set . of ( Int rospection . Directive Location . FIELD , ĠInt rospection . Directive Location . OBJECT ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( GraphQL Argument (" name ", ĠScal ars . GraphQL String ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Argument (" direction ", Ġ" relationship Ġdirection ", ĠScal ars . GraphQL String , Ġ" OUT "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Argument (" from ", Ġ" from Ġfield Ġname ", ĠScal ars . GraphQL String , Ġ" from "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphQL Argument (" to ", Ġ" to Ġfield Ġname ", ĠScal ars . GraphQL String , Ġ" to ")), Ġfalse , Ġfalse , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġreturn Ġdirectives ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaugment Schema ( type Definition Registry : ĠType Definition Registry , Ġschema Parser : ĠSchema Parser , Ġctx : ĠTrans lator . Context ): ĠType Definition Registry Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġaugment ations Ġ= Ġtype Definition Registry . types (). values . filter Is Instance < ObjectType Definition >(). map Ġ{ Ġaugment ed Schema ( ctx , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaugment ed Types S dl Ġ= Ġaugment ations . flatMap Ġ{ ĠlistOf ( it . filter Type , Ġit . ordering , Ġit . input Type ). filter Ġ{ Ġit . isNotBlank () Ġ} Ġ}. join ToString ("\ n ") ĊĠĠĠĠĠĠĠ Ġtype Definition Registry . merge ( schema Parser . parse ( augment ed Types S dl )) ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Definition Ġ= Ġtype Definition Registry . schema Definition (). orElse Get Ġ{ ĠSchema Definition () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! type Definition Registry . schema Definition (). isPresent ) Ġtype Definition Registry . add ( schema Definition ). if Present Ġ{ Ġthrow ĠRuntimeException ( it . to Specification (). toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoperations Ġ= Ġschema Definition . operation Type Definitions . associate Ġ{ Ġit . name Ġto Ġtype Definition Registry . getType ( it . type ). get () Ġas ĠObjectType Definition Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Definition Ġ= Ġoperations . getOrElse (" query ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObjectType Definition (" Query "). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Definition . operation Type Definitions . add ( Operation Type Definition (" query ", ĠType Name ( it . name ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Definition Registry . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmutation Definition Ġ= Ġoperations . getOrElse (" mutation ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObjectType Definition (" Mutation "). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema Definition . operation Type Definitions . add ( Operation Type Definition (" mutation ", ĠType Name ( it . name ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Definition Registry . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġbetter Ġfilter ĊĠĠĠĠĠĠĠ Ġaugment ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . query . isNotBlank () Ġ&& Ġquery Definition . field Definitions . none Ġ{ Ġfd Ġ-> Ġit . query . startsWith ( fd . name +" (" ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . query Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Queries Ġ= Ġschema Parser . parse (" type ĠAug ment ed Query Ġ{ Ġ${ it . join ToString ("\ n ")} Ġ} "). getType (" Aug ment ed Query "). get () Ġas ĠObjectType Definition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Definition . field Definitions . addAll ( new Queries . field Definitions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaugment ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠlistOf ( it . create , it . update , it . delete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter { Ġit . isNotBlank () Ġ&& Ġmutation Definition . field Definitions . none Ġ{ Ġfd Ġ-> Ġit . startsWith ( fd . name +" (" ) Ġ} Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Queries Ġ= Ġschema Parser . parse (" type ĠAug ment ed Mutation Ġ{ Ġ${ it . join ToString ("\ n ")} Ġ} "). getType (" Aug ment ed Mutation "). get () Ġas ĠObjectType Definition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutation Definition . field Definitions . addAll ( new Queries . field Definitions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype Definition Registry ĊĠĠĠ Ġ} Ċ }