package Ġcz . enc irc led . join er . reactive Ċ Ċ import Ġcom . query dsl . core . types . Param Expression Ċ import Ġcom . query dsl . core . types . Param Not Set Exception Ċ import Ġcom . query dsl . core . types . dsl . Param Ċ import Ġcz . enc irc led . join er . core . Join er Ċ import Ġcz . enc irc led . join er . query . Join er Query Ċ import Ġcz . enc irc led . join er . reactive . composer . Join er Composer Ċ import Ġorg . hibernate . reactive . stage . Stage Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Completion Stage Ċ import Ġjavax . persistence . EntityManager Factory Ċ Ċ /** Ċ Ġ* ĠEn caps ulates ĠHibernate ĠReactive ĠAPI Ġand Ġprovides Ġinternal Ġreactive ĠAPI Ġinstead . Ċ Ġ* Ċ Ġ* ĠBase Ġclass Ġfor Ġother Ġreactive Ġimplementations Ġof ĠJoin er Ċ Ġ*/ Ċ abstract Ġclass ĠGeneric Hibernate Reactive Join er ( emf : ĠEntity ManagerFactory ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġjoin er Ġ= ĠJoin er ( emf . create EntityManager ()) ĊĊĠĠĠ Ġprivate Ġval Ġsession Factory : ĠStage . SessionFactory Ġ= Ġem f . unwrap ( Stage . SessionFactory :: class . java ) ĊĊĠĠĠ Ġfun Ġ< T , ĠC , ĠP > Ġexecute Comp osed ( c : ĠJoin er Composer < T , ĠC , ĠP >): ĠCompletion Stage < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Factory . with Transaction Ġ{ Ġsession , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurr Ġ= Ġexecute Chain Step ( false , Ġsession , Ġc . steps [ 0 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 Ġuntil Ġc . steps . size ). forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Ġ= Ġcurr . then Compose Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Chain Step ( v , Ġsession , Ġc . steps [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Ġas ĠCompletion Stage < C > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġcurrent Ġresult Ġset ĊĠĠĠĠ Ġ* Ġ@ param Ġsession ĠDB Ġsession Ġwith Ġopen Ġtransaction ĊĠĠĠĠ Ġ* Ġ@ param Ġstep Ġchain Ġstep Ġto Ġbe Ġexecuted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġexecute Chain Step ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠAny , ĊĠĠĠĠĠĠĠ Ġsession : ĠStage . Session , ĊĠĠĠĠĠĠĠ Ġstep : ĠExecution Step < *> ĊĠĠĠ Ġ): ĠCompletion Stage < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġstep Result Ġ= Ġstep . perform ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletableFuture < *> Ġ-> Ġstep Result . then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . convert Result ( it Ġas ĠList < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJoin er Query < *, Ġ*> Ġ-> Ġcreate Query ( session , Ġstep Result ). result List . then Apply Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . convert Result ( it Ġas ĠList < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġsession . persist Multiple ( step Result ). then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . convert Result ( it Ġas ĠList < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsession . persist ( step Result ). then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . convert Result ( listOf ( session . getReference ( step Result )) Ġas ĠList < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġdo Persist ( entity : ĠT ): ĠCompletion Stage < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Factory . with Transaction Ġ{ Ġsession , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . persist ( entity ). then Apply Ġ{ Ġsession . getReference ( entity ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġdo Persist Multiple ( entities : ĠCollection < T >): ĠCompletion Stage < List < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Factory . with Transaction Ġ{ Ġsession , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . persist Multiple ( entities ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< T , ĠR > Ġdo Find ( query : ĠJoin er Query < T , ĠR >): ĠCompletion Stage < List < R >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Factory . with Transaction Ġ{ Ġsession , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Query ( session , Ġquery ). result List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdo Remove ( entity : ĠAny ): ĠCompletion Stage < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Factory . with Transaction Ġ{ Ġsession , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . remove ( session . getReference ( entity )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< R > Ġcreate Query ( session : ĠStage . Session , Ġquery : ĠJoin er Query < *, ĠR >): ĠStage . Query < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Dsl Ġ= Ġjoin er . to J PA Query ( query ) ĊĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġquery Dsl . get Serializer ( query . is Count ) ĊĠĠĠĠĠĠĠ Ġval Ġj pa Query Ġ= Ġsession . createQuery < R >( serializer . toString ()) ĊĊĠĠĠĠĠĠĠ Ġquery . limit ?. apply Ġ{ Ġj pa Query . setMax Results ( toInt ()) Ġ} ĊĠĠĠĠĠĠĠ Ġquery . offset ?. apply Ġ{ Ġj pa Query . set First Result ( toInt ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Constants ( jpa Query , Ġserializer . constant To All Labels , Ġquery Dsl . metadata . params ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġj pa Query ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġset Constants ( ĊĠĠĠĠĠĠĠ Ġquery : ĠStage . Query <* >, ĊĠĠĠĠĠĠĠ Ġconstants : ĠMap < Any ?, ĠString >, ĊĠĠĠĠĠĠĠ Ġparams : ĠMap < Param Expression < *> ?, ĠAny ?> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġconstants . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġentry . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Param :: class . java . is Instance ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġparams [ value ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParam Not Set Exception ( entry . key Ġas ĠParam < *> ?) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery . setParameter ( Integer . valueOf ( key ), Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPers ist Ġmultiple Ġentities Ġat Ġonce ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠStage . Session . persist Multiple ( entities : ĠCollection < T >): ĠCompletion Stage < List < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpersist (* entities . stream (). toArray ()). then Apply Ġ{ Ġentities . map Ġ{ Ġget Reference ( it ) Ġ} Ġ} ĊĠĠĠ Ġ} Ċ Ċ }