/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠAnd ers ĠM ikk els en Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . n anno q . tools . repository . repository Ċ Ċ import Ġcom . n anno q . tools . repository . models . Model Ċ import Ġcom . n anno q . tools . repository . models . Model Utils Ċ import Ġcom . n anno q . tools . repository . repository . etag . ET ag Manager Ċ import Ġcom . n anno q . tools . repository . repository . results . Create Result Ċ import Ġcom . n anno q . tools . repository . repository . results . Delete Result Ċ import Ġcom . n anno q . tools . repository . repository . results . ItemList Result Ċ import Ġcom . n anno q . tools . repository . repository . results . Item Result Ċ import Ġcom . n anno q . tools . repository . repository . results . Update Result Ċ import Ġcom . n anno q . tools . repository . utils . Filter Parameter Ċ import Ġcom . n anno q . tools . repository . utils . OrderBy Parameter Ċ import Ġcom . n anno q . tools . repository . utils . Query Pack Ċ import Ġio . vertx . core . AsyncResult Ċ import Ġio . vertx . core . Composite Future Ċ import Ġio . vertx . core . Future Ċ import Ġio . vertx . core . Handler Ċ import Ġio . vertx . core . json . Json Ċ import Ġio . vertx . core . json . JsonObject Ċ import Ġio . vertx . core . logging . Logger Ċ import Ġio . vertx . core . logging . LoggerFactory Ċ import Ġio . vertx . service proxy . ServiceException Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġjava . util . Abstract Map . Simple Entry Ċ import Ġjava . util . Abstract Map . Simple Immutable Entry Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Date Ċ import Ġjava . util . Queue Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . stream . Collectors . toList Ċ import Ġjava . util . stream . Collectors . toMap Ċ Ċ /** Ċ Ġ* ĠThe Ġrepository Ġinterface Ġis Ġthe Ġbase Ġof Ġthe ĠRepository Ġtools . ĠIt Ġdefines Ġa Ġcontract Ġfor Ġall Ġrepositories Ġand Ġcontains Ċ Ġ* Ġstandard ized Ġlogic . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAnd ers ĠM ikk els en Ċ Ġ* Ġ@ version Ġ 1 7 . 1 1 . 2 0 1 7 Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ interface ĠRepository < E Ġ: ĠModel > Ġ{ ĊĠĠĠ Ġval Ġet ag Manager : ĠE Tag Manager < *> ? ĊĊĠĠĠ Ġval Ġis Cached : ĠBoolean ĊĠĠĠ Ġval Ġis E tag Enabled : ĠBoolean ĊĊĠĠĠ Ġenum Ġclass ĠIN CRE MENT ATION Ġ{ ĊĠĠĠĠĠĠĠ ĠADD ITION , ĠSUB TR ACTION ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( record : ĠE , Ġresult Handler : ĠHandler < AsyncResult < Create Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Create ( listOf ( record ), ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future < Create Result < E >>( it . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġit . result (). iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . hasNext () Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( iterator . next ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . failed Future ( NullPointerException ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( record : ĠE ): ĠFuture < Create Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Future Ġ= ĠFuture . future < Create Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġcreate ( record , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġcreate Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcreate Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Create ( records : ĠList < E >, Ġresult Handler : ĠHandler < AsyncResult < List < Create Result < E >>>> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Write ( true , Ġrecords . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġr Ġ-> ĠSimple Entry < E , ĠFunction < E , ĠE >>( r , ĠFunction Ġ{ Ġrecord Ġ-> Ġrecord Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( toMap ({ Ġit . key Ġ}, Ġ{ Ġit . value Ġ})), ĠHandler Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future < List < Create Result < E >> >( res . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( res . result (). stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCreate Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( toList < Create Result < E >> ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Create ( records : ĠList < E >): ĠFuture < List < Create Result < E >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Future Ġ= ĠFuture . future < List < Create Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġbatch Create ( records , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġcreate Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcreate Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( record : ĠE , Ġresult Handler : ĠHandler < AsyncResult < Update Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Update ( Collections . singleton Map < E , ĠFunction < E , ĠE >>( record , ĠFunction Ġ{ Ġr Ġ-> Ġr Ġ}), ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Update ( result Handler , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( record : ĠE ): ĠFuture < Update Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Future Ġ= ĠFuture . future < Update Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġupdate ( record , ĠFunction Ġ{ Ġr Ġ-> Ġr Ġ}, ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġupdate Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( record : ĠE , Ġupdate Logic : ĠFunction < E , ĠE >, Ġresult Handler : ĠHandler < AsyncResult < Update Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Update ( Collections . singleton Map ( record , Ġupdate Logic ), ĠHandler Ġ{ Ġdo Update ( result Handler , Ġit ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Update ( result Handler : ĠHandler < AsyncResult < Update Result < E >> >, Ġres : ĠAsync Result < List < Update Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future ( res . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġres . result (). iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . hasNext () Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( iterator . next ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . failed Future ( NullPointerException ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( record : ĠE , Ġupdate Logic : ĠFunction < E , ĠE >): ĠFuture < Update Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Future Ġ= ĠFuture . future < Update Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġupdate ( record , Ġupdate Logic , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġupdate Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Update ( records : ĠList < E >, Ġresult Handler : ĠHandler < AsyncResult < List < Update Result < E >>>> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollect : ĠMap < E , ĠFunction < E , ĠE >> Ġ= Ġrecords ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġr Ġ-> ĠSimple Immutable Entry < E , ĠFunction < E , ĠE >>( r , ĠFunction Ġ{ Ġrec Ġ-> Ġrec Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( HashMap ()) Ġ{ Ġaccumulator , Ġitem Ġ-> Ġaccumulator [ item . key ] Ġ= Ġitem . value ; Ġaccumulator Ġ} ĊĊĠĠĠĠĠĠĠ Ġbatch Update ( collect , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Update ( records : ĠMap < E , ĠFunction < E , ĠE >>, Ġresult Handler : ĠHandler < AsyncResult < List < Update Result < E >>>> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Write ( false , Ġrecords , ĠHandler Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future < List < Update Result < E >> >( res . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( res . result (). stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUpdate Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( toList < Update Result < E >> ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Update ( records : ĠList < E >): ĠFuture < List < Update Result < E >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture . future < List < Update Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġbatch Update ( records , Ġfuture ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfuture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Update ( records : ĠMap < E , ĠFunction < E , ĠE >> ): ĠFuture < List < Update Result < E >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Future Ġ= ĠFuture . future < List < Update Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġbatch Update ( records , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġupdate Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( identifiers : ĠJsonObject , Ġresult Handler : ĠHandler < AsyncResult < Delete Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentifiers . isEmpty Ġ-> Ġresult Handler . handle ( ServiceException . fail ( 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Identifier Ġfor Ġremote Delete Ġcannot Ġbe Ġempty ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbatch Delete ( listOf ( identifiers ), ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future < Delete Result < E >>( it . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġit . result (). iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . hasNext () Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( iterator . next ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . failed Future ( NullPointerException ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( identifiers : ĠJsonObject ): ĠFuture < Delete Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete Future Ġ= ĠFuture . future < Delete Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġdelete ( identifiers , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġdelete Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdelete Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Delete ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠList < JsonObject >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < List < Delete Result < E >>>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentifiers . isEmpty () Ġ-> Ġresult Handler . handle ( ServiceException . fail ( 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Identifiers Ġfor Ġbatch Delete Ġcannot Ġbe Ġempty ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdo Delete ( identifiers , ĠHandler Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . failed () Ġ-> Ġresult Handler . handle ( Future . failed Future < List < Delete Result < E >> >( res . cause ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Handler . handle ( Future . succeeded Future ( res . result (). stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDelete Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( toList < Delete Result < E >> ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Delete ( identifiers : ĠList < JsonObject >): ĠFuture < List < Delete Result < E >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete Future Ġ= ĠFuture . future < List < Delete Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġbatch Delete ( identifiers , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġdelete Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdelete Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġincrement Field ( record : ĠE , ĠfieldName : ĠString ): ĠFunction < E , ĠE > ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġdecrement Field ( record : ĠE , ĠfieldName : ĠString ): ĠFunction < E , ĠE > ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġresult Handler : ĠHandler < AsyncResult < Item Result < E >> >) ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġprojection s : ĠArray < String >, Ġresult Handler : ĠHandler < AsyncResult < Item Result < E >> >) ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject ): ĠFuture < Item Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < Item Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread ( identifiers , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Read ( identifiers : ĠSet < JsonObject >, Ġresult Handler : ĠHandler < AsyncResult < List < Item Result < E >>>> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Read ( ArrayList ( identifiers ), Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Read ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠSet < JsonObject >, ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < List < Item Result < E >>>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Read ( ArrayList ( identifiers ), Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Read ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠList < JsonObject >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < List < Item Result < E >>>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbatch Read ( ArrayList ( identifiers ), Ġnull , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Read ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠList < JsonObject >, ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < List < Item Result < E >>>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture List Ġ= ĠArrayList < Future <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġqueued F utures Ġ= ĠConcurrent Linked Queue < Future < Item Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġidentifiers . stream (). forEach Ordered Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture . future < Item Result < E >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture List . add ( future ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueued F utures . add ( future ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection s Ġ!= Ġnull Ġ-> Ġread ( it , Ġprojection s , Ġfuture ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread ( it , Ġfuture ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠComposite Future . all ( future List ). set Handler Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . failed () Ġ-> Ġresult Handler . handle ( ServiceException . fail ( 5 0 0 , Ġ" Unable Ġto Ġperformed Ġbatch read !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJsonObject (). put (" ids ", Ġidentifiers ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġqueued F utures . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . result () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( toList ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Handler . handle ( Future . succeeded Future ( results )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbatch Read ( identifiers : ĠList < JsonObject >, Ġprojection s : ĠArray < String > Ġ= ĠarrayOf ()): ĠFuture < List < Item Result < E >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture . future < List < Item Result < E >> >() ĊĊĠĠĠĠĠĠĠ Ġbatch Read ( identifiers , Ġprojection s , Ġfuture ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfuture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġconsistent : ĠBoolean , Ġresult Handler : ĠHandler < AsyncResult < Item Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġread ( identifiers , Ġconsistent , Ġnull , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġconsistent : ĠBoolean ): ĠFuture < Item Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < Item Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread ( identifiers , Ġconsistent , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġconsistent : ĠBoolean , Ġprojection s : ĠArray < String > ?, Ġresult Handler : ĠHandler < AsyncResult < Item Result < E >> >) ĊĊĠĠĠ Ġfun Ġread ( identifiers : ĠJsonObject , Ġconsistent : ĠBoolean , Ġprojection s : ĠArray < String >): ĠFuture < Item Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < Item Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread ( identifiers , Ġconsistent , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( result Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġread All (): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( page Token : ĠString ?, Ġresult Handler : ĠHandler < AsyncResult < ItemList Result < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġread All ( null , Ġpage Token , Ġnull , Ġnull , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( page Token : ĠString ?): ĠFuture < ItemList Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < ItemList Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( null , Ġpage Token , Ġnull , Ġnull , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġfilter Parameter Map : ĠMap < String , ĠList < Filter Parameter >>, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < List < E >>> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġread All ( identifiers : ĠJsonObject , Ġfilter Param ter Map : ĠMap < String , ĠList < Filter Parameter >> ): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( identifiers , Ġfilter Param ter Map , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack , ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < ItemList Result < E >>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread All ( identifiers , Ġquery Pack . page Token , Ġquery Pack , Ġquery Pack . projection s , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( identifiers : ĠJsonObject , Ġquery Pack : ĠQuery Pack ): ĠFuture < ItemList Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture . future < ItemList Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( identifiers , Ġquery Pack . page Token , Ġquery Pack , Ġquery Pack . projection s , Ġfuture ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfuture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠJsonObject ?, ĊĠĠĠĠĠĠĠ Ġpage Token : ĠString ?, ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack ?, ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < ItemList Result < E >>> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġpage Token : ĠString ?, ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack , ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String > ĊĠĠĠ Ġ): ĠFuture < ItemList Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < ItemList Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( identifiers , Ġpage Token , Ġquery Pack , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġpage Token : ĠString ?, ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack , ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < ItemList Result < E >>> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġread All ( ĊĠĠĠĠĠĠĠ Ġpage Token : ĠString ?, ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack , ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String > ĊĠĠĠ Ġ): ĠFuture < ItemList Result < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < ItemList Result < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All ( page Token , Ġquery Pack , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaggregation ( identifiers : ĠJsonObject , Ġquery Pack : ĠQuery Pack , Ġresult Handler : ĠHandler < AsyncResult < String >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġaggregation ( identifiers , Ġquery Pack , Ġquery Pack . projection s , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaggregation ( identifiers : ĠJsonObject , Ġquery Pack : ĠQuery Pack ): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < String >() ĊĊĠĠĠĠĠĠĠ Ġaggregation ( identifiers , Ġquery Pack , Ġread Future ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaggregation ( ĊĠĠĠĠĠĠĠ Ġidentifiers : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġquery Pack : ĠQuery Pack , ĊĠĠĠĠĠĠĠ Ġprojection s : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġresult Handler : ĠHandler < AsyncResult < String >> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġaggregation ( identifiers : ĠJsonObject , Ġquery Pack : ĠQuery Pack , Ġprojection s : ĠArray < String >): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < String >() ĊĊĠĠĠĠĠĠĠ Ġaggregation ( identifiers , Ġquery Pack , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Parameters ( ĊĠĠĠĠĠĠĠ Ġquery Map : ĠMap < String , ĠList < String >>, ĊĠĠĠĠĠĠĠ Ġfields : ĠArray < Field >, ĊĠĠĠĠĠĠĠ Ġmethods : ĠArray < Method >, ĊĠĠĠĠĠĠĠ Ġerrors : ĠJsonObject , ĊĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < Filter Parameter >>, ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Array , ĊĠĠĠĠĠĠĠ ĠorderBy Queue : ĠQueue < OrderBy Parameter >, ĊĠĠĠĠĠĠĠ Ġindex Name : ĠArray < String > ĊĠĠĠ Ġ): ĠJsonObject ĊĊĠĠĠ Ġfun Ġparse Param ( ĊĠĠĠĠĠĠĠ Ġtype : ĠClass < E >, ĊĠĠĠĠĠĠĠ Ġparam Json String : ĠString , ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġparams : ĠMutable Map < String , ĠList < Filter Parameter >>, ĊĠĠĠĠĠĠĠ Ġerrors : ĠJsonObject ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Parameters Ġ= ĠJson . decode Value < Filter Parameter >( param Json String , ĠFilter Parameter :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Parameters Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Parameters . setField ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Parameters . isValid Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfilter Parameter List : ĠMutable List < Filter Parameter >? Ġ= Ġparams [ key ]?. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Parameter List Ġ== Ġnull ) Ġfilter Parameter List Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Parameter List . add ( filter Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams [ key ] Ġ= Ġfilter Parameter List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfilter Parameters . collect Errors ( errors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerrors . put ( key Ġ+ Ġ"_ error ", Ġ" Unable Ġto Ġparse ĠJSON Ġin Ġ'$ key ' Ġvalue !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString , Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString ): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All Without Pagination ( identifier , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString , Ġquery Pack : ĠQuery Pack , Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString , Ġquery Pack : ĠQuery Pack ): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All Without Pagination ( identifier , Ġquery Pack , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString , Ġquery Pack : ĠQuery Pack , Ġprojection s : ĠArray < String >, Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( identifier : ĠString , Ġquery Pack : ĠQuery Pack , Ġprojection s : ĠArray < String >): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All Without Pagination ( identifier , Ġquery Pack , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( query Pack : ĠQuery Pack , Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġread All Without Pagination ( query Pack , Ġnull , Ġresult Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( query Pack : ĠQuery Pack , Ġprojection s : ĠArray < String > ?, Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġread All Without Pagination ( query Pack : ĠQuery Pack , Ġprojection s : ĠArray < String > Ġ= ĠarrayOf ()): ĠFuture < List < E >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Future Ġ= ĠFuture . future < List < E >>() ĊĊĠĠĠĠĠĠĠ Ġread All Without Pagination ( query Pack , Ġprojection s , ĠHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . failed () Ġ-> Ġread Future . fail ( it . cause ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġread Future . complete ( it . result ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Future ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Write ( create : ĠBoolean , Ġrecords : ĠMap < E , ĠFunction < E , ĠE >>, Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġset CreatedAt ( record : ĠE ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord . createdAt Ġ= ĠDate () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrecord ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset UpdatedAt ( record : ĠE ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord . updatedAt Ġ= ĠDate () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrecord ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Delete ( identifiers : ĠList < JsonObject >, Ġresult Handler : ĠHandler < AsyncResult < List < E >> >) ĊĊĠĠĠ Ġfun Ġbuild Collection E tag ( et ags : ĠList < String >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew E tag Ġ= ĠLong Array ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġet ags . forEach Ġ{ Ġet ag Ġ-> Ġnew E tag [ 0 ] Ġ+= Ġet ag . hashCode (). to Long () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel Utils . hash String ( new E tag [ 0 ]. toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" no Tag For Collection " ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" no Tag For Collection " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract Value As Double ( field : ĠField , Ġr : ĠE ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . getLong ( r ). toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠLong ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠLong ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . getInt ( r ). toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠInt ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠInt ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . get Short ( r ). toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠShort ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠShort ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . getDouble ( r ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . get Float ( r ). toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠFloat ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( field . get ( r ) Ġas ĠFloat ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . error (" Conversion Ġis Ġnull !") ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Repository :: class . java . simple Name ) ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠORDER _ BY _ KEY Ġ= Ġ" orderBy " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLIMIT _ KEY Ġ= Ġ" limit " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO JECTION _ KEY Ġ= Ġ" projection " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMULTI PLE _ KEY Ġ= Ġ" multiple " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMULTI PLE _ IDS _ KEY Ġ= Ġ" ids " ĊĠĠĠ Ġ} Ċ } Ċ