package Ġi an m organ . graph store . dal ĊĊ Ċ import Ġgraphql . language . Interface Type Definition Ċ import Ġgraphql . language . ListType Ċ import Ġgraphql . language . NonNull Type Ċ import Ġgraphql . language . TypeName Ċ import Ġgraphql . schema . idl . Type Definition Registry Ċ import Ġi an m organ . graph store . graphql . Helper Ċ import Ġi an m organ . graph store . graphql . Type Definition Registry Helper Ċ Ċ /** Ċ Ġ* ĠA ĠDao Ġthat Ġknows Ġhow Ġto Ġretrieve Ġan Ġinterface Ġby Ġdeleg ating Ġto Ġthe ĠDoc Dao Ġfor Ġeach Ċ Ġ* Ġdoc Ġthat Ġimplements Ġthe Ġinterface Ċ Ġ*/ Ċ class ĠInterface Dao Ġconstructor ( ĊĠĠĠ Ġinterface Name : ĠString , ĊĠĠĠ Ġtype Definition Registry : ĠType Definition Registry , ĊĠĠĠ Ġdoc Dao Lookup : ĠMap < String , ĠReader Dao > Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdoc Dao Lookup Ġ= Ġdoc Dao Lookup ĊĠĠĠ Ġprivate Ġval Ġimplementing Docs Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġval Ġfields Ġ= ĠHashSet < String >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠHelper . build ( type Definition Registry ) ĊĠĠĠĠĠĠĠ Ġval Ġinterface Definition Ġ= Ġhelper . interface Definition ( interface Name ) ĊĊĠĠĠĠĠĠĠ Ġinit Dao List ( helper , Ġinterface Name ) ĊĠĠĠĠĠĠĠ Ġinit Field List ( interface Definition ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġretrieve ( aggregate Id : ĠString ): ĠMap < String , ĠAny >? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( doc Type Ġin Ġimplementing Docs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġdoc Dao Lookup . get ( doc Type ) !!. retrieve ( aggregate Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġdoc . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fields . contains ( entry . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . put ( entry . key , Ġentry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Dao List ( helper : ĠType Definition Registry Helper , Ġinterface Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( doc Type Ġin Ġhelper . object Definition Names ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Definition Ġ= Ġhelper . object Definition ( doc Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġobject Definition . get Implements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠType Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . name Ġ== Ġinterface Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementing Docs . add ( doc Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Field List ( type Definition : ĠInterface Type Definition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġtype Definition . field Definitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Type Ġ= Ġfield . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Type Ġis ĠNon Null Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġraw Type . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠType Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠList Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Type Ġis ĠType Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Type Ġis ĠList Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( field . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }