package Ġfc . adapt or . sql Ċ Ċ import Ġfc . api .* Ċ import Ġfc . api . F Type .* Ċ import Ġfc . api . query . Q Select Ċ import Ġorg . jooq .* Ċ import Ġorg . jooq . impl . DSL Ċ import Ġorg . jooq . impl . SQL DataType Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Local Time Ċ Ċ const Ġval ĠMAIN Ġ= Ġ" main " Ċ const Ġval ĠREF Ġ= Ġ"@ ref " Ċ const Ġval ĠIN V Ġ= Ġ"@ inv " Ċ Ċ fun ĠS Entity . sql TableName () Ġ= Ġname . replace ('.', Ġ'_ ') Ċ Ċ fun ĠS Relation . sql Aux TableName () Ġ= Ġ"${ entity . sql TableName ()} _${ name }" Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠMap < S Property , ĠAny ?> . db Fields (): ĠMap < Field < Any >, ĠAny ?> Ġ{ ĊĠ Ġval Ġfiltered Ġ= Ġfilter Ġ{ Ġ( prop , Ġ_) Ġ-> Ġprop Ġis ĠS Field < *> Ġ|| Ġprop Ġis ĠS Reference Ġ&& Ġprop . name Ġ== ĠSP ARENT Ġ} ĊĠ Ġreturn Ġfiltered . map Ġ{ Ġ( prop , Ġvalue ) Ġ-> ĊĠĠĠ Ġwhen Ġ( prop ) Ġ{ ĊĠĠĠĠĠ Ġis ĠS Field < *> Ġ-> Ġprop . fn () Ġto ĠSQL Field Converter . save ( prop , Ġvalue ) ĊĠĠĠĠĠ Ġis ĠS Relation Ġ-> Ġparent Fn () Ġas ĠField < Any > Ġto Ġ( value Ġas ĠRef ID ). id ĊĠĠĠ Ġ} ĊĠ Ġ}. toMap () Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠMap < S Property , ĠAny ?> . map Refs (): ĠMap < S Relation , ĠList < Ref ID >> Ġ{ ĊĠ Ġval Ġfiltered Ġ= Ġfilter Ġ{ Ġ( prop , Ġ_) Ġ-> Ġprop Ġis ĠS Relation Ġ&& Ġprop . type Ġ== ĠR Type . LINK ED Ġ&& Ġprop . name Ġ!= ĠSP ARENT Ġ} Ġas ĠMap < S Relation , ĠAny ?> ĊĠ Ġreturn Ġfiltered . map Ġ{ Ġ( prop , Ġvalue ) Ġ-> ĊĠĠĠ Ġval Ġrefs Ġ= Ġwhen Ġ( prop ) Ġ{ ĊĠĠĠĠĠ Ġis ĠS Reference Ġ-> ĠlistOf ( value Ġas ĠRef ID ) ĊĠĠĠĠĠ Ġis ĠS Collection Ġ-> Ġvalue Ġas ĠList < Ref ID > ĊĠĠĠ Ġ} ĊĠĠĠ Ġprop Ġto Ġrefs ĊĠ Ġ}. toMap () Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠMap < S Property , ĠAny ?> . map Links (): ĠMap < S Relation , ĠList < Ref Link >> Ġ{ ĊĠ Ġval Ġfiltered Ġ= Ġfilter Ġ{ Ġ( prop , Ġ_) Ġ-> Ġprop Ġis ĠS Relation Ġ&& Ġprop . type Ġ== ĠR Type . LINK ED Ġ&& Ġprop . name Ġ!= ĠSP ARENT Ġ} Ġas ĠMap < S Relation , ĠAny ?> ĊĠ Ġreturn Ġfiltered . map Ġ{ Ġ( prop , Ġvalue ) Ġ-> ĊĠĠĠ Ġval Ġrefs Ġ= Ġwhen Ġ( prop ) Ġ{ ĊĠĠĠĠĠ Ġis ĠS Reference Ġ-> ĠlistOf ( value Ġas ĠRef Link ) ĊĠĠĠĠĠ Ġis ĠS Collection Ġ-> Ġvalue Ġas ĠList < Ref Link > ĊĠĠĠ Ġ} ĊĠĠĠ Ġprop Ġto Ġrefs ĊĠ Ġ}. toMap () Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġid Fn ( prefix : ĠString ? Ġ= Ġnull ): ĠField < Long > Ġ= Ġif Ġ( prefix Ġ!= Ġnull ) Ġ{ ĊĠ ĠDSL . field ( DSL . name ( prefix , ĠSID ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ġelse Ġ{ ĊĠ ĠDSL . field ( DSL . name ( SID ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġref Fn ( prefix : ĠString ? Ġ= Ġnull ): ĠField < Long > Ġ= Ġif Ġ( prefix Ġ!= Ġnull ) Ġ{ ĊĠ ĠDSL . field ( DSL . name ( prefix , ĠREF ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ġelse Ġ{ ĊĠ ĠDSL . field ( DSL . name ( REF ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġinv Fn ( prefix : ĠString ? Ġ= Ġnull ): ĠField < Long > Ġ= Ġif Ġ( prefix Ġ!= Ġnull ) Ġ{ ĊĠ ĠDSL . field ( DSL . name ( prefix , ĠIN V ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ġelse Ġ{ ĊĠ ĠDSL . field ( DSL . name ( INV ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġparent Fn ( prefix : ĠString ? Ġ= Ġnull ): ĠField < Long > Ġ= Ġif Ġ( prefix Ġ!= Ġnull ) Ġ{ ĊĠ ĠDSL . field ( DSL . name ( prefix , ĠSP ARENT ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ġelse Ġ{ ĊĠ ĠDSL . field ( DSL . name ( SP ARENT ), Ġjava . lang . Long :: class . java ) Ġas ĠField < Long > Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠS Field <* >. fn ( prefix : ĠString ? Ġ= Ġnull ): ĠField < Any > Ġ= Ġif Ġ( prefix Ġ!= Ġnull ) Ġ{ ĊĠ ĠDSL . field ( DSL . name ( prefix , Ġname ), Ġj Type ()) Ġas ĠField < Any > Ċ } Ġelse Ġ{ ĊĠ ĠDSL . field ( DSL . name ( name ), Ġj Type ()) Ġas ĠField < Any > Ċ } Ċ Ċ fun ĠDSL Context . link ( aux Table : ĠTable < Record >, Ġinv : ĠRef ID , Ġrefs : ĠList < Ref ID >, Ġsql Listener : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠ Ġvar Ġdb Insert Ġ= Ġinsert Into ( aux Table , ĠlistOf ( inv Fn (), Ġref Fn ())) ĊĠ Ġval Ġvalues Ġ= Ġrefs . map Ġ{ Ġinv . id Ġto Ġit . id Ġ} ĊĠ Ġvalues . forEach Ġ{ ĊĠĠĠ Ġdb Insert Ġ= Ġdb Insert . values ( it . first , Ġit . second ) ĊĠ Ġ} ĊĊĠ Ġprintln (" Ġ Ġ${ db Insert . sql }; Ġ$ values ") ĊĠ Ġval Ġaffected Rows Ġ= Ġdb Insert . execute () ĊĠ Ġif Ġ( affected Rows Ġ!= Ġrefs . size ) ĊĠĠĠ Ġthrow ĠException (" Create Ġaux - table Ġinstruction Ġfailed , Ġunexpected Ġnumber Ġof Ġrows Ġaffected !") ĊĊĠ Ġsql Listener ?. invoke ("${ db Insert . sql }; Ġ$ values ") Ċ } Ċ Ċ fun ĠDSL Context . unlink ( aux Table : ĠTable < Record >, Ġinv : ĠRef ID , Ġrefs : ĠList < Ref ID >, Ġsql Listener : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠ Ġval Ġvalues Ġ= Ġrefs . map Ġ{ Ġit . id Ġ} ĊĠ Ġval Ġdb Delete Ġ= Ġdelete ( aux Table ). where ( inv Fn (). eq ( inv . id ). and ( ref Fn (). ` in `( values ))) ĊĊĠ Ġprintln (" Ġ Ġ${ db Delete . sql }; Ġ- Ġ[ ${ inv . id }, Ġ${ values }] ") ĊĠ Ġval Ġaffected Rows Ġ= Ġdb Delete . execute () ĊĠ Ġif Ġ( affected Rows Ġ!= Ġrefs . size ) ĊĠĠĠ Ġthrow ĠException (" Delete Ġinstruction Ġfailed , Ġunexpected Ġnumber Ġof Ġrows Ġaffected !") ĊĊĠ Ġsql Listener ?. invoke ("${ db Delete . sql }; Ġ- Ġ[ ${ inv . id }, Ġ${ values }] ") Ċ } Ċ // Ġ------------------------------------------------ --- Ġquery Ġ------------------------------------------------ --- Ċ fun Ġdb Fields ( selection : ĠQ Select , Ġprefix : ĠString Ġ= ĠMAIN ) Ġ= ĊĠ Ġselection . fields . keys . filter Ġ{ Ġit . name Ġ!= ĠSID Ġ}. map Ġ{ Ġit . fn ( prefix ) Ġ} Ċ Ċ fun ĠSelect Query < Record >. aux Join ( rel : ĠS Relation ) Ġ{ ĊĠ Ġval Ġjoin Prefix Ġ= Ġ"${ MAIN }_${ rel . name }" ĊĠ Ġval Ġaux Join With Ġ= ĠDSL . table ( rel . sql Aux TableName ()). as Table ( join Prefix ) ĊĠ Ġval Ġaux Join Where Ġ= Ġref Fn ( join Prefix ). eq ( id Fn ( MAIN )) ĊĠ Ġadd Join ( aux Join With , ĠJoin Type . LEFT _ OUT ER _ JOIN , Ġaux Join Where ) Ċ } Ċ Ċ fun ĠSelect Query < Record >. parent Join ( rel : ĠS Reference , Ġprefix : ĠString ) Ġ{ ĊĠ Ġval Ġjoin Prefix Ġ= Ġ"${ MAIN }_${ rel . name }" ĊĠ Ġval Ġjoin With Ġ= ĠDSL . table ( rel . ref . sql TableName ()). as Table ( join Prefix ) ĊĠ Ġval Ġjoin Where Ġ= Ġparent Fn ( prefix ). eq ( id Fn ( join Prefix )) ĊĠ Ġadd Join ( join With , ĠJoin Type . LEFT _ OUT ER _ JOIN , Ġjoin Where ) Ċ } Ċ Ċ fun ĠSelect Query < Record >. owned Join ( rel : ĠS Reference , Ġprefix : ĠString ) Ġ{ ĊĠ Ġval Ġjoin Prefix Ġ= Ġ"${ MAIN }_${ rel . name }" ĊĠ Ġval Ġjoin With Ġ= ĠDSL . table ( rel . ref . sql TableName ()). as Table ( join Prefix ) ĊĠ Ġval Ġjoin Where Ġ= Ġid Fn ( prefix ). eq ( parent Fn ( join Prefix )) ĊĠ Ġadd Join ( join With , ĠJoin Type . LEFT _ OUT ER _ JOIN , Ġjoin Where ) Ċ } Ċ Ċ fun ĠSelect Query < Record >. linked Join ( rel : ĠS Reference , Ġprefix : ĠString ) Ġ{ ĊĠ Ġval Ġaux Prefix Ġ= Ġ"${ prefix }_ aux _${ rel . name }" ĊĠ Ġval Ġaux Join With Ġ= ĠDSL . table ( rel . sql Aux TableName ()). as Table ( aux Prefix ) ĊĠ Ġval Ġaux Join Where Ġ= Ġid Fn ( prefix ). eq ( inv Fn ( aux Prefix )) ĊĠ Ġadd Join ( aux Join With , ĠJoin Type . LEFT _ OUT ER _ JOIN , Ġaux Join Where ) ĊĊĠ Ġval Ġjoin Prefix Ġ= Ġ"${ MAIN }_${ rel . name }" ĊĠ Ġval Ġjoin With Ġ= ĠDSL . table ( rel . ref . sql TableName ()). as Table ( join Prefix ) ĊĠ Ġval Ġjoin Where Ġ= Ġref Fn ( aux Prefix ). eq ( id Fn ( join Prefix )) ĊĠ Ġadd Join ( join With , ĠJoin Type . LEFT _ OUT ER _ JOIN , Ġjoin Where ) Ċ } Ċ Ċ private Ġfun ĠS Field <* >. j Type (): ĠClass < out ĠAny > Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠ ĠTEXT Ġ-> Ġjava . lang . String :: class . java ĊĠ ĠINT Ġ-> Ġjava . lang . Integer :: class . java ĊĠ ĠLONG Ġ-> Ġjava . lang . Long :: class . java ĊĠ ĠFLOAT Ġ-> Ġjava . lang . Float :: class . java ĊĠ ĠDOUBLE Ġ-> Ġjava . lang . Double :: class . java ĊĠ ĠBOOL Ġ-> Ġjava . lang . Boolean :: class . java ĊĊĠ ĠTIME Ġ-> ĠLocal Time :: class . java ĊĠ ĠDATE Ġ-> ĠLocalDate :: class . java ĊĠ ĠDAT ETIME Ġ-> ĠLocalDateTime :: class . java ĊĠ ĠMAP Ġ-> Ġjava . lang . String :: class . java ĊĠ ĠLIST Ġ-> Ġjava . lang . String :: class . java Ċ } Ċ Ċ fun ĠF Type . to Sql Type (): ĠDataType < out ĠAny > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠ ĠTEXT Ġ-> ĠSQL DataType . VARCHAR ĊĠ ĠINT Ġ-> ĠSQL DataType . INTEGER ĊĠ ĠLONG Ġ-> ĠSQL DataType . BIG INT ĊĠ ĠFLOAT Ġ-> ĠSQL DataType . FLOAT ĊĠ ĠDOUBLE Ġ-> ĠSQL DataType . DOUBLE ĊĠ ĠBOOL Ġ-> ĠSQL DataType . BOOLEAN ĊĠ ĠTIME Ġ-> ĠSQL DataType . LOCAL TIME ĊĠ ĠDATE Ġ-> ĠSQL DataType . LOCAL DATE ĊĠ ĠDAT ETIME Ġ-> ĠSQL DataType . LOCAL DATETIME ĊĠ ĠMAP Ġ-> ĠSQL DataType . VARCHAR ĊĠ ĠLIST Ġ-> ĠSQL DataType . VARCHAR Ċ }