/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 Ġandroid . arch . persistence . room . vo Ċ Ċ import Ġandroid . arch . persistence . room . ext . Android Type Names Ċ import Ġandroid . arch . persistence . room . ext . Common Type Names Ċ import Ġandroid . arch . persistence . room . ext . L Ċ import Ġandroid . arch . persistence . room . ext . N Ċ import Ġandroid . arch . persistence . room . ext . T Ċ import Ġandroid . arch . persistence . room . ext . typeName Ċ import Ġandroid . arch . persistence . room . parser . Parsed Query Ċ import Ġandroid . arch . persistence . room . parser . SQL Type Affinity Ċ import Ġandroid . arch . persistence . room . parser . Sql Parser Ċ import Ġandroid . arch . persistence . room . processor . Context Ċ import Ġandroid . arch . persistence . room . processor . Processor Errors . CAN NOT _ FIND _ QUERY _ RESULT _ ADAPTER Ċ import Ġandroid . arch . persistence . room . processor . Processor Errors . relation Affinity Mismatch Ċ import Ġandroid . arch . persistence . room . solver . CodeGen Scope Ċ import Ġandroid . arch . persistence . room . solver . query . result . Row Adapter Ċ import Ġandroid . arch . persistence . room . solver . query . result . Single Column Row Adapter Ċ import Ġandroid . arch . persistence . room . verifier . Database Ver ific ait on Errors Ċ import Ġandroid . arch . persistence . room . writer . Query Writer Ċ import Ġandroid . arch . persistence . room . writer . Relation Collector Method Writer Ċ import Ġcom . squareup . jav ap o et . Array TypeName Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Code Block Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġstrip Non Java Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . HashSet Ċ import Ġjavax . lang . model . type . Type Kind Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ /** Ċ Ġ* ĠInternal Ġclass Ġthat Ġis Ġused Ġto Ġmanage Ġfetching Ġ 1 / N Ġto ĠN Ġrelationships . Ċ Ġ*/ Ċ data Ġclass ĠRelation Collector ( val Ġrelation : ĠRelation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaff inity Ġ: ĠSQL Type Affinity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap TypeName : ĠParameter ized TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey TypeName : ĠType Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection TypeName : ĠParameter ized TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Writer : ĠQuery Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Adapter : ĠRow Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload All Query Ġ: ĠParsed Query ) Ġ{ ĊĠĠĠ Ġ// Ġset Ġwhen Ġwriting Ġthe Ġcode Ġgenerator Ġin Ġwrite Init Code ĊĠĠĠ Ġlateinit Ġvar Ġvar Name : ĠString ĊĊĠĠĠ Ġfun Ġwrite Init Code ( scope : ĠCode Gen Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Var Ġ= Ġscope . get Tmp Var ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"_ collection ${ relation . field . getPath (). strip Non Java (). capitalize () }") ĊĠĠĠĠĠĠĠ Ġscope . builder (). add Statement (" final Ġ$ T Ġ$ L Ġ= Ġnew Ġ$ T ()", Ġmap TypeName , Ġtmp Var , Ġmap TypeName ) ĊĠĠĠĠĠĠĠ Ġvar Name Ġ= Ġtmp Var ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcalled Ġafter Ġreading Ġeach Ġitem Ġto Ġextract Ġthe Ġkey Ġif Ġit Ġexists ĊĠĠĠ Ġfun Ġwrite Read Parent KeyCode ( cursor Var Name : ĠString , Ġitem Var Ġ: ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields With Indices Ġ: ĠList < Field With Index >, Ġscope : ĠCode Gen Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Var Ġ= Ġfields With Indices . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . field Ġ=== Ġrelation . parent Field ĊĠĠĠĠĠĠĠ Ġ} ?. index Var ĊĠĠĠĠĠĠĠ Ġscope . builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Var Name Ġ= Ġcursor Var Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Var Ġ= Ġindex Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġtmp Var Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Collection Var Ġ= Ġscope . get Tmp Var ("_ tmp Collection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ T Ġ$ L Ġ= Ġ$ L . get ($ L )", Ġcollection TypeName , Ġtmp Collection Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Name , Ġtmp Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if ($ L Ġ== Ġnull )", Ġtmp Collection Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L Ġ= Ġnew Ġ$ T ()", Ġtmp Collection Var , Ġcollection TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L . put ($ L , Ġ$ L )", Ġvar Name , Ġtmp Var , Ġtmp Collection Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġit Ġon Ġthe Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . field . setter . write Set ( item Var , Ġtmp Collection Var , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Collection Code ( scope : ĠCode Gen Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġscope . writer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrCreate Method ( Relation Collector Method Writer ( this )) ĊĠĠĠĠĠĠĠ Ġscope . builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ N ($ L )", Ġmethod , Ġvar Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Key ( cursor Var Name : ĠString , Ġindex Var : ĠString ?, Ġscope : ĠCode Gen Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Read : ĠCode Block . Builder .( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor Getter Ġ= Ġwhen Ġ( affinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . INTEGER Ġ-> Ġ" getLong " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . REAL Ġ-> Ġ" getDouble " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . TEXT Ġ-> Ġ" getString " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . BLOB Ġ-> Ġ" get Blob " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getString " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscope . builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if Ġ(!$ L . isNull ($ L )) ", Ġcursor Var Name , Ġindex Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Var Ġ= Ġscope . get Tmp Var ("_ tmp Key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L Ġ= Ġ$ L .$ L ($ L )", Ġkey TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Var , Ġcursor Var Name , Ġcursor Getter , Ġindex Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . post Read ( tmp Var ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Collectors ( base Context Ġ: ĠContext , Ġrelations : ĠList < Relation >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠList < Relation Collector > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelations . map Ġ{ Ġrelation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdecide Ġon Ġthe Ġaff inity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context . fork ( relation . field . element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Affinity Ġ= Ġrelation . parent Field . cursor Value Reader ?. affinity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Affinity Ġ= Ġrelation . entity Field . cursor Value Reader ?. affinity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaff inity Ġ= Ġif Ġ( parent Affinity Ġ!= Ġnull Ġ&& Ġparent Affinity Ġ== Ġchild Affinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Affinity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . w ( Warning . REL ATION _ TYPE _ MIS MATCH , Ġrelation . field . element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation Affinity Mismatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Column Ġ= Ġrelation . parent Field . columnName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Column Ġ= Ġrelation . entity Field . columnName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Affinity Ġ= Ġparent Affinity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Affinity Ġ= Ġchild Affinity )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Ġ= Ġkey Type For ( context , Ġaff inity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection TypeName Ġ= Ġif Ġ( relation . field . typeName Ġis ĠParameter ized TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Type Ġ= Ġrelation . field . typeName Ġas ĠParameter ized TypeName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( param Type . raw Type Ġ== ĠCommon Type Names . LIST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( ArrayList :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . pojo . typeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( param Type . raw Type Ġ== ĠCommon Type Names . SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( HashSet :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . pojo . typeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( ArrayList :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . pojo . typeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( ClassName . get ( ArrayList :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . pojo . typeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Use Array Map Ġ= Ġcontext . processing Env . element Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getType Element ( Android Type Names . ARRAY _ MAP . toString ()) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Class Ġ= Ġif Ġ( can Use Array Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Type Names . ARRAY _ MAP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( java . util . HashMap :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Map Type Ġ= ĠParameter ized TypeName . get ( map Class , Ġkey Type , Ġcollection TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Mirror Ġ= Ġkey Type Mirror For ( context , Ġaff inity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġcontext . processing Env . element Utils . getType Element (" java . util . Set ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Set Ġ= Ġcontext . processing Env . type Utils . getDeclared Type ( set , Ġkey Type Mirror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload All Query Ġ= Ġrelation . create Load All Sql () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Query Ġ= ĠSql Parser . parse ( load All Query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . checker . check ( parsed Query . errors . isEmpty (), Ġrelation . field . element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsed Query . errors . join ToString ("\ n ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parsed Query . errors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Info Ġ= Ġcontext . database Verifier ?. analyze ( load All Query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsed Query . result Info Ġ= Ġresult Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Info ?. error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . e ( relation . field . element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Ver ific ait on Errors . cannot Verify Query ( result Info . error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Info Ġ= Ġparsed Query . result Info ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Param Ġ= ĠQuery Parameter ( Relation Collector Method Writer . KEY _ SET _ VARIABLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Set , Ġcontext . type Adapter Store . find QueryParameter Adapter ( keySet )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Writer Ġ= ĠQuery Writer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠlistOf ( query Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection To Param Mapping Ġ= ĠlistOf ( Pair ( parsed Query . bind Sections . first (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Param )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ= Ġparsed Query ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrow Ġadapter Ġthat Ġmatches Ġfull Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠgetDefault Row Adapter () Ġ: ĠRow Adapter ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . type Adapter Store . find Row Adapter ( relation . pojo . type , Ġparsed Query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Adapter Ġ= Ġif Ġ( relation . projection . size Ġ== Ġ 1 Ġ&& Ġresult Info Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( result Info . columns . size Ġ== Ġ 1 Ġ|| Ġresult Info . columns . size Ġ== Ġ 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġa Ġcolumn Ġadapter Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Reader Ġ= Ġcontext . type Adapter Store . find Cursor Value Reader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . pojo . type , Ġresult Info . columns . first (). type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Reader Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetDefault Row Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . d (" Cho osing Ġcursor Ġadapter Ġfor Ġthe Ġreturn Ġvalue Ġsince " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġthe Ġquery Ġreturns Ġonly Ġ 1 Ġor Ġ 2 Ġcolumns Ġand Ġthere Ġis Ġa Ġcursor " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġadapter Ġfor Ġthe Ġreturn Ġtype .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle Column Row Adapter ( cursor Reader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetDefault Row Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . logger . e ( relation . field . element , ĠCAN NOT _ FIND _ QUERY _ RESULT _ ADAPTER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation Collector ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation Ġ= Ġrelation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaff inity Ġ= Ġaff inity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap TypeName Ġ= Ġtmp Map Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey TypeName Ġ= Ġkey Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection TypeName Ġ= Ġcollection TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Writer Ġ= Ġquery Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Adapter Ġ= Ġrow Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload All Query Ġ= Ġparsed Query ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter NotNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġkey Type Mirror For ( context : ĠContext , Ġaff inity : ĠSQL Type Affinity ): ĠType Mirror Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġcontext . processing Env . type Utils ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġcontext . processing Env . element Utils ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( affinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . INTEGER Ġ-> Ġelements . getType Element (" java . lang . Long "). as Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . REAL Ġ-> Ġelements . getType Element (" java . lang . Double "). as Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . TEXT Ġ-> Ġcontext . COMMON _ TYPES . STRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . BLOB Ġ-> Ġtypes . get ArrayType ( types . get Primitive Type ( Type Kind . BYTE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . COMMON _ TYPES . STRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġkey Type For ( context Ġ: ĠContext , Ġaff inity : ĠSQL Type Affinity ): ĠType Name Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( affinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . INTEGER Ġ-> ĠType Name . LONG . box () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . REAL Ġ-> ĠType Name . DOUBLE . box () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . TEXT Ġ-> ĠType Name . get ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSQL Type Affinity . BLOB Ġ-> ĠArray TypeName . of ( TypeName . BYTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġaff inity Ġselect Ġfrom Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . COMMON _ TYPES . STRING . typeName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ