package Ġcom . open l attice . linking Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . open l attice . postgres . Postgres Arrays Ċ import Ġcom . open l attice . postgres . Postgres Column .* Ċ import Ġcom . open l attice . postgres . Postgres Column Definition Ċ import Ġcom . open l attice . postgres . Postgres Table . LINK ING _ LOG Ċ import Ġcom . zaxxer . hikari . Hikari DataSource Ċ import Ġjava . util .* Ċ Ċ class ĠPostgres Link ing Log Service ( ĊĠĠĠĠĠĠĠ Ġval Ġh ds : ĠH ikari DataSource , ĊĠĠĠĠĠĠĠ Ġval Ġmapper : ĠObjectMapper Ċ ) Ġ: ĠLink ing Log Service Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate OrUpdate Cluster ( linking Id : ĠUUID , Ġlinked Entities : ĠMap < UUID , ĠSet < UUID >>, Ġnew Cluster : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġnew Cluster Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Cluster ( Ġlinking Id , Ġlinked Entities Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Cluster ( Ġlinking Id , Ġlinked Entities Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Cluster ( linking Id : ĠUUID , Ġlinked Entities : ĠMap < UUID , ĠSet < UUID >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġh ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( INSERT _ LOG _ SQL ). use Ġ{ Ġps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Object ( 1 , Ġlinking Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 2 , Ġmapper . writeValue AsString ( linked Entities )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Long ( 3 , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Cluster ( linking Id : ĠUUID , Ġlinked Entities : ĠMap < UUID , ĠSet < UUID >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġh ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( ADD _ LINK _ SQL ). use Ġ{ Ġps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinked Entities . forEach Ġ{ Ġ( es id , Ġek ids ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Ray Ġ= ĠPostgres Arrays . createText Array ( conn , ĠlistOf ( es id . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Array ( 1 , Ġas Ray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 2 , Ġes id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 3 , Ġmapper . writeValue AsString ( ek ids )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Long ( 4 , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Object ( 5 , Ġlinking Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . add Batch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Entities From Cluster ( linking Id : ĠUUID , Ġlinked Entities : ĠMap < UUID , ĠSet < UUID >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġh ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( REMOVE _ ENTITY _ SQL ). use Ġ{ Ġps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinked Entities . forEach Ġ{ Ġ( es id , Ġek ids ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġek ids Array Ġ= ĠPostgres Arrays . createText Array ( conn , Ġek ids . stream (). map Ġ{ Ġit . toString () Ġ} Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 1 , Ġes id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Array ( 2 , Ġek ids Array Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Array ( 3 , ĠPostgres Arrays . createText Array ( Ġconn , ĠlistOf ( Ġes id . toString () Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 4 , Ġes id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Array ( 5 , Ġek ids Array Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . setString ( 6 , Ġes id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Long ( 7 , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Object ( 8 , Ġlinking Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . add Batch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . executeUpdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Version ( linking Id : ĠUUID , Ġversion : ĠLong ): ĠMap < UUID , ĠSet < UUID >> Ġ{ ĊĠĠĠĠĠĠĠ Ġh ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( READ _ VERSION _ LINK ED _ SQL ). use Ġ{ Ġps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Object ( 1 , Ġlinking Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Long ( 2 , Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . executeQuery (). use Ġ{ Ġrs -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rs . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmapper . readValue ( Ġrs . getString ( ĠID _ MAP _ FIELD Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Latest Link Log ( linking Id : ĠUUID ): ĠMap < UUID , ĠSet < UUID >> Ġ{ ĊĠĠĠĠĠĠĠ Ġh ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( READ _ LATE ST _ LINK ED _ SQL ). use Ġ{ Ġps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . set Object ( 1 , Ġlinking Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġps . executeQuery (). use Ġ{ Ġrs -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rs . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmapper . readValue ( Ġrs . getString ( ĠID _ MAP _ FIELD Ġ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠREAD _ VERSION _ LINK ED _ SQL Ġ= Ġ" SELECT Ġ${ ID _ MAP . name } Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" FROM Ġ${ LINK ING _ LOG . name } Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" WHERE Ġ${ LINK ING _ ID . name } Ġ= Ġ? ĠAND Ġ${ VERSION . name } Ġ<= Ġ? Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" ORDER ĠBY Ġ${ VERSION . name } ĠDESC Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" LIMIT Ġ 1 " Ċ Ċ private Ġval ĠLOG _ COLUMNS Ġ= ĠLINK ING _ LOG . columns . join ToString (",", Ġtransform Ġ= ĠPostgres Column Definition :: getName ) Ċ Ċ private Ġval ĠAPP END _ PREFIX Ġ= Ġ" INSERT ĠINTO Ġ${ LINK ING _ LOG . name } Ġ($ LOG _ COLUMNS ) Ġ" Ċ Ċ private Ġval ĠINSERT _ LOG _ SQL Ġ= Ġ"$ APPEND _ PREFIX ĠVALUES Ġ( ?, ? :: json b , ? )" Ċ Ċ private Ġval ĠAPP END _ SUFFIX Ġ= Ġ" FROM Ġ${ LINK ING _ LOG . name } Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" WHERE Ġ${ LINK ING _ ID . name } =? Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" ORDER ĠBY Ġ${ VERSION . name } ĠDESC Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" LIMIT Ġ 1 Ġ" Ċ Ċ private Ġval ĠADD _ LINK _ SQL Ġ= ĠAPP END _ PREFIX Ġ+ ĊĠĠĠĠĠĠĠ Ġ"( ĠSELECT Ġ${ LINK ING _ ID . name }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" json b _ set ( Ġ${ ID _ MAP . name }, Ġ?, ĠCO AL ES CE (${ ID _ MAP . name }-> ?, Ġ' [] ':: json b ) Ġ|| Ġ? :: json b Ġ), Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"? Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"$ APPEND _ SUFFIX Ġ) Ġ" Ċ Ċ // ĠClear ĠEntity Ċ private Ġval ĠREMOVE _ ENTITY _ SQL = ĠAPP END _ PREFIX Ġ+ ĊĠĠĠĠĠĠĠ Ġ"( ĠSELECT Ġ${ LINK ING _ ID . name }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CASE ĠWHEN Ġjsonb _ array _ length ( Ġ(${ ID _ MAP . name }-> ? )- ? Ġ) Ġ> Ġ 0 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" THEN Ġjsonb _ set ( Ġ${ ID _ MAP . name }, Ġ?, Ġ(${ ID _ MAP . name }-> ? )- ? Ġ) Ġ" Ġ+ Ġ// Ġresulting Ġarray Ġis Ġ* not * Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ELSE Ġ${ ID _ MAP . name }- ? Ġ" Ġ+ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresulting Ġarray Ġis Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" END " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġ? Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"$ APPEND _ SUFFIX Ġ) Ġ" Ċ Ċ private Ġval ĠREAD _ LATE ST _ LINK ED _ SQL Ġ= Ġ" SELECT Ġ${ ID _ MAP . name } Ġ$ APPEND _ SUFFIX " ĊĊ