/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠCo up ang ĠLtd . Ċ Ġ* Ċ Ġ* Ġ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 . springframework . data . re query . kotlin . coroutines Ċ Ċ import Ġio . re query . Transaction Isolation Ċ import Ġio . re query . kotlin . Deletion Ċ import Ġio . re query . kotlin . Insert Into Ċ import Ġio . re query . kotlin . Insertion Ċ import Ġio . re query . kotlin . Queryable Attribute Ċ import Ġio . re query . kotlin . Selection Ċ import Ġio . re query . kotlin . Update Ċ import Ġio . re query . meta . Attribute Ċ import Ġio . re query . meta . Entity Model Ċ import Ġio . re query . query . Expression Ċ import Ġio . re query . query . Result Ċ import Ġio . re query . query . Tuple Ċ import Ġio . re query . query . element . Query Element Ċ import Ġio . re query . query . function . Count Ċ import Ġio . re query . sql . Entity Context Ċ import Ġio . re query . sql . Kotlin Entity DataStore Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġorg . springframework . data . re query . kotlin . apply Where Conditions Ċ import Ġorg . springframework . data . re query . kotlin . getEntity Context Ċ import Ġorg . springframework . data . re query . kotlin . getEntity Model Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠKotlin ĠCor outines ĠíĻ ĺ ê²½ Ġíķĺ ìĹĲìĦľ Ġìĭ¤íĸī ëĲĺëĬĶ ĠRe query Operations Ġìŀħ ëĭĪëĭ¤ . ĊĊ Ġ* Ġ@ author Ġdeb op Ċ Ġ*/ Ċ interface ĠCor outine Re query Operations Ġ: ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġval Ġentity Store : ĠCor outine Entity Store < Any > ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġval Ġentity Model : ĠEntity Model ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentity Store . delegate . getEntity Model () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġval Ġentity Context : ĠEntity Context < out ĠAny > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġentity Store . delegate . getEntity Context () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġselect ( entity Type : ĠK Class < T >): ĠSelection < out ĠDeferred Result < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . select ( entity Type ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġselect ( entity Type : ĠK Class < T >, Ġvar arg Ġattributes : ĠQuery able Attribute < T , Ġ* >): ĠSelection < out ĊĠĠĠ ĠDeferred Result < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . select ( entity Type , Ġ* attributes ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġselect ( var arg Ġexpressions : ĠExpression < *> ): ĠSelection < out ĠDeferred Result < Tuple >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . select (* expressions ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny , ĠID > Ġfind ById ( entity Type : ĠK Class < T >, Ġid : ĠID ): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . findBy Key ( entity Type , Ġid ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > ĠfindAll ( entity Type : ĠK Class < T >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Store ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select ( entity Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Deferred Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġrefresh ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . refresh ( entity ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġrefresh ( entity : ĠT , Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . refresh ( entity , Ġ* attributes ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġrefresh All ( entities : ĠIterable < T >, Ġvar arg Ġattributes : ĠAttribute < *, Ġ* >): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . refresh < T >( entities , Ġ* attributes ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġrefresh All Properties ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . refresh All ( entity ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġrefresh All Entities ( entities : ĠIterable < T >, Ġvar arg Ġattributes : ĠAttribute < T , Ġ* >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . map Ġ{ Ġrefresh All Properties ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġupsert ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . upsert ( entity ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġupsert All ( entities : ĠIterable < T >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( entities . none ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentity Store . upsert < T >( entities ). await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġinsert ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert ( entity ). await () ĊĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny , ĠK Ġ: ĠAny > Ġinsert ( entity : ĠT , Ġkey K lass : ĠK Class < K >): ĠK Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert ( entity , Ġkey K lass ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġinsert ( entity Type : ĠK Class < T >): ĠInsert ion < out ĠDeferred Result < Tuple >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert < T >( entity Type ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġinsert ( entity Type : ĠK Class < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġattributes : ĠQuery able Attribute < T , Ġ* >): ĠInsert Into < out ĠDeferred Result < Tuple >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert ( entity Type , Ġ* attributes ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġinsert All ( entities : ĠIterable < T >): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert < T >( entities ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny , ĠK Ġ: ĠAny > Ġinsert All ( entities : ĠIterable < T >, Ġkey K lass : ĠK Class < K >): ĠList < K > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . insert < K , ĠT >( entities , Ġkey K lass ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġupdate (): ĠUpdate < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . update () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġupdate ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . update ( entity ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġupdate ( entity Type : ĠK Class < T >): ĠUpdate < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . update < T >( entity Type ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġupdate All ( entities : ĠIterable < T >): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . update < T >( entities ). await () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġdelete (): ĠDe letion < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . delete () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġdelete ( entity : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity Store . delete ( entity ). await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġdelete ( entity Type : ĠK Class < T >): ĠDe letion < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . delete < T >( entity Type ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġdelete All ( entities : ĠIterable < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity Store . delete < T >( entities ). await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġdelete All ( entity Type : ĠK Class < T >): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . delete < T >( entity Type ). get (). call () ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġin fix Ġfun Ġ< T Ġ: ĠAny > Ġcount ( entity Type : ĠK Class < T >): ĠSelection < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . count ( entity Type ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< E Ġ: ĠAny > Ġcount ( var arg Ġattributes : ĠQuery able Attribute < Any , Ġ* >): ĠSelection < out ĠDeferred Scalar < Int >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . count (* attributes ) ĊĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< E Ġ: ĠAny > Ġcount ( entity Type : ĠK Class < E >, Ġwhere Clause : ĠQuery Element < out ĠResult < E >> ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġselect ( Count . count ( entity Type . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Where Conditions ( where Clause . where Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. unwrap Query () ĊĊĠĠĠĠĠĠĠ Ġval Ġtuple Ġ= Ġquery . get (). first () ĊĠĠĠĠĠĠĠ Ġreturn Ġtuple [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< E Ġ: ĠAny > Ġexists ( entity Type : ĠK Class < E >, Ġwhere Clause : ĠQuery Element < out ĠResult < E >> ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhere Clause . limit ( 1 ). get (). first OrNull () Ġ!= Ġnull ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġraw ( query : ĠString , Ġvar arg Ġparameters : ĠAny ): ĠDeferred Result < Tuple > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . raw ( query , Ġ* parameters ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġraw ( entity Type : ĠK Class < T >, Ġquery : ĠString , Ġvar arg Ġparameters : ĠAny ): ĠDeferred Result < T > Ġ= ĊĠĠĠĠĠĠĠ Ġentity Store . raw ( entity Type , Ġquery , Ġ* parameters ) ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġwith Transaction ( block : ĠCor outine Re query Operations . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Transaction ( null , Ġblock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġwith Transaction ( is olation : ĠTransaction Isolation ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock : ĠCor outine Re query Operations . () Ġ-> ĠT ): ĠT ĊĊĠĠĠ Ġ@ Jvm Default ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġwith DataStore ( block : ĠKotlin Entity DataStore < Any >. () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock . invoke ( entity Store . delegate ) ĊĠĠĠ Ġ} Ċ Ċ }