/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . fed eration . execution Ċ Ċ import Ġgraphql . Graph Q LError Ċ import Ġgraphql . execution . Data Fetcher Result Ċ import Ġgraphql . schema . Data Fetcher Ċ import Ġgraphql . schema . Data Fetching Environment Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . future . future Ċ Ċ private Ġconst Ġval ĠTYP ENAME _ FIELD Ġ= Ġ"__ typename " Ċ private Ġconst Ġval ĠRE PRESENT ATIONS Ġ= Ġ" represent ations " Ċ Ċ /** Ċ Ġ* ĠF ederated Ġ_ entities Ġquery Ġresolver . Ċ Ġ*/ Ċ open Ġclass ĠEntity Resolver ( resolvers : ĠList < F ederated Type Resolver <* >>) Ġ: ĠData Fetcher < Comp letableFuture < Data Fetcher Result < List < Any ? >>>> Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPre - compute Ġthe Ġresolves Ġby Ġtypename Ġso Ġwe Ġdon 't Ġhave Ġto Ġsearch Ġon Ġevery Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġresolver Map : ĠMap < String , ĠF ederated Type Resolver <* >> Ġ= Ġresolver s . associate By Ġ{ Ġit . typeName Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes olves Ġentities Ġbased Ġon Ġthe Ġpassed Ġin Ġrepresentations Ġargument . ĠEntities Ġare Ġresolved Ġin Ġthe Ġsame Ġorder ĊĠĠĠĠ Ġ* Ġthey Ġare Ġspecified Ġin Ġthe Ġlist Ġof Ġrepresentations . ĠIf Ġtarget Ġrepresentation Ġcannot Ġbe Ġresolved , ĠNULL Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġreturned Ġinstead . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠRepresent ations Ġare Ġgrouped Ġby Ġthe Ġunderlying Ġtypename Ġand Ġeach Ġbatch Ġis Ġresolved Ġasynchronously Ġbefore Ġmerging ĊĠĠĠĠ Ġ* Ġthe Ġresults Ġback Ġinto Ġa Ġsingle Ġlist Ġthat Ġpre serves Ġthe Ġoriginal Ġorder . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġresolved Ġnullable Ġentities ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget ( env : ĠData Fetching Environment ): ĠCompletableFuture < Data Fetcher Result < List < Any ? >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepresentations : ĠList < Map < String , ĠAny >> Ġ= Ġenv . get Argument ( RE PRESENT ATIONS ) ĊĠĠĠĠĠĠĠ Ġval Ġindexed Batch Requests ByType Ġ= Ġrepresentations . with Index (). groupBy Ġ{ Ġit . value [ TYP ENAME _ FIELD ]. toString () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGlobal Scope . future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmutable ListOf < Any ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < Graph Q LError >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Requests ( indexed Batch Requests ByType , Ġenv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠGraph Q LError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Fetcher Result . new Result < List < Any ? >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. errors ( errors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġresolve Requests ( indexed Batch Requests ByType : ĠMap < String , ĠList < Indexed Value < Map < String , ĠAny >> >>, Ġenv : ĠData Fetching Environment ): ĠList < List < Pair < Int , ĠAny ? >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindexed Batch Requests ByType . map Ġ{ Ġ( typeName , Ġindexed Requests ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Type ( env , ĠtypeName , Ġindexed Requests , Ġresolver Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ