/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 Ġre query . io Ċ Ġ* Ċ Ġ* Ġ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 Ġio . re query . kotlin Ċ Ċ import Ġio . re query . Transaction Ċ import Ġio . re query . Transaction Isolation Ċ import Ġio . re query . meta . Attribute Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ Ċ /** Ċ Ġ* ĠThe Ġprimary Ġinterface Ġfor Ġinteracting Ġwith Ġ[ io . re query . Entity ] Ġobjects . ĠThis Ġinterface Ġsupports Ġthe Ċ Ġ* Ġbasic Ġinsert / update / delete Ġoperations . Ċ Ġ*/ Ċ interface ĠEntity Store < T Ġ: ĠAny , Ġout ĠR > Ġ: ĠQuery able < T >, ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġclose () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInser ts Ġthe Ġgiven Ġentity . ĠThis Ġentity Ġmust Ġnot Ġhave Ġpreviously Ġbeen Ġinserted Ġotherwise Ġa ĊĠĠĠĠ Ġ* Ġ[ io . re query . Persistence Exception ] Ġmay Ġbe Ġthrown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġinsert ( entity : ĠE ): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInsert Ġa Ġcollection Ġof Ġentities . ĠThis Ġmethod Ġmay Ġperform Ġadditional Ġoptimizations Ġnot ĊĠĠĠĠ Ġ* Ġpresent Ġin Ġthe Ġsingle Ġelement Ġinsert Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġinsert ( entities : ĠIterable < E >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInser ts Ġthe Ġgiven Ġentity Ġreturning Ġthe Ġgenerated Ġkey Ġafter Ġthe Ġentity Ġis Ġinserted . ĠThis ĊĠĠĠĠ Ġ* Ġentity Ġmust Ġnot Ġhave Ġpreviously Ġbeen Ġinserted Ġotherwise Ġan Ġ[ io . re query . Persistence Exception ] ĊĠĠĠĠ Ġ* Ġmay Ġbe Ġthrown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< K Ġ: ĠAny , ĠE Ġ: ĠT > Ġinsert ( entity : ĠE , Ġkey Class : ĠK Class < K >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInsert Ġa Ġcollection Ġof Ġentities Ġreturning Ġthe Ġgenerated Ġkeys Ġfor Ġthe Ġinserted Ġentities Ġin ĊĠĠĠĠ Ġ* Ġthe Ġorder Ġthey Ġwere Ġinserted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< K Ġ: ĠAny , ĠE Ġ: ĠT > Ġinsert ( entities : ĠIterable < E >, Ġkey Class : ĠK Class < K >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġgiven Ġentity . ĠIf Ġthe Ġgiven Ġentity Ġhas Ġmodified Ġproperties Ġthose Ġchanges Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġpersisted Ġotherwise Ġthe Ġmethod Ġwill Ġdo Ġnothing . ĠA Ġproperty Ġis Ġconsidered Ġmodified ĊĠĠĠĠ Ġ* Ġif Ġits Ġassociated Ġsetter Ġhas Ġbeen Ġcalled , Ġmodifying Ġthe Ġstate Ġof Ġa Ġproperty 's Ġcontent ĊĠĠĠĠ Ġ* Ġwill Ġnot Ġcause Ġan Ġupdate Ġto Ġhappen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġupdate ( entity : ĠE ): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġa Ġcollection Ġof Ġentities . ĠThis Ġmethod Ġmay Ġperform Ġadditional Ġoptimizations Ġnot ĊĠĠĠĠ Ġ* Ġpresent Ġin Ġthe Ġsingle Ġelement Ġupdate Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġupdate ( entities : ĠIterable < E >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUp ser ts Ġ( insert Ġor Ġupdate ) Ġthe Ġgiven Ġentity . ĠNote Ġthat Ġup ser ting Ġmay Ġbe Ġan Ġexpensive ĊĠĠĠĠ Ġ* Ġoperation Ġon Ġsome Ġplatforms Ġand Ġmay Ġnot Ġbe Ġsupported Ġin Ġall Ġcases Ġor Ġplatforms . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġupsert ( entity : ĠE ): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUp ser ts Ġ( inser ts Ġor Ġupdates ) Ġa Ġcollection Ġof Ġentities . ĠThis Ġmethod Ġmay Ġperform Ġadditional ĊĠĠĠĠ Ġ* Ġoptimizations Ġnot Ġpresent Ġin Ġthe Ġsingle Ġupsert Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġupsert ( entities : ĠIterable < E >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRefresh Ġthe Ġgiven Ġentity . ĠThis Ġref res hes Ġthe Ġalready Ġloaded Ġproperties Ġin Ġthe Ġentity . ĠIf Ġno ĊĠĠĠĠ Ġ* Ġproperties Ġare Ġloaded Ġthen Ġthe Ġdefault Ġproperties Ġwill Ġbe Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entity : ĠE ): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRefresh Ġthe Ġgiven Ġentity Ġon Ġspecific Ġattributes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entity : ĠE , Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRefresh Ġthe Ġgiven Ġentities Ġon Ġspecific Ġattributes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entities : ĠIterable < E >, Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRefresh Ġthe Ġgiven Ġentity Ġon Ġall Ġof Ġits Ġattributes Ġincluding Ġrel ational Ġones . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠT > Ġrefresh All ( entity : ĠE ): ĠR ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġthe Ġgiven Ġentity Ġfrom Ġthe Ġstore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġdelete ( entity : ĠE ): ĠR ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġmultiple Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun Ġ< E Ġ: ĠT > Ġdelete ( entities : ĠIterable < E >): ĠR ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġan Ġentity Ġby Ġthe Ġgiven Ġkey . ĠThis Ġdiffers Ġfrom Ġselecting Ġthe Ġkey Ġusing Ġa Ġquery Ġin Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġ[ io . re query . Entity Cache ] Ġif Ġavailable Ġmay Ġbe Ġchecked Ġfirst Ġfor Ġthe Ġobject . ĠIf Ġan Ġentity Ġis ĊĠĠĠĠ Ġ* Ġfound Ġin Ġthe Ġcache Ġit Ġwill Ġbe Ġreturned Ġand Ġpotentially Ġno Ġquery Ġwill Ġbe Ġmade . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠT , ĠK > Ġfind ByKey ( type : ĠK Class < E >, Ġkey : ĠK ): ĠR ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ{@ link ĠBlock ing Entity Store } Ġversion Ġof Ġthis Ġentity Ġstore . ĠIf Ġthe Ġimplementation ĊĠĠĠĠ Ġ* Ġis Ġalready Ġblocking Ġmay Ġreturn Ġitself . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Blocking (): ĠBlock ing Entity Store < T > Ċ } Ċ Ċ interface ĠBlock ing Entity Store < T Ġ: ĠAny > Ġ: ĠEntity Store < T , ĠAny > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġinsert ( entity : ĠE ): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġinsert ( entities : ĠIterable < E >): ĠIterable < E > ĊĠĠĠ Ġoverride Ġfun Ġ< K Ġ: ĠAny , ĠE Ġ: ĠT > Ġinsert ( entity : ĠE , Ġkey Class : ĠK Class < K >): ĠK ĊĠĠĠ Ġoverride Ġfun Ġ< K Ġ: ĠAny , ĠE Ġ: ĠT > Ġinsert ( entities : ĠIterable < E >, Ġkey Class : ĠK Class < K >): ĠIterable < K > ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġupdate ( entity : ĠE ): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġupdate ( entities : ĠIterable < E >): ĠIterable < E > ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġupsert ( entity : ĠE ): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġupsert ( entities : ĠIterable < E >): ĠIterable < E > ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entity : ĠE ): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entity : ĠE , Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġrefresh ( entities : ĠIterable < E >, Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠIterable < E > ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġrefresh All ( entity : ĠE ): ĠE ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġdelete ( entity : ĠE ): ĠVoid ? ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT > Ġdelete ( entities : ĠIterable < E >): ĠVoid ? ĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠT , ĠK > Ġfind ByKey ( type : ĠK Class < E >, Ġkey : ĠK ): ĠE ? ĊĊĠĠĠ Ġfun Ġ< V > Ġwith Transaction ( body : ĠBlock ing Entity Store < T >. () Ġ-> ĠV ): ĠV ĊĠĠĠ Ġfun Ġ< V > Ġwith Transaction ( is olation : ĠTransaction Isolation , Ġbody : ĠBlock ing Entity Store < T >. () Ġ-> ĠV ): ĠV ĊĊĠĠĠ Ġoperator Ġfun Ġ< V > Ġinvoke ( block : ĠBlock ing Entity Store < T >. () Ġ-> ĠV ): ĠV Ġ= Ġblock () ĊĊĠĠĠ Ġval Ġtransaction : ĠTransaction Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny , Ġre ified ĠE Ġ: ĠT > ĠBlock ing Entity Store < T > ĊĠĠĠĠĠĠĠ Ġ. refresh ( entity : ĠE , Ġvar arg Ġproperties : ĠK Property 1 < E , Ġ* >): ĠE Ġ{ ĊĠĠĠ Ġval Ġattributes : ĠMutable Set < Queryable Attribute < E , Ġ* >> Ġ= ĠLinked HashSet () ĊĠĠĠ Ġproperties . forEach Ġ{ Ġproperty Ġ-> Ġattributes . add ( find Attribute ( property )) Ġ} ĊĠĠĠ Ġreturn Ġrefresh ( entity , Ġ* attributes . to Typed Array ()) Ċ } Ċ