/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 0 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . kt orm . schema Ċ Ċ import Ġorg . kt orm . dsl . Query Row Set Ċ import Ġorg . kt orm . entity .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġof ĠK t orm 's Ġtable Ġobjects . ĠThis Ġclass Ġextends Ġfrom Ġ[ Base Table ], Ġaddition ally Ġproviding Ġa Ġbinding Ġmechanism Ċ Ġ* Ġwith Ġ[ Entity ] Ġinterfaces Ġbased Ġon Ġfunctions Ġsuch Ġas Ġ[ bind To ], Ġ[ references ]. Ċ Ġ* Ċ Ġ* Ġ[ Table ] Ġimplements Ġthe Ġ[ do Create Entity ] Ġfunction Ġfrom Ġthe Ġparent Ġclass . ĠThe Ġfunction Ġautomatically Ġcreates Ġan Ċ Ġ* Ġentity Ġobject Ġusing Ġthe Ġbinding Ġconfiguration Ġspecified Ġby Ġ[ bind To ] Ġand Ġ[ references ], Ġreading Ġcolumns âĢĻ Ġvalues Ġfrom Ċ Ġ* Ġthe Ġresult Ġset Ġand Ġfilling Ġthem Ġinto Ġcorresponding Ġentity Ġproperties . Ċ Ġ* Ċ Ġ* ĠTo Ġuse Ġthis Ġclass , Ġwe Ġneed Ġto Ġdefine Ġour Ġentities Ġas Ġinterfaces Ġextending Ġfrom Ġ[ Entity ]. ĠHere Ġis Ġan Ġexample . ĠMore Ċ Ġ* Ġdocuments Ġcan Ġbe Ġfound Ġat Ġhttps :// www . kt orm . org / en / entities - and - column - binding . html Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġinterface ĠDepartment Ġ: ĠEntity < Department > Ġ{ Ċ Ġ* ĠĠĠ Ġval Ġid : ĠInt Ċ Ġ* ĠĠĠ Ġvar Ġname : ĠString Ċ Ġ* ĠĠĠ Ġvar Ġlocation : ĠString Ċ Ġ* Ġ} Ċ Ġ* Ġobject ĠDep art ments Ġ: ĠTable < Department >(" t _ department ") Ġ{ Ċ Ġ* ĠĠĠ Ġval Ġid Ġ= Ġint (" id "). primaryKey (). bind To Ġ{ Ġit . id Ġ} Ċ Ġ* ĠĠĠ Ġval Ġname Ġ= Ġvarchar (" name "). bind To Ġ{ Ġit . name Ġ} Ċ Ġ* ĠĠĠ Ġval Ġlocation Ġ= Ġvarchar (" location "). bind To Ġ{ Ġit . location Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ public Ġopen Ġclass ĠTable < E Ġ: ĠEntity < E >>( ĊĠĠĠ ĠtableName : ĠString , ĊĠĠĠ Ġalias : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġcatalog : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġschema : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġentity Class : ĠK Class < E >? Ġ= Ġnull Ċ ) Ġ: ĠBase Table < E >( tableName , Ġalias , Ġcatalog , Ġschema , Ġentity Class ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġthe Ġcolumn Ġto Ġnested Ġproperties , Ġeg . Ġ` employee . manager . department . id `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠSince Ġ[ Column ] Ġis Ġimmutable , Ġthis Ġfunction Ġwill Ġcreate Ġa Ġnew Ġ[ Column ] Ġinstance Ġand Ġreplace Ġthe Ġorigin ĊĠĠĠĠ Ġ* Ġregistered Ġone . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġselector Ġa Ġlambda Ġin Ġwhich Ġwe Ġshould Ġreturn Ġthe Ġproperty Ġwe Ġwant Ġto Ġbind . ĊĠĠĠĠ Ġ* ĠFor Ġexample : Ġ` val Ġname Ġ= Ġvarchar (" name "). bind To Ġ{ Ġit . name Ġ} `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnew Ġ[ Column ] Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< C Ġ: ĠAny > ĠColumn < C >. bind To ( selector : Ġ( E ) Ġ-> ĠC ?): ĠColumn < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġdetect Binding Properties ( selector ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Bind Internal ( Nested Binding ( properties )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġthe Ġcolumn Ġto Ġa Ġreference Ġtable , Ġequivalent Ġto Ġa Ġforeign Ġkey Ġin Ġrel ational Ġdatabases . ĊĠĠĠĠ Ġ* ĠEntity Ġsequence ĠAPIs Ġwould Ġautomatically Ġleft Ġjoin Ġall Ġreferences Ġ( re cursively ) Ġby Ġdefault . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠSince Ġ[ Column ] Ġis Ġimmutable , Ġthis Ġfunction Ġwill Ġcreate Ġa Ġnew Ġ[ Column ] Ġinstance Ġand Ġreplace Ġthe Ġorigin ĊĠĠĠĠ Ġ* Ġregistered Ġone . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreference Table Ġthe Ġreference Ġtable , Ġwill Ġbe Ġcopied Ġby Ġcalling Ġits Ġ[ ali ased ] Ġfunction Ġwith ĊĠĠĠĠ Ġ* Ġan Ġalias Ġlike Ġ`_ ref N `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġselector Ġa Ġlambda Ġin Ġwhich Ġwe Ġshould Ġreturn Ġthe Ġproperty Ġused Ġto Ġhold Ġthe Ġreferenced Ġentities . ĊĠĠĠĠ Ġ* ĠFor Ġexample : Ġ` val Ġdepartment Id Ġ= Ġint (" department _ id "). references ( Depart ments ) Ġ{ Ġit . department Ġ} `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnew Ġ[ Column ] Ġinstance . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġorg . kt orm . entity . sequence Of ĊĠĠĠĠ Ġ* Ġ@ see Ġcreate Entity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< C Ġ: ĠAny , ĠR Ġ: ĠEntity < R >> ĠColumn < C >. references ( ĊĠĠĠĠĠĠĠ Ġreference Table : ĠTable < R >, ĊĠĠĠĠĠĠĠ Ġselector : Ġ( E ) Ġ-> ĠR ? ĊĠĠĠ Ġ): ĠColumn < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġdetect Binding Properties ( selector ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( properties . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Reference Ġbinding Ġdoesn 't Ġsupport Ġnested Ġproperties .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Bind Internal ( Reference Binding ( reference Table , Ġproperties [ 0 ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġinline Ġfun Ġdetect Binding Properties ( selector : Ġ( E ) Ġ-> ĠAny ?): ĠList < K Property 1 < *, Ġ* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentity Class Ġ= Ġthis . entity Class Ġ?: Ġerror (" No Ġentity Ġclass Ġconfigured Ġfor Ġtable : Ġ'$ this '") ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= ĠArrayList < K Property 1 < *, Ġ* >>() ĊĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= ĠColumn Binding Handler . create Proxy ( entity Class , Ġproperties ) ĊĠĠĠĠĠĠĠ Ġselector ( proxy Ġas ĠE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( properties . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġbinding Ġproperties Ġfound .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġproperties ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġali ased ( alias : ĠString ): ĠTable < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTable ( tableName , Ġalias , Ġcatalog , Ġschema , Ġentity Class ) ĊĠĠĠĠĠĠĠ Ġresult . copy Definitions From ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġdo Create Entity ( row : ĠQuery Row Set , Ġwith References : ĠBoolean ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentity Class Ġ= Ġthis . entity Class Ġ?: Ġerror (" No Ġentity Ġclass Ġconfigured Ġfor Ġtable : Ġ'$ this '") ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= ĠEntity . create ( entity Class , Ġfrom Database Ġ= Ġrow . query . database , Ġfrom Table Ġ= Ġthis ) Ġas ĠE ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġcolumns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . retrieve Column ( column , Ġinto Entity Ġ= Ġentity , Ġwith References Ġ= Ġwith References ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentity . apply Ġ{ Ġclear Changes Re cursively () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠQuery Row Set . retrieve Column ( column : ĠColumn <* >, Ġinto Entity : ĠE , Ġwith References : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumn Value Ġ= Ġthis [ column ] Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġcolumn . all Bindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReference Binding Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Table Ġ= Ġbinding . reference Table Ġas ĠTable < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpk Ġ= Ġref Table . single PrimaryKey Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġreference Ġthe Ġtable Ġ'$ ref Table ' Ġas Ġthere Ġis Ġcompound Ġprimary Ġkeys ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġref Table . do Create Entity ( this , Ġwith References Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . implementation . set Column Value ( pk , Ġcolumn Value , Ġforce Set Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto Entity [ binding . on Property . name ] Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Class Ġ= Ġbinding . on Property . returnType . jvm Er asure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= ĠEntity . create ( entity Class , Ġfrom Database Ġ= Ġquery . database , Ġfrom Table Ġ= Ġref Table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . implementation . set Column Value ( pk , Ġcolumn Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto Entity [ binding . on Property . name ] Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNested Binding Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto Entity . implementation . set Column Value ( binding , Ġcolumn Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEntity Implementation . set Column Value ( column : ĠColumn <* >, Ġvalue : ĠAny ?, Ġforce Set : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġcolumn . all Bindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Column Value ( binding , Ġvalue , Ġforce Set ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ