package Ġorg . mobile toolkit . android . firebase . firestore Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . gms . tasks . Tasks Ċ import Ġcom . google . firebase . firestore .* Ċ import Ġorg . mobile toolkit . android . extensions . kotlin . to Ranges Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠSeb astian ĠO w od z in Ġon Ġ 1 4 / 0 8 / 2 0 1 8 . Ċ Ġ*/ Ċ interface ĠFire store Repository < Entity Ġ: ĠFire store Model > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Fire store Repository " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġentity Clazz : ĠClass < Entity > Ġ Ġ// TODO : Ġmake Ġthis Ġautomatic Ċ // ĠĠĠ Ġfun Ġ< T : ĠEntity > Ġbuild Entity ( document Snapshot : ĠDocument Snapshot ?, Ġof Class : ĠClass < T >): ĠT ? Ġ= Ċ // ĠĠĠĠĠĠĠ Ġdocument Snapshot ?. toObject With Reference ( of Class ) Ċ // Ċ // ĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠEntity > Ġbuild Entity ( document Snapshot : ĠDocument Snapshot ?): ĠT ? Ġ= Ġbuild Entity ( document Snapshot , ĠT :: class . java ) ĊĊĠĠĠ Ġval Ġcollection Path : ĠString ĊĊĠĠĠ Ġval Ġdb : ĠFirebase Fire store ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠFirebase Fire store . getInstance () ĊĊĠĠĠ Ġval Ġcollection Reference : ĠCollection Reference ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdb . collection ( collection Path ) ĊĊĠĠĠ Ġval Ġdebug Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġdocument Reference ( identifier : ĠString ): ĠDocument Reference Ġ= ĊĠĠĠĠĠĠĠ Ġcollection Reference . document ( identifier ) ĊĊĠĠĠ Ġfun Ġdocument Exists ( ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" document Exists Ġ-> Ġcollection Path : Ġ$ collection Path Ġ| Ġidentifier : Ġ$ identifier " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdocument Reference ( identifier ). get (). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . result ?. exists () Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Document ( ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ĊĠĠĠ Ġ): ĠTask < Entity ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" getDocument Ġ-> Ġcollection Path : Ġ$ collection Path Ġ| Ġidentifier : Ġ$ identifier " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdocument Reference ( identifier ). get (). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . result ?. let Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . toObject With Reference ( entity Clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Document ( ĊĠĠĠĠĠĠĠ Ġentity : ĠEntity , ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" create Document Ġ-> Ġcollection Path : Ġ$ collection Path Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġentity : Ġ$ entity Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġidentifier : Ġ$ identifier " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Documents ( listOf ( entity ), Ġidentifier ?. let Ġ{ ĠlistOf ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Documents ( ĊĠĠĠĠĠĠĠ Ġentities : ĠList < Entity >, ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠList < String ?> ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" create Documents Ġ-> Ġcollection Path : Ġ$ collection Path Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġentities : Ġ$ entities Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġidentifier : Ġ$ identifiers " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbatch ( create Data Ġ= Ġentities . zip ( identifiers Ġ?: ĠlistOf ())). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Document ( ĊĠĠĠĠĠĠĠ Ġentity : ĠEntity ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" update Document Ġ-> Ġcollection Path : Ġ$ collection Path Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġentity : Ġ$ entity " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Documents ( listOf ( entity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Documents ( ĊĠĠĠĠĠĠĠ Ġentities : ĠList < Entity > ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" update Documents Ġ-> Ġcollection Path : Ġ$ collection Path Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ġ Ġ* Ġentities : Ġ$ entities " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbatch ( update Data Ġ= Ġentities ). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Document ( ĊĠĠĠĠĠĠĠ Ġentity : ĠEntity ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" delete Document Ġ-> Ġcollection Path : Ġ$ collection Path \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġentity : Ġ$ entity " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Documents ( listOf ( entity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Document ( ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" delete Document Ġ-> Ġcollection Path : Ġ$ collection Path Ġ| Ġidentifier : Ġ$ identifier ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Documents ( null , ĠlistOf ( identifier )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Documents ( ĊĠĠĠĠĠĠĠ Ġentities : ĠList < Entity >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠList < String ?> ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" delete Documents Ġ-> Ġcollection Path : Ġ$ collection Path \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġentities : Ġ$ entities \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġidentifiers : Ġ$ identifiers " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdelete Data Ġ= Ġwith (( entities Ġ?: Ġidentifiers )?. count () Ġ?: Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" delete Document Ġ-> Ġdelete Data Ġ-> Ġcollection Path : Ġ$ collection Path Ġ| Ġcount : Ġ$ this ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġthis ). map Ġ{ Ġentities ?. get ( it ) Ġto Ġidentifiers ?. get ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbatch ( delete Data Ġ= Ġdelete Data ). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch ( ĊĠĠĠĠĠĠĠ Ġcreate Data : ĠList < Pair < Entity , ĠString ? >> ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġupdate Data : ĠList < Entity >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdelete Data : ĠList < Pair < Entity ?, ĠString ? >> ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTask < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" batch Ġ-> Ġcollection Path : Ġ$ collection Path \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġcreate Data : Ġ$ create Data \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġupdate Data : Ġ$ update Data \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ Ġ* Ġdelete Data : Ġ$ delete Data " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoperations Ġ= Ġ( create Data ?. map Ġ{ ĠBatch Operation ( create Data Ġ= Ġit ) Ġ} Ġ?: ĠlistOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( update Data ?. map Ġ{ ĠBatch Operation ( update Data Ġ= ĠPair ( it , Ġit ._ identifier ())) Ġ} Ġ?: ĠlistOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( delete Data ?. map Ġ{ ĠBatch Operation ( delete Data Ġ= Ġit ) Ġ} Ġ?: ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" batch Ġ-> Ġoperations : Ġ$ operations ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbatches : ĠList < Write Batch > Ġ= Ġoperations . count (). to Ranges ( 5 0 0 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" batch Ġ-> Ġrange : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= Ġdb . batch () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations . slice ( it ). forEach Ġ{ Ġslice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslice . create Data Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġslice . create Data . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġslice . create Data . second ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ref Ġ= Ġwith ( collection Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier ?. let Ġ{ Ġdoc Id Ġ-> Ġdocument ( doc Id ) Ġ} Ġ?: Ġdocument () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . set ( doc Ref , Ġentity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslice . update Data Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġslice . update Data . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġslice . update Data . second ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( collection Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity . document Reference Ġ?: Ġidentifier ?. let Ġ{ Ġdoc Id Ġ-> Ġdocument ( doc Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġdoc Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . set ( doc Ref , Ġentity , ĠSet Options . merge ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslice . delete Data Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġslice . delete Data . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġslice . delete Data . second ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( collection Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity ?. document Reference Ġ?: Ġidentifier ?. let Ġ{ Ġdoc Id Ġ-> Ġdocument ( doc Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġdoc Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . delete ( doc Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTasks . when All ( batches . map Ġ{ Ġit . commit () Ġ}). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Documents (): ĠTask < List < Entity >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Documents Ġ-> Ġcollection Path : Ġ$ collection Path ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcollection Reference . get (). continue With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . result ?. map NotNull Ġ{ Ġdoc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . toObject With Reference ( entity Clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBatch Operation < Entity , ĠIdentifier >( ĊĠĠĠĠĠĠĠ Ġval Ġcreate Data : ĠPair < Entity , ĠIdentifier ?> ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġupdate Data : ĠPair < Entity , ĠIdentifier >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġdelete Data : ĠPair < Entity ?, ĠIdentifier ?> ? Ġ= Ġnull ĊĠĠĠ Ġ) Ċ } Ċ