package Ġcom . jo e . quiz zy . persistence . impl Ċ Ċ import Ġcom . co da h ale . metrics . annotation . Timed Ċ import Ġcom . jo e . quiz zy . api . models . Response Ċ import Ġcom . jo e . quiz zy . persistence . api . Response DAO Ċ import Ġcom . jo e . quiz zy . persistence . impl . jooq . Tables Ċ import Ġcom . jo e . quiz zy . persistence . impl . jooq . tables . records . Responses Record Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . jooq . DSL Context Ċ import Ġjava . util . UUID Ċ import Ġjava . util . stream . Stream Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ /** Ċ Ġ* ĠDAO Ġimplementation Ġfor ĠThings Ċ Ġ*/ Ċ open Ġclass ĠResponse DAO J oo q Ċ @ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġctx : ĠDSL Context Ċ ) Ġ: ĠResponse DAO Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġget Record ( dsl : ĠDSL Context , Ġid : ĠUUID ): ĠResponse s Record ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġd sl . select From ( Tables . RESPONSE S ). where ( Tables . RESPONSE S . ID . eq ( id )). fetch One () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġget ( id : ĠUUID ): ĠResponse ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Record ( ctx , Ġid )?. into ( Response :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġsave ( thing : ĠResponse ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . transaction Result Ġ{ Ġconfig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthing Id Ġ= Ġthing . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġif Ġ( thing Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . dsl (). new Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . RESPONSE S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġget Record ( config . dsl (), Ġthing Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting . from ( thing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . dsl (). new Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . RESPONSE S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . store () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . into ( Response :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġby User Question ( userId : ĠUUID , Ġquestion Id : ĠUUID ): ĠResponse ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġctx . select ( Tables . RESPONSE S . aster isk ()). from ( Tables . RESPONSE S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where ( Tables . RESPONSE S . USER _ ID . eq ( userId ). and ( Tables . RESPONSE S . QUEST ION _ ID . eq ( question Id ))) ĊĠĠĠĠĠĠĠ Ġlog . info (" user Ġquestion Ġresponses Ġquery Ġ: Ġ$ query ") ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . fetch One Into ( Response :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġby User Questions ( userId : ĠUUID , Ġquestion Ids : ĠList < UUID >): ĠMap < UUID , ĠResponse > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġctx . select ( Tables . RESPONSE S . aster isk ()). from ( Tables . RESPONSE S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where ( Tables . RESPONSE S . USER _ ID . eq ( userId ). and ( Tables . RESPONSE S . QUEST ION _ ID .` in `( question Ids ))) ĊĠĠĠĠĠĠĠ Ġlog . info (" batch Ġuser Ġquestion Ġresponses Ġquery Ġ: Ġ$ query ") ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . fetch (). into Map ( Tables . RESPONSE S . QUEST ION _ ID , ĠResponse :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġfor Instance ( instanceId : ĠUUID , Ġre grade : ĠBoolean ): ĠList < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Query Ġ= Ġctx . select ( Tables . RESPONSE S . aster isk ()). from ( Tables . RESPONSE S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( Tables . USERS ). on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . RESPONSE S . USER _ ID . eq ( Tables . USERS . ID ). and ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . USERS . INSTANCE _ ID . eq ( instanceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ( Tables . QUEST IONS ). on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . QUEST IONS . ID . eq ( Tables . RESPONSE S . QUEST ION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġif Ġ( re grade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Query ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Query . leftJoin ( Tables . GR A DES ). on ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTables . GR A DES . RESPONSE _ ID . eq ( Tables . RESPONSE S . ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). where ( Tables . GR A DES . CORRECT . isNull ) ĊĠĠĠĠĠĠĠ Ġ}. orderBy ( Tables . QUEST IONS . CLOSED _ AT . desc (), ĠTables . USERS . NAME ) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" graded Ġquery Ġ: Ġ$ query ") ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . fetch Into ( Response :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġfor User ( userId : ĠUUID ): ĠList < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . select ( Tables . RESPONSE S . aster isk ()). from ( Tables . RESPONSE S ). where ( Tables . RESPONSE S . USER _ ID . eq ( userId )) ĊĠĠĠĠĠĠĠ Ġlog . info (" user Ġresponses Ġquery Ġ: Ġ$ query ") ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . fetch Into ( Response :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġall (): ĠList < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . select (). from ( Tables . RESPONSE S ). fetch Into ( Response :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Timed ĊĠĠĠ Ġoverride Ġfun Ġstream (): ĠStream < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . select (). from ( Tables . RESPONSE S ). fetch Stream Into ( Response :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ