/* Ċ Ġ* Ġ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 Ġandroidx . room . writer Ċ Ċ import Ġandroidx . room . ext . Android Type Names Ċ import Ġandroidx . room . ext . L Ċ import Ġandroidx . room . ext . N Ċ import Ġandroidx . room . ext . Room Type Names Ċ import Ġandroidx . room . ext . S Ċ import Ġandroidx . room . ext . T Ċ import Ġandroidx . room . solver . CodeGen Scope Ċ import Ġandroidx . room . solver . query . result . Po jo Row Adapter Ċ import Ġandroidx . room . vo . Relation Collector Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Method Spec Ċ import Ġcom . squareup . jav ap o et . Parameter Spec Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġstrip Non Java Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ /** Ċ Ġ* ĠWrites Ġthe Ġmethod Ġthat Ġf etches Ġthe Ġrelations Ġof Ġa ĠPO JO Ġand Ġassigns Ġthem Ġinto Ġthe Ġgiven Ġmap . Ċ Ġ*/ Ċ class ĠRelation Collector Method Writer ( private Ġval Ġcollector : ĠRelation Collector ) ĊĠĠĠ Ġ: ĠClass Writer . Shared Method Spec ( ĊĠĠĠĠĠĠĠ Ġ" fetch Relationship ${ collector . relation . entity . tableName . strip Non Java () }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" As ${ collector . relation . pojo TypeName . toString (). strip Non Java () }") Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPARAM _ MAP _ VARIABLE Ġ= Ġ"_ map " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SET _ VARIABLE Ġ= Ġ"__ map Key Set " ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Unique Key (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrelation Ġ= Ġcollector . relation ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Relation Collector Method Writer " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ collector . map TypeName }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ relation . entity . typeName }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ relation . entity Field . columnName }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ relation . pojo TypeName }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ relation . create Load All Sql () }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare ( methodName : ĠString , Ġwriter : ĠClass Writer , Ġbuilder : ĠMethod Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠCode Gen Scope ( writer ) ĊĠĠĠĠĠĠĠ Ġval Ġrelation Ġ= Ġcollector . relation ĊĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= ĠParameter Spec . builder ( collector . map TypeName , ĠPARAM _ MAP _ VARIABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( Modifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġsql Query Var Ġ= Ġscope . get Tmp Var ("_ sql ") ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor Var Ġ= Ġ"_ cursor " ĊĠĠĠĠĠĠĠ Ġval Ġitem Key Index Var Ġ= Ġ"_ item Key Index " ĊĠĠĠĠĠĠĠ Ġval Ġstmt Var Ġ= Ġscope . get Tmp Var ("_ stmt ") ĊĠĠĠĠĠĠĠ Ġscope . builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusing Long Sparse Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . map TypeName . raw Type Ġ== ĠAndroid Type Names . LONG _ SPARSE _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( using Long Sparse Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if Ġ($ N . isEmpty ()) ", Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Set Type Ġ= ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get ( Set :: class . java ), Ġcollector . key TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L Ġ= Ġ$ N . keySet ()", Ġkey Set Type , ĠKEY _ SET _ VARIABLE , Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if Ġ($ L . isEmpty ()) ", ĠKEY _ SET _ VARIABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" return ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("// Ġcheck Ġif Ġthe Ġsize Ġis Ġtoo Ġbig , Ġif Ġso Ġdivide ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if ($ N . size () Ġ> Ġ$ T . MAX _ BIND _ PARAMETER _ CNT )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam , ĠRoom Type Names . ROOM _ DB ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdivide Ġit Ġinto Ġchunks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Map Var Ġ= Ġscope . get Tmp Var ("_ tmp Inner Map ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ T Ġ$ L Ġ= Ġnew Ġ$ T ($ L . MAX _ BIND _ PARAMETER _ CNT )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . map TypeName , Ġtmp Map Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . map TypeName , ĠRoom Type Names . ROOM _ DB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Index Var Ġ= Ġscope . get Tmp Var ("_ map Index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Index Var Ġ= Ġscope . get Tmp Var ("_ tmp Index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Var Ġ= Ġscope . get Tmp Var ("_ limit ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ T Ġ$ L Ġ= Ġ 0 ", ĠType Name . INT , Ġmap Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ T Ġ$ L Ġ= Ġ 0 ", ĠType Name . INT , Ġtmp Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L Ġ= Ġ$ N . size ()", ĠType Name . INT , Ġlimit Var , Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" while ($ L Ġ< Ġ$ L )", Ġmap Index Var , Ġlimit Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L . put ($ N . key At ($ L ), Ġ$ N . value At ($ L )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Map Var , Ġparam , Ġmap Index Var , Ġparam , Ġmap Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L ++ ", Ġmap Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L ++ ", Ġtmp Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if ($ L Ġ== Ġ$ T . MAX _ BIND _ PARAMETER _ CNT )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Index Var , ĠRoom Type Names . ROOM _ DB ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrecursively Ġload Ġthat Ġbatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L ($ L )", ĠmethodName , Ġtmp Map Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclear Ġn uk es Ġthe Ġbacking Ġdata Ġhence Ġwe Ġcreate Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L Ġ= Ġnew Ġ$ T ($ T . MAX _ BIND _ PARAMETER _ CNT )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Map Var , Ġcollector . map TypeName , ĠRoom Type Names . ROOM _ DB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L Ġ= Ġ 0 ", Ġtmp Index Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if ($ L Ġ> Ġ 0 )", Ġtmp Index Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġthe Ġlast Ġbatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L ($ L )", ĠmethodName , Ġtmp Map Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" return ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. end Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . query Writer . prepare Read And Bind ( sql Query Var , Ġstmt Var , Ġscope ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Copy Cursor Ġ= Ġcollector . row Adapter . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠPo jo Row Adapter Ġ&& Ġit . relation Collectors . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L Ġ= Ġ$ T . query ($ N , Ġ$ L , Ġ$ L )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Type Names . CURSOR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Type Names . DB _ UTIL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDao Writer . db Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Copy Cursor ) Ġ" true " Ġelse Ġ" false ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" try "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L Ġ= Ġ$ T . getColumnIndex ($ L , Ġ$ S )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Name . INT , Ġitem Key Index Var , ĠRoom Type Names . CURSOR _ UTIL , Ġcursor Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation . entity Field . columnName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if Ġ($ L Ġ== Ġ- 1 )", Ġitem Key Index Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" return ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . row Adapter . on Cursor Ready ( cursor Var , Ġscope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Var Name Ġ= Ġscope . get Tmp Var ("_ item ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" while ($ L . moveTo Next ()) ", Ġcursor Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġkey Ġfrom Ġthe Ġcursor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . read Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Var Name Ġ= Ġcursor Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Var Ġ= Ġitem Key Index Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġkey Var Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Var Ġ= Ġscope . get Tmp Var ("_ tmp Collection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ T Ġ$ L Ġ= Ġ$ N . get ($ L )", Ġcollector . collection TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Var , Ġparam , Ġkey Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Control Flow (" if Ġ($ L Ġ!= Ġnull )", Ġcollection Var ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement (" final Ġ$ T Ġ$ L ", Ġrelation . pojo TypeName , Ġtmp Var Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . row Adapter . convert ( tmp Var Name , Ġcursor Var , Ġscope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L . add ($ L )", Ġcollection Var , Ġtmp Var Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollector . row Adapter . on Cursor Finished ()?. invoke ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Control Flow (" finally "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Statement ("$ L . close ()", Ġcursor Var ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Control Flow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Modifiers ( Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Parameter ( param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturns ( TypeName . VOID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Code ( scope . builder (). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ