/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠExp edia , ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . exp edi ag roup . graphql . dataloader . instrumentation . sync ex haust ion . state Ċ Ċ import Ġgraphql . Execution Input Ċ import Ġgraphql . execution . Result Path Ċ import Ġgraphql . language . Field Ċ import Ġgraphql . schema . Data Fetcher Ċ import Ġgraphql . schema . GraphQL Type Ċ import Ġgraphql . schema . GraphQL Type Util . is List Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ /** Ċ Ġ* ĠHold Ġand Ġcalculate Ġthe Ġstate Ġof Ġa Ġgiven Ġ[ Execution Input ] Ġby Ġholding Ġand Ġtracking Ġinformation Ġof Ġall ĠExecution ĠStr ategies Ġthat Ċ Ġ* Ġwere Ġexecuted Ġto Ġresolve Ġthe Ġ[ Execution Input ]. Ċ Ġ* Ċ Ġ* ĠExample : Ċ Ġ* Ċ Ġ* Ġgiven Ġthis Ġ[ Execution Input ] Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġquery Ġget A str on aut Ġ{ Ċ Ġ* ĠĠ Ġa str on aut ( id : Ġ 1 ) Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġid Ċ Ġ* ĠĠĠĠĠ Ġname Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠWhen Ġthe Ġ[ Execution Batch State ] Ġwill Ġbe Ġconsidered Ġex hausted Ġwill Ġhave Ġthis Ġstate : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ{ Ċ Ġ* ĠĠ Ġ"/ ": Ġ{ Ċ Ġ* ĠĠĠĠ Ġ" dis patched F etches ": Ġ 1 , Ċ Ġ* ĠĠĠĠĠĠ Ġ" fields State ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" astr on aut ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" fetch State ": Ġ" DISPATCH ED ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" fetch Type ": Ġ" ASYNC ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" result ": Ġnull , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" execution Strategy Paths ": Ġ[] Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġonce Ġa str on aut Ġ[ Data Fetcher ] Ġcompletes Ġhis Ġvalue Ġstarting Ġa Ġnew ĠExecution Strategy Ġfor Ġ` astr on aut ` Ġfield Ġfor Ċ Ġ* Ġthe Ġresolution Ġof Ġ` id `, Ġand Ġ` name `, Ġonce Ġthese Ġfields Ġare Ġdis patched Ġand Ġcompleted Ċ Ġ* Ġand Ġex haust ion Ġwill Ġbe Ġcalculated Ġagain Ġand Ġthe Ġstate Ġof Ġ[ Execution Batch State ] Ġwill Ġbe Ġthe Ġfollowing : Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ{ Ċ Ġ* ĠĠ Ġ"/ ": Ġ{ Ċ Ġ* ĠĠĠĠ Ġ" dis patched F etches ": Ġ 1 , Ċ Ġ* ĠĠĠĠĠĠ Ġ" fields State ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" astr on aut ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" fetch State ": Ġ" COMPLETED ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" fetch Type ": Ġ" ASYNC ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" result ": Ġ{ Ġ... Ġ}, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ" execution Strategy Paths ": Ġ["/ astr on aut "] Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠ Ġ}, Ċ Ġ* ĠĠ Ġ"/ astr on aut ": Ġ{ Ċ Ġ* ĠĠĠĠ Ġ" dis patched F etches ": Ġ 2 , Ċ Ġ* ĠĠĠĠ Ġ" fields State ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠ Ġ" id ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" fetch State ": Ġ" COMPLETED ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" fetch Type ": Ġ" SYNC ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" execution Strategy Paths ": Ġ[] Ċ Ġ* ĠĠĠĠĠĠ Ġ}, Ċ Ġ* ĠĠĠĠĠĠ Ġ" name ": Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" fetch State ": Ġ" COMPLETED ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" fetch Type ": Ġ" SYNC ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" execution Strategy Paths ": Ġ[] Ċ Ġ* ĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠExecution Batch State Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġexecution Str ategies State : ĠConcurrent HashMap < String , ĠExecution Strategy State > Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġadd Ġan Ġ[ Execution Strategy State ] Ġinto Ġ[ execution Str ategies State ] Ġwhich Ġstate Ġwill Ġbe Ġchanged Ġwhen Ġa Ġfield ĊĠĠĠĠ Ġ* Ġdis patches Ġor Ġcompletes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Ġa Ġnullable Ġ[ Field ] Ġthat Ġrepresents Ġthe Ġfield Ġthat Ġjust Ġstarted Ġan Ġexecution Strategy , Ġthe ĠONLY Ġuse Ġcase Ġwhere Ġthis ĊĠĠĠĠ Ġ* Ġparam Ġcould Ġbe Ġnull Ġis Ġwhen Ġthe Ġroot Ġexecution Strategy Ġstarts . ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Execution Strategy Path Ġthe Ġ[ Result Path ] Ġof Ġthe Ġfield Ġthat Ġjust Ġstarted Ġan Ġexecution Strategy , Ġexample : Ġ` "/ astr on aut "`, Ġ`" /" `. ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Selections Ġthe Ġlist Ġof Ġ[ Field ] s Ġthat Ġthe Ġexecution Strategy Ġwill Ġattempt Ġto Ġresolve . ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Field GraphQL Type Ġthe Ġ[ GraphQL Type ] Ġof Ġthe Ġparent Ġ[ field ] Ġthat Ġwill Ġstart Ġan Ġexecution Ġstrategy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Execution Strategy State ( ĊĠĠĠĠĠĠĠ Ġfield : ĠField ?, ĊĠĠĠĠĠĠĠ Ġfield Execution Strategy Path : ĠResult Path , ĊĠĠĠĠĠĠĠ Ġfield Selections : ĠList < Field >, ĊĠĠĠĠĠĠĠ Ġparent Field GraphQL Type : ĠGraphQL Type ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Execution Strategy Path String Ġ= Ġfield Execution Strategy Path . toString () ĊĊĠĠĠĠĠĠĠ Ġexecution Str ategies State . compute If Absent ( field Execution Strategy Path String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecution Strategy State ( field Selections ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Field Execution Strategy Path String Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis List ( parent Field GraphQL Type ) Ġ-> Ġfield Execution Strategy Path . parent ?. parent ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfield Execution Strategy Path . parent ?. toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġparent Field Execution Strategy Path String ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Str ategies State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compute If Present ( parent Field Execution Strategy Path String ) Ġ{ Ġ_, Ġparent Execution Strategy State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Execution Strategy State . fields State [ field ?. result Key ]?. add Execution Strategy Path ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Execution Strategy Path String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Execution Strategy State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġa Ġtransition Ġon Ġthe Ġ[ field ] Ġto Ġdis patched Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Ġthe Ġ[ Field ] Ġthat Ġwill Ġtransition Ġto Ġdis patched Ġstate . ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Execution Strategy Path Ġthe Ġ[ Result Path ] Ġassociated Ġto Ġthe ĠExecution Strategy Ġthat Ġdis patched Ġthe Ġ[ field ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġfield GraphQL Type Ġthe Ġ[ GraphQL Type ] Ġof Ġthe Ġ[ field ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġresult Ġthe Ġ[ Data Fetcher ] Ġ[ Comp letableFuture ] Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfield To Dis patched State ( ĊĠĠĠĠĠĠĠ Ġfield : ĠField , ĊĠĠĠĠĠĠĠ Ġfield Execution Strategy Path : ĠResult Path , ĊĠĠĠĠĠĠĠ Ġfield GraphQL Type : ĠGraphQL Type , ĊĠĠĠĠĠĠĠ Ġresult : ĠCompletableFuture < Any ?> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Execution Strategy Path String Ġ= Ġfield Execution Strategy Path . toString () ĊĠĠĠĠĠĠĠ Ġexecution Str ategies State [ field Execution Strategy Path String ]?. let Ġ{ Ġexecution Strategy State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Strategy State . fields State [ field . result Key ]?. to Dis patched State ( field GraphQL Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Path To Not Ex hausted State ( field Execution Strategy Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġa Ġtransition Ġon Ġthe Ġ[ field ] Ġto Ġcompleted Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Ġthe Ġ[ Field ] Ġthat Ġwill Ġtransition Ġto Ġcompleted Ġstate . ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Execution Strategy Path Ġthe Ġ[ Result Path ] Ġassociated Ġto Ġthe ĠExecution Strategy Ġthat Ġcompleted Ġthe Ġ[ field ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġresult Ġthe Ġnullable Ġ[ Any ] Ġresult Ġof Ġthe Ġ[ Data Fetcher ] Ġwhen Ġits Ġcompleted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfield To Completed State ( ĊĠĠĠĠĠĠĠ Ġfield : ĠField , ĊĠĠĠĠĠĠĠ Ġfield Execution Strategy Path : ĠResult Path , ĊĠĠĠĠĠĠĠ Ġresult : ĠAny ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Execution Strategy Path String Ġ= Ġfield Execution Strategy Path . toString () ĊĠĠĠĠĠĠĠ Ġexecution Str ategies State [ field Execution Strategy Path String ]?. let Ġ{ Ġexecution Strategy State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Strategy State . fields State [ field . result Key ]?. to Completed State ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Path To Not Ex hausted State ( field Execution Strategy Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġcalculate Ġthe Ġsync Ġstate Ġof Ġthis Ġ[ Execution Batch State ], ĊĠĠĠĠ Ġ* Ġby Ġtra ver sing Ġall Ġ[ execution Str ategies State ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexecution Strategy Path Ġthe Ġstring Ġrepresentation Ġof Ġthe Ġexecution Strategy Ġwhich Ġstate Ġwill Ġbe Ġcalculated , ĊĠĠĠĠ Ġ* Ġdefaults Ġto Ġ[ ROOT _ EXEC UTION _ STR ATE GY _ PATH ] Ġto Ġstart Ġf om Ġthe Ġroot Ġ[ Execution Strategy State ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Sync Execution Ex hausted ( ĊĠĠĠĠĠĠĠ Ġexecution Strategy Path : ĠString Ġ= ĠROOT _ EXEC UTION _ STR ATE GY _ PATH ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecution Strategy State Ġ= Ġthis . execution Str ategies State [ execution Strategy Path ] Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! execution Strategy State . all Fields Vis ited ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( execution Strategy State . is Sync State Ex hausted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexecution Strategy State . fields State . all Ġ{ Ġ(_, Ġstate ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . is Completed ListOf Complex Objects () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . execution Strategy Paths . all Ġ{ Ġexecution Strategy Path Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync Execution Ex hausted ( execution Strategy Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . is Completed Complex Object () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sync Execution Ex hausted ( state . execution Strategy Paths . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . is Completed Leaf OrNull () Ġ|| Ġstate . is Async Dis patched Not Leaf () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġis Ex hausted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġin Ġorder Ġto Ġavoid Ġsome Ġcomput ations Ġwe Ġcan Ġstore Ġthe Ġ[ Execution Strategy Sync State ] Ġthat Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġjust Ġcalculated . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ex hausted Ġ-> Ġexecution Strategy State . transition To ( Execution Strategy Sync State . EX HA UST ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexecution Strategy State . transition To ( Execution Strategy Sync State . NOT _ EX HA UST ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġthe Ġ[ Execution Strategy Sync State ] Ġof Ġeach Ġ[ Execution Strategy State ] Ġfrom Ġ[ origin ] Ġpath Ġto Ġroot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġorigin Ġ[ Result Path ] Ġfrom Ġwhere Ġthe Ġ[ Execution Strategy Sync State ] Ġwill Ġbe Ġreset ĊĠĠĠĠ Ġ* Ġup Ġto Ġthe Ġroot Ġ[ Execution Strategy State ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Path To Not Ex hausted State ( ĊĠĠĠĠĠĠĠ Ġorigin : ĠResult Path ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Path : ĠResult Path ? Ġ= Ġorigin ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Str ategies State [ current Path . toString ()] ?. transition To ( Execution Strategy Sync State . NOT _ EX HA UST ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= Ġcurrent Path . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠROOT _ EXEC UTION _ STR ATE GY _ PATH : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ} Ċ } Ċ