/* Ċ Ġ* ĠCopyright Ġ( C ) 2 0 1 8 Ġ- ĠDen y ĠPr ase ty o Ġ< jas o et 8 7 @ gmail . com > Ċ Ġ* Ċ Ġ* Ġ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 ĠM orph ia . kt ANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġid . y of rame work . morph ia . repository Ċ Ċ import Ġcom . mongodb . Write Result Ċ import Ġid . y of rame work . core . model . Model Ċ import Ġid . y of rame work . morph ia . extension . invoke Ċ import Ġid . y of rame work . morph ia . extension . orders Ċ import Ġorg . mongodb . morph ia . Datastore Ċ import Ġorg . mongodb . morph ia . Key Ċ import Ġorg . mongodb . morph ia . aggregation . Aggregation Pipeline Ċ import Ġorg . mongodb . morph ia . query . Find Options Ċ import Ġorg . mongodb . morph ia . query . Query Ċ import Ġorg . mongodb . morph ia . query . Update Operations Ċ import Ġorg . mongodb . morph ia . query . Update Results Ċ import Ġkotlin . reflect . K Class Ċ Ċ abstract Ġclass ĠRepository < T Ġ: ĠModel , Ġin ĠID Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġdatastore : ĠData store , ĊĠĠĠ Ġprivate Ġval Ġid Field : ĠString , ĊĠĠĠ Ġprivate Ġval Ġentity Class : ĠK Class < T > Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġquery : ĠQuery < T > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdatastore . createQuery ( entity Class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġupdate Ops : ĠUpdate Operations < T > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdatastore . create Update Operations ( entity Class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġaggregate : ĠAg gregation Pipeline ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdatastore . create Aggregation ( entity Class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġdefault Update Ops ( model : ĠT ): ĠUpdate Operations < T > ĊĊĠĠĠ Ġopen Ġfun Ġsave ( model : ĠT ): ĠKey < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . save ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsave ( iterable Model : ĠIterable < T >): ĠIterable < Key < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . save ( iterable Model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠfindAll ( var arg Ġorders : ĠString , Ġfind Options : ĠFind Options Ġ= ĠFind Options ()): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . orders (* orders ). asList ( find Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġfind ByKey ( id : ĠKey < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . getBy Key ( entity Class . java , Ġid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠfindBy Keys ( id : ĠIterable < Key < T >> ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . getBy Keys ( entity Class . java , Ġid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcreate Query ById ( id : ĠID ): ĠQuery < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . field ( id Field ). equal ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġfind ById ( id : ĠID ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Query ById ( id ). get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcreate Query ById s ( ids : ĠIterable < *> ): ĠQuery < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . field ( id Field ). ` in `( ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠfindAll ById s ( ids : ĠIterable <* >, Ġfind Options : ĠFind Options Ġ= ĠFind Options ()): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Query ById s ( ids ). asList ( find Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcreate Query By Fields ( var arg Ġfield List : ĠPair < String , ĠAny ?> ): ĠQuery < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfield List . fold ( query ) Ġ{ Ġq , Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . filter ( field , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠfindBy Fields ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfield List : ĠPair < String , ĠAny ? >, ĊĠĠĠĠĠĠĠ Ġfind Options : ĠFind Options Ġ= ĠFind Options () ĊĠĠĠ Ġ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Query By Fields (* field List ). get ( find Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠfindAll By Fields ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfield List : ĠPair < String , ĠAny ? >, ĊĠĠĠĠĠĠĠ Ġfind Options : ĠFind Options Ġ= ĠFind Options () ĊĠĠĠ Ġ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Query By Fields (* field List ). asList ( find Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcount (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcount By Fields ( var arg Ġfield List : ĠPair < String , ĠAny ?> ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Query By Fields ( field List Ġ= Ġfield List ). count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate ( id : ĠID , Ġupdate Operation : ĠUpdate Operations < T >): ĠUpdate Results Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġdatastore . createQuery ( entity Class . java ). field ( id Field ). equal ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . update ( query , Ġupdate Operation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate ( query : ĠQuery < T >, Ġupdate Operation : ĠUpdate Operations < T >): ĠUpdate Results Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . update ( query , Ġupdate Operation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate ( id : ĠID , Ġmodel : ĠT ): ĠUpdate Results Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Query Ġ= Ġquery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ( id Field ). equal ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate ( id Query , Ġdefault Update Ops ( model )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate By Map ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġupdate Query : ĠPair < String , ĠAny ? >, ĊĠĠĠĠĠĠĠ Ġupdate Operation : ĠMap < String , ĠAny ?> ĊĠĠĠ Ġ): ĠUpdate Results Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate By Fields (* update Query , Ġupdate Operation Ġ= Ġupdate Operation . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate By Fields ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġupdate Query : ĠPair < String , ĠAny ? >, ĊĠĠĠĠĠĠĠ Ġupdate Operation : ĠList < Pair < String , ĠAny ? >> ĊĠĠĠ Ġ): ĠUpdate Results Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqueries Ġ= Ġupdate Query . fold ( query ) Ġ{ Ġq , Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . filter ( field , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdate Operations Ġ= Ġupdate Operation . toList (). fold ( update Ops ) Ġ{ Ġu , Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu ( field Ġto Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate ( queries , Ġupdate Operations ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdelete ( model : ĠT ): ĠWrite Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . delete ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdelete ById ( id : ĠID ): ĠWrite Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . delete ( entity Class . java , Ġid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdelete ById s ( ids : ĠIterable < ID >): ĠWrite Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . delete ( entity Class . java , Ġids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdelete By Fields ( var arg Ġdelete Fields : ĠPair < String , ĠAny ?> ): ĠWrite Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqueries Ġ= Ġdelete Fields . fold ( query ) Ġ{ Ġq , Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . filter ( field , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdatastore . delete ( queries ) ĊĠĠĠ Ġ} Ċ } Ċ