/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ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 . processor Ċ Ċ import Ġandroidx . room . Entity Ċ import Ġandroidx . room . ForeignKey Ċ import Ġandroidx . room . F ts 3 Ċ import Ġandroidx . room . F ts 4 Ċ import Ġandroidx . room . ext . Annotation Box Ċ import Ġandroidx . room . ext . has Any Of Ċ import Ġandroidx . room . vo . ForeignKey Action Ċ import Ġandroidx . room . vo . Index Ċ import Ġjavax . lang . model . element . Name Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ interface ĠEntity Processor Ġ: ĠEntity Or View Processor Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprocess (): Ġandroidx . room . vo . Entity ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġextract TableName ( element : ĠType Element , Ġannotation : ĠEntity ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( annotation . tableName Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . simple Name . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation . tableName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġextract Indices ( annotation : ĠAnnotation Box < Entity >, ĠtableName : ĠString ): ĠList < Index Input > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġannotation . getAs Annotation Box < android x . room . Index >(" indices "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Annotation Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Value Ġ= Ġindex Annotation . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( name Value Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Index Name ( index Annotation . value . asList (), ĠtableName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Input ( name , Ġindex Annotation . unique , Ġindex Annotation . value . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Index Name ( column Names : ĠList < String >, ĠtableName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIndex . DEFAULT _ PREFIX Ġ+ ĠtableName Ġ+ Ġ"_" Ġ+ Ġcolumn Names . join ToString ("_ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġextract Foreign Keys ( annotation : ĠAnnotation Box < Entity >): ĠList < ForeignKey Input > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġannotation . getAs Annotation Box < ForeignKey >(" foreign Keys ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġannotation Box Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforeign Key Ġ= Ġannotation Box . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġannotation Box . getAs Type Mirror (" entity ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠForeign Key Input ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Columns Ġ= Ġforeign Key . parent Columns . asList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Columns Ġ= Ġforeign Key . child Columns . asList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonDelete Ġ= ĠForeign Key Action . from Annotation Value ( foreign Key . onDelete ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= ĠForeign Key Action . from Annotation Value ( foreign Key . on Update ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Ġ= Ġforeign Key . deferred ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPro cessed ĠIndex Ġannotation Ġoutput . Ċ Ġ*/ Ċ data Ġclass ĠIndex Input ( val Ġname : ĠString , Ġval Ġunique : ĠBoolean , Ġval Ġcolumn Names : ĠList < String >) Ċ Ċ /** Ċ Ġ* ĠForeign Key , Ġbefore Ġit Ġis Ġprocessed Ġin Ġthe Ġcontext Ġof Ġa Ġdatabase . Ċ Ġ*/ Ċ data Ġclass ĠForeign Key Input ( ĊĠĠĠ Ġval Ġparent : ĠType Mirror , ĊĠĠĠ Ġval Ġparent Columns : ĠList < String >, ĊĠĠĠ Ġval Ġchild Columns : ĠList < String >, ĊĠĠĠ Ġval ĠonDelete : ĠForeign Key Action ?, ĊĠĠĠ Ġval ĠonUpdate : ĠForeign Key Action ?, ĊĠĠĠ Ġval Ġdeferred : ĠBoolean Ċ ) Ċ Ċ fun ĠEntity Processor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġelement : ĠType Element , ĊĠĠĠ Ġreference Stack : ĠLinked HashSet < Name > Ġ= ĠLinked HashSet () Ċ ): ĠEntity Processor Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( element . has Any Of ( F ts 3 :: class , ĠF ts 4 :: class )) Ġ{ ĊĠĠĠĠĠĠĠ ĠF ts Table Entity Processor ( context , Ġelement , Ġreference Stack ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠTable Entity Processor ( context , Ġelement , Ġreference Stack ) ĊĠĠĠ Ġ} Ċ }