package Ġcom . react n atives pac ex . impl . store Ċ Ċ import Ġcom . react n atives pac ex . impl . OutputType Ċ import Ġcom . react n atives pac ex . impl . Selector Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ Ċ private Ġfun Ġread Value ( value : ĠRecord Value , Ġtype : ĠOutput Type , Ġstore : ĠRecord Store , Ġarguments : ĠJSONObject ): ĠPair < Boolean , ĠAny ?> Ġ{ ĊĠĠĠ Ġif Ġ( type Ġis ĠOutput Type . Scalar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠRecord Value . Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġto ĠJSONObject . NULL ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" String ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" Int ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" Float ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" ID ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" Date ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type . name Ġ== Ġ" Boolean ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġis ĠRecord Value . Boolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġto Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unknown Ġscalar Ġtype : Ġ" Ġ+ Ġtype . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠOutput Type . NotNull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ== ĠRecord Value . Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Value ( value , Ġtype . inner , Ġstore , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠOutput Type . List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠRecord Value . Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠRecord Value . List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Ġ= Ġvalue . items . map Ġ{ Ġread Value ( it , Ġtype . inner , Ġstore , Ġarguments ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mapped . any Ġ{ Ġ! it . first Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġmapped . map Ġ{ Ġit . second !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġto ĠJSONArray ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Invalid Ġrecord Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġis ĠOutput Type . Object ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠRecord Value . Null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠRecord Value . Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Selector ( value . key , Ġstore , Ġtype . selectors , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Invalid Ġrecord Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ġto Ġnull Ċ } Ċ Ċ private Ġfun Ġread Selector ( ĊĠ Ġrecord : ĠRecord , ĊĠ Ġfields : ĠMutable Map < String , ĠAny ? >, ĊĠ Ġstore : ĠRecord Store , ĊĠ Ġselectors : ĠList < Selector >, ĊĠ Ġarguments : ĠJSONObject Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( f Ġin Ġselectors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( f Ġis ĠSelector . Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġselector Key ( f . name , Ġf . arguments , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record . fields . containsKey ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrv Ġ= Ġread Value ( record . fields [ key ] !! , Ġf . type , Ġstore , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! rv . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ f . alias ] Ġ= Ġrv . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f Ġis ĠSelector . Type Condition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record . fields [" __ typename "] Ġ== ĠRecord Value . String ( f . type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! read Selector ( record , Ġfields , Ġstore , Ġf . fragment . selectors , Ġarguments )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f Ġis ĠSelector . Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! read Selector ( record , Ġfields , Ġstore , Ġf . fragment . selectors , Ġarguments )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unsupported Ġselector ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġfun Ġread Selector ( cacheKey : ĠString , Ġstore : ĠRecord Store , Ġselectors : ĠList < Selector >, Ġarguments : ĠJSONObject ): ĠPair < Boolean , ĠJSONObject ?> Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= Ġstore . read ( cacheKey ) ĊĠĠĠ Ġif Ġ( value . fields . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġto Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfields Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĠĠĠ Ġif Ġ(! read Selector ( value , Ġfields , Ġstore , Ġselectors , Ġarguments )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġto Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ġto ĠJSONObject ( fields ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRead ĠObject Ġfrom ĠStore . ĠUsed Ġonly Ġin Ġtests . Ċ Ġ* Ġ@ param Ġcache Key ĠCache ĠKey Ġof ĠRecord Ċ Ġ* Ġ@ param Ġstore ĠStore Ġto Ġread Ġfrom Ċ Ġ* Ġ@ param Ġtype ĠObject ĠType Ġto Ġread Ċ Ġ* Ġ@ return Ġpair Ġof Ġtrue Ġand ĠJSONObject Ġif Ġread Ġwas Ġsuccessful Ċ Ġ* Ġ@ throws ĠError Ġif Ġsome Ġof Ġthe Ġrecords Ġin Ġthe Ġtree Ġare Ġnot Ġloaded Ġto ĠRecord ĠStore * Ċ Ġ*/ Ċ fun Ġread From Store ( cacheKey : ĠString , Ġstore : ĠRecord Store , Ġtype : ĠOutput Type . Object ): ĠPair < Boolean , ĠJSONObject ?> Ġ{ ĊĠĠĠ Ġreturn Ġread Selector ( cacheKey , Ġstore , Ġtype . selectors , ĠJSONObject ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠRead ĠOperation Ġfrom ĠStore Ċ Ġ* Ġ@ param Ġroot CacheKey ĠRoot ĠCache ĠKey Ġfor Ġoperation Ġtype Ċ Ġ* Ġ@ param Ġstore ĠStore Ġto Ġread Ġfrom Ċ Ġ* Ġ@ param Ġtype ĠType Ġto Ġread Ċ Ġ* Ġ@ param Ġarguments ĠOperation ĠArguments Ċ Ġ* Ġ@ return Ġpair Ġof Ġtrue Ġand ĠJSONObject Ġif Ġread Ġwas Ġsuccessful Ċ Ġ* Ġ@ throws ĠError Ġif Ġsome Ġof Ġthe Ġrecords Ġin Ġthe Ġtree Ġare Ġnot Ġloaded Ġto ĠRecord ĠStore Ċ Ġ*/ Ċ fun Ġread Root From Store ( root CacheKey : ĠString , Ġstore : ĠRecord Store , Ġtype : ĠOutput Type . Object , Ġarguments : ĠJSONObject ): ĠPair < Boolean , ĠJSONObject ?> Ġ{ ĊĠĠĠ Ġval Ġfields Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĠĠĠ Ġfor Ġ( f Ġin Ġtype . selectors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( f Ġ! is ĠSelector . Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Root Ġquery Ġcant 't Ġcontain Ġfragments ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġselector Key ( f . name , Ġf . arguments , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġid Ġ= Ġ"$ root CacheKey .$ key " ĊĠĠĠĠĠĠĠ Ġval Ġref Id Ġ= Ġ"$ root CacheKey .\ $ ref .$ key " ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġstore . read ( ref Id ) ĊĠĠĠĠĠĠĠ Ġval Ġex Ġ= Ġvalue . fields [" data "] Ġ?: Ġreturn Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrv Ġ= Ġread Value ( ex , Ġf . type , Ġstore , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! rv . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfields [ f . alias ] Ġ= Ġrv . second ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ġto ĠJSONObject ( fields ) Ċ } Ċ