package Ġorg . dn lts k . yet another cr ut str ans former . write Ċ Ċ import Ġcom . google . inject . Singleton Ċ import Ġorg . dn lts k . yet another cr ut str ans former . model . Grid Point Ċ import Ġorg . dn lts k . yet another cr ut str ans former . model . Grid Ref Ċ import Ġorg . dn lts k . yet another cr ut str ans former . util . batch Ċ import Ġorg . dn lts k . yet another cr ut str ans former . write . Db Service . Companion . GRID _ TABLE _ NAME Ċ import Ġorg . dn lts k . yet another cr ut str ans former . write . Db Service . Companion . METADATA _ TABLE _ NAME Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . ResultSet Ċ import Ġjava . sql . Statement Ċ import Ġjava . time . Instant Ċ Ċ @ Singleton Ċ class ĠGrid Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠĠĠ Ġfun Ġcreate Grid Table IfNot Exists ( conn : ĠConnection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsql . append (" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ${ GRID _ TABLE _ NAME } Ġ( Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġmetadata _ id ĠINTEGER , Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġx ref ĠINTEGER , Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġy ref ĠINTEGER , Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġdate ĠDAT ETIME , Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġvalue ĠINTEGER , Ġ Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ ĠPRIMARY ĠKEY Ġ( metadata _ id , Ġx ref , Ġy ref , Ġdate ), Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ ĠFOREIGN ĠKEY ( metadata _ id ) ĠREFERENCES Ġ$ METADATA _ TABLE _ NAME ( id ) Ġ") ĊĠĠĠĠĠĠĠ Ġsql . append (" Ġ) Ġ") ĊĠĠĠĠĠĠĠ ĠLOG . info ( sql . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= Ġconn . createStatement () ĊĠĠĠĠĠĠĠ Ġstmt . executeUpdate ( sql . toString ()) ĊĠĠĠĠĠĠĠ Ġstmt . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinsert Grid Points ( conn : ĠConnection , Ġgrid Points : ĠList < Grid Point >, Ġmetadata Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġbatch Size Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġnum B atches Ġ= Ġgrid Points . size Ġ/ Ġbatch Size Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġten Percent Steps Ġ= Ġcalc Ten Percent Steps ( num B atches ) ĊĠĠĠĠĠĠĠ Ġgrid Points . as Sequence (). batch ( batch Size ). forEach Indexed Ġ{ Ġbatch Index , Ġbatch Grid Points Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsql Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Grid Points . forEach Indexed Ġ{ Ġindex , Ġgrid Point Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" INSERT ĠINTO Ġ$ GRID _ TABLE _ NAME Ġ( Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġmetadata _ id , Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġx ref , Ġy ref , Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġdate , Ġvalue Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" Ġ) ĠVALUES Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append ( compose Grid Point Values ( metadata Id , Ġgrid Point )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" Ġ, Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append ( compose Grid Point Values ( metadata Id , Ġgrid Point )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// LOG . info ( sql . toString () Ġ+ Ġ" Ġ... Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= Ġconn . createStatement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . executeUpdate ( sql . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Progress ( batch Index , Ġbatch Size , Ġbatch Grid Points . size , Ġgrid Points . size , Ġten Percent Steps ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconn . commit () ĊĠĠĠĠĠĠĠ Ġval Ġduration In Millis Ġ= ĠSystem . currentTimeMillis () Ġ- Ġstart ĊĠĠĠĠĠĠĠ ĠLOG . info (" insert Ġduration Ġ= Ġ"+ ( duration In Millis / 1 0 0 0 . 0 )+" s ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompose Grid Point Values ( metadata Id : ĠInt , Ġgrid Point : ĠGrid Point ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselect Ġ= ĠStringBuilder (" Ġ( Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" ĠĠĠ Ġ${ metadata Id }, Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" ĠĠĠ Ġ${ grid Point . grid Ref . col }, Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" ĠĠĠ Ġ${ grid Point . grid Ref . row }, Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" ĠĠĠ Ġ'${ grid Point . date }', Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" ĠĠĠ Ġ${ grid Point . value } Ġ") ĊĠĠĠĠĠĠĠ Ġselect . append (" Ġ) Ġ") ĊĠĠĠĠĠĠĠ Ġreturn Ġselect ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect Grid Point ( conn : ĠConnection , Ġdate : ĠInstant , Ġgrid Ref : ĠGrid Ref , Ġmetadata Id : ĠInt ): ĠGrid Point ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprep Stmt : ĠStatement ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġrs : ĠResultSet ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" SELECT Ġ* ĠFROM Ġ$ GRID _ TABLE _ NAME Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠWHERE Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ Ġmetadata _ id Ġ= Ġ? Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ ĠAND Ġx ref Ġ= Ġ? Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ ĠAND Ġy ref Ġ= Ġ? Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠĠĠ ĠAND Ġdate Ġ= Ġ? ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ( sql . toString () Ġ+ Ġ" Ġ... Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt Ġ= Ġconn . prepareStatement ( sql . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt . setInt ( 1 , Ġmetadata Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt . setInt ( 2 , Ġgrid Ref . col ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt . setInt ( 3 , Ġgrid Ref . row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt . setString ( 4 , Ġdate . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs Ġ= Ġprep Stmt . executeQuery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rs . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGrid Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Ref Ġ= ĠGrid Ref ( col Ġ= Ġrs . getInt (" xref "), Ġrow Ġ= Ġrs . getInt (" y ref ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= ĠInstant . parse ( rs . getString (" date ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġrs . getInt (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprep Stmt ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Ten Percent Steps ( num Grid Points : ĠInt ): ĠInt Progress ion Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġten Percent Step Division Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( num Grid Points Ġ< Ġten Percent Step Division ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġten Percent Step Division Ġ= Ġnum Grid Points ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġnum Grid Points Ġ/ Ġten Percent Step Division ĊĠĠĠĠĠĠĠ Ġreturn ĠInt Progress ion . from Closed Range ( 1 , Ġnum Grid Points , Ġstep ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Progress ( batch Index : ĠInt , Ġbatch Size : ĠInt , Ġcurrent Batch Size : ĠInt , Ġnum All Grid Points : ĠInt , Ġsteps : ĠInt Progress ion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Inserted Grid Points Ġ= Ġbatch Index Ġ* Ġbatch Size Ġ+ Ġcurrent Batch Size ĊĠĠĠĠĠĠĠ Ġif Ġ(( batch Index Ġ!= Ġ 0 Ġ&& Ġsteps . contains ( batch Index )) Ġ|| Ġnum Inserted Grid Points Ġ== Ġnum All Grid Points ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġper c Ġ= ĠMath . round (( num Inserted Grid Points . toDouble () Ġ/ Ġnum All Grid Points . toDouble ()) * 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ("${ num Inserted Grid Points } Ġgrid Ġwritten Ġ($ perc %) ...") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }