package Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . ColumnType Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . DB RuntimeException Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . Execute Result . Execute Result Builder Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . Query Type .* Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . repositories . Single File Repository Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . repositories . Yaml File Mapper Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . jo urnals . Table Journal Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . recipes .* Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . recipes . Select Invocation Recipe .* Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . dialect _ o . recipes . Select Invocation Recipe . Invocation Task . Task Type .* Ċ import Ġcom . github . hor it aku 1 1 2 4 . kotlin . sql _ minus . utils . StringUtil Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . Stack Ċ Ċ /** Ċ Ġ* Ġhow Ġto Ġretrieve Ġand Ġupdate Ġdata Ġinto Ġfile Ċ Ġ* ĠThis Ġclass Ġmust Ġknow Ġreal Ġfile Ġpath ( ?) Ċ Ġ* ĠThis Ġclass Ġmust Ġnot Ġmanipulate Ġfile Ġdata Ċ Ġ*/ Ċ class ĠDatabase Engine Core ( var Ġtable Mapper : ĠSystem Table File Mapper Builder ) Ġ{ ĊĠ Ġprivate Ġval ĠDB _ PATH Ġ= Ġ"./ db _ files " Ġ// ĠTODO ĠShould Ġbe Ġinserted Ġfrom Ġoutside Ċ // Ġ Ġprivate Ġvar Ġfile Mapper : ĠFile Mapper < Database Information > Ġ= ĠJava ObjectMapper () ĊĠ Ġprivate Ġvar Ġfile Mapper : ĠSingle File Repository < Database Information > Ġ= ĠYaml File Mapper () ĊĠ Ġprivate Ġvar Ġquery Compiler Ġ= ĠQuery Compiler () ĊĊĠ Ġfun Ġexecute ( ĊĠĠĠ Ġsyntax : ĠQuery Recipe , ĊĠĠĠ Ġsession : ĠClient Session ĊĠ Ġ): ĠExecute Result Ġ{ ĊĠĠĠ Ġval Ġresult Builder Ġ= ĠExecute Result Builder . builder () ĊĠĠĠĠĠ Ġ. setStatus ( Execute Result . Result Status . OK ) ĊĠĠĠĠĠ Ġ. set Query Type ( syntax . type ) ĊĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠCREATE _ DATABASE ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġcreate Database ( session , Ġsyntax . subject ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠCHANGE _ DATABASE ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġchange Database ( session , Ġsyntax . subject ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠSHOW _ TABLE S ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuffer () ĊĠĠĠĠĠ Ġif Ġ( db Info . tables . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġsb . append (" no Ġtables \ n ") ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . db Info !!. tables . forEach Ġ{ Ġtb Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġsb . append ( tb . name ). append ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( sb . toString ()). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠINSERT _ QUERY ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġinsert Into ( session , Ġsyntax . recipe . get () Ġas ĠInsert Into Recipe ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠCREATE _ TABLE ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrecipe Ġ= Ġsyntax . recipe . get () Ġas ĠCreate Table Recipe ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġcreate Table ( session , Ġrecipe ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠDROP _ TABLE ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdrop Table ( session , Ġsyntax . subject ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠUPDATE _ QUERY ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrecipe Ġ= Ġsyntax . recipe . get () Ġas ĠUpdate Query Recipe ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġupdate Query ( session , Ġrecipe ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠDELETE _ QUERY ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrecipe Ġ= Ġsyntax . recipe . get () Ġas ĠDelete Query Recipe ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdelete Query ( session , Ġrecipe ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( message ). build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( syntax . type Ġ== ĠSELECT _ QUERY ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrecipe Ġ= Ġsyntax . recipe . get () Ġas ĠSelect Invocation Recipe ĊĠĠĠĠĠ Ġval Ġresult Records Ġ= Ġselect Query ( session , Ġrecipe ) ĊĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObjectMapper () ĊĠĠĠĠĠ Ġ// ĠTODO Ġshould Ġbe ĠProtocol ĠBuffer ĊĠĠĠĠĠ Ġval Ġjson Ġ= Ġmapper . writeValue AsString ( result Records ) ĊĠĠĠĠĠ Ġreturn Ġresult Builder . setMessage ( json ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠExecute Result Builder . error Case () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Database ( session : ĠClient Session , Ġdatabase Name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb File Ġ= ĠFile ( DB _ PATH Ġ+ Ġ"/" Ġ+ Ġdatabase Name ) ĊĠĠĠ Ġif Ġ( db File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" db Ġalready Ġexists ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" create Database Ġ-> Ġ" Ġ+ Ġdatabase Name ) ĊĠĠĠ Ġdb File . mkdir () ĊĊĠĠĠ Ġval Ġdb Info Ġ= ĠDatabase Information () ĊĠĠĠ Ġdb Info . name Ġ= Ġdatabase Name ĊĠĠĠ Ġval Ġpath Ġ= Ġdb File . to Path (). resolve (" db . info ") ĊĊĠĠĠ Ġfile Mapper . store Object ( path . to File (), Ġdb Info ) ĊĠĠĠ Ġsession . db Path Ġ= Ġdb File . to Path () ĊĠĠĠ Ġreturn Ġ" created Ġdatabase Ġ-> Ġ${ database Name }\ n " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchange Database ( session : ĠClient Session , Ġdatabase Name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb File Ġ= ĠFile ( DB _ PATH Ġ+ Ġ"/" Ġ+ Ġdatabase Name ) ĊĠĠĠ Ġif Ġ(! db File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" db Ġdoesn 't Ġexist ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" change ĠDatabase Ġto Ġ-> Ġ$ database Name ") ĊĠĠĠ Ġsession . setCurrent Database ( database Name ) ĊĊĠĠĠ Ġval Ġpath Ġ= Ġdb File . to Path (). resolve (" db . info ") ĊĠĠĠ Ġsession . db Info Ġ= Ġfile Mapper . load Object ( path . to File ()) ĊĊĠĠĠ Ġsession . db Path Ġ= Ġdb File . to Path () ĊĠĠĠ Ġreturn Ġ" change ĠDatabase Ġto Ġ-> Ġ${ database Name }\ n " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Table ( session : ĠClient Session , Ġrecipe : ĠCreate Table Recipe ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval ĠtableName Ġ= Ġrecipe . name ĊĠĠĠ Ġval Ġtable Names Ġ= Ġdb Info . tables . map Ġ{ Ġt Ġ-> Ġt . name Ġ} ĊĠĠĠ Ġif Ġ( table Names . contains ( tableName )) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġalready Ġexists ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtable Ġ= ĠTable Journal ( tableName ) ĊĠĠĠ Ġtable . columns . addAll ( recipe . columns ) Ġ// ĠTODO Ġto Ġdeep Ġcopy ĊĠĠĠ Ġdb Info . tables . add ( table ) ĊĊĠĠĠ Ġval Ġhash Ġ= ĠString Util . hash ( tableName ) ĊĠĠĠ Ġtable . fileName Ġ= Ġhash Ġ+ Ġ"_" Ġ+ ĠtableName ĊĊĠĠĠ Ġval Ġpath Ġ= Ġsession . db Path . resolve (" db . info ") ĊĠĠĠ Ġfile Mapper . store Object ( path . to File (), Ġdb Info ) ĊĊĠĠĠ Ġtable Mapper . build ( table , Ġsession . db Path . resolve ( table . fileName ). toString ()). createTable () ĊĊĠĠĠ Ġreturn Ġ" ok \ n " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdrop Table ( session : ĠClient Session , ĠtableName : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval Ġtable Info Ġ= Ġdb Info . tables . find Ġ{ Ġt Ġ-> Ġt . name Ġ== ĠtableName } ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠDB RuntimeException (" table Ġdoesn 't Ġexist ") ĊĠĠĠ Ġdb Info . tables . remove ( table Info ) ĊĊĠĠĠ ĠFiles . delete ( session . db Path . resolve ( table Info . fileName )) ĊĊĠĠĠ Ġval Ġpath Ġ= Ġsession . db Path . resolve (" db . info ") ĊĠĠĠ Ġfile Mapper . store Object ( path . to File (), Ġdb Info ) ĊĊĠĠĠ Ġreturn Ġ" ok \ n " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinsert Into ( session : ĠClient Session , Ġrecipe : ĠInsert Into Recipe ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval Ġcolumns Ġ= Ġrecipe . columns ĊĠĠĠ Ġval Ġrecords Ġ= Ġrecipe . records ĊĊĠĠĠ Ġval Ġresult Ġ= Ġdb Info . tables . filter Ġ{ Ġtb Ġ-> ĊĠĠĠĠĠ Ġtb . name Ġ== Ġrecipe . name ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġdoesn 't Ġexist Ġ-> Ġ${ recipe . name }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtable Ġ= Ġresult [ 0 ] ĊĠĠĠ Ġval Ġtable File Ġ= Ġsession . db Path . resolve ( table . fileName ). to File () ĊĠĠĠ Ġif Ġ(! table File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġjournal Ġis Ġgone ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( table File . absolute Path ) ĊĊĠĠĠ Ġtable Mapper . build ( table , Ġtable File . absolute Path ). use Ġ{ Ġtable Mapper Ġ-> ĊĠĠĠĠĠ Ġrecords . forEach Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠ Ġtable Mapper . insert ( columns , Ġrecord ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġ" OK \ n " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġselect Query ( session : ĠClient Session , Ġrecipe : ĠSelect Invocation Recipe ): ĠList < Map < String , ĠString >> Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval Ġresult Map List Ġ= Ġarray ListOf < Map < String , ĠString >>() ĊĊĠĠĠ Ġvar Ġlast Records Ġ= ĠStack < HashMap < String , ĠPair < List < Column >, ĠList < Record >>>> () ĊĠĠĠ Ġfor Ġ( task Ġin Ġrecipe . tasks ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( task . type Ġ== ĠTable Read ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayer Records Ġ= Ġhash Map Of < String , ĠPair < List < Column >, ĠList < Record >> >() ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Read Ġ= Ġtask Ġas ĠTable Read Task ĊĠĠĠĠĠĠĠ Ġval ĠtableName Ġ= Ġtable Read . tableName ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġdb Info . tables . filter Ġ{ Ġtb Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġtb . name Ġ== ĠtableName ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġdoesn 't Ġexist Ġ-> Ġ$ tableName ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. first () ĊĊĠĠĠĠĠĠĠ Ġval Ġtable File Ġ= Ġsession . db Path . resolve ( table . fileName ). to File () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! table File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġjournal Ġis Ġgone ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtable Mapper . build ( table , Ġtable File . absolute Path ). use Ġ{ Ġtable Mapper Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġtable Mapper . columns () ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġtable Mapper . select ( listOf ()) ĊĊĠĠĠĠĠĠĠĠĠ Ġlayer Records . put ( table Read . alias , ĠPair ( columns , Ġrecords )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Records . push ( layer Records ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( task . type Ġ== ĠFiltering ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Filter Ġ= Ġtask Ġas ĠFiltering Task ĊĠĠĠĠĠĠĠ Ġif Ġ( last Records . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" last Ġresult Ġwas Ġnone ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( table Filter . wh eres . expression . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġverify Records Ġ= Ġlast Records . pop () ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġkey Ġ= Ġverify Records . keys . stream (). findFirst (). get () ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġcolumns Ġ= Ġverify Records [ key ] !!. first ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġrecords Ġ= Ġverify Records [ key ] !!. second ĊĊĠĠĠĠĠĠĠĠĠ Ġvar Ġsatisfied Records Ġ= Ġarray ListOf < Record >() ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġcompiled Ġ= Ġquery Compiler . compile Where ( columns , Ġtable Filter . wh eres ) ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( record Ġin Ġrecords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compiled . is Satisf ied ( record )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsatisfied Records . add ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġverify Records . put ( key , Pair ( columns , Ġsatisfied Records )) ĊĠĠĠĠĠĠĠĠĠ Ġlast Records . push ( verify Records ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( task . type Ġ== ĠSelection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselect Task Ġ= Ġtask Ġas ĠSelection Task ĊĠĠĠĠĠĠĠ Ġvar Ġselect Parts Ġ= Ġselect Task . columns ĊĊĠĠĠĠĠĠĠ Ġvar Ġverify Records Ġ= Ġlast Records . pop () ĊĠĠĠĠĠĠĠ Ġvar Ġkey Ġ= Ġverify Records . keys . stream (). findFirst (). get () ĊĠĠĠĠĠĠĠ Ġvar Ġcolumns Ġ= Ġverify Records [ key ] !!. first ĊĠĠĠĠĠĠĠ Ġvar Ġrecords Ġ= Ġverify Records [ key ] !!. second ĊĊĠĠĠĠĠĠĠ Ġval Ġshows Ġ= Ġarray ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġif Ġ( select Parts . size Ġ== Ġ 1 Ġ&& Ġselect Parts [ 0 ] Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcolumns . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshows . add ( i ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcolumns . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcolumns [ i ]. name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( select Parts . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshows . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( record Ġin Ġrecords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Map Ġ= Ġhash Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġshows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcol Ġ= Ġcolumns [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrecord . cells [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Map . put ( col . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cell . isNull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cell . type Ġ== ĠColumn Type . VARCHAR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . text Value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cell . type Ġ== ĠColumn Type . NUMBER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . number Value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . intValue !!. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġresult Map List . add ( record Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Map List ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Query ( session : ĠClient Session , Ġrecipe : ĠUpdate Query Recipe ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval ĠtableName Ġ= Ġrecipe . target Table ĊĠĠĠ Ġval Ġupdates Ġ= Ġrecipe . updates ĊĊĠĠĠ Ġval Ġresult Ġ= Ġdb Info . tables . filter Ġ{ Ġtb Ġ-> ĊĠĠĠĠĠ Ġtb . name Ġ== ĠtableName ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġdoesn 't Ġexist Ġ-> Ġ${ tableName }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtable Ġ= Ġresult [ 0 ] ĊĊĠĠĠ Ġval Ġtable File Ġ= Ġsession . db Path . resolve ( table . fileName ). to File () ĊĠĠĠ Ġif Ġ(! table File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġjournal Ġis Ġgone ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( table File . absolute Path ) ĊĊĠĠĠ Ġval Ġcolumn ToUpdate Ġ= Ġhash Map Of < String , ĠUpdates Recipe >() ĊĠĠĠ Ġfor Ġ( upd Ġin Ġupdates ) Ġ{ ĊĠĠĠĠĠ Ġcolumn ToUpdate [ upd . expression [ 0 ]] Ġ= Ġup d ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġmake Ġit Ġloose Ġcouple ĊĠĠĠ Ġtable Mapper . build ( table , Ġtable File . absolute Path ). use Ġ{ Ġtable Mapper Ġ-> ĊĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġtable Mapper . columns () ĊĊĠĠĠĠĠ Ġval Ġresult 2 Ġ= Ġtable Mapper . select ( listOf ()) ĊĠĠĠĠĠ Ġval Ġresult 3 Ġ= Ġarray ListOf < Record >() ĊĠĠĠĠĠ Ġval Ġcompiled Ġ= Ġquery Compiler . compile Where ( columns , Ġrecipe . where Tree [ 0 ]) ĊĠĠĠĠĠ Ġfor Ġ( record Ġin Ġresult 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( compiled . is Satisf ied ( record )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult 3 . add ( record ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġvar Ġupdate Count Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( record Ġin Ġresult 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġupdated Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcolumns . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcol Ġ= Ġcolumns [ i ] ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( column ToUpdate . containsKey ( col . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Recipe Ġ= Ġcolumn ToUpdate [ col . name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġupdate Recipe . expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression [ 1 ] Ġ== Ġ"=" ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġexpression [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrecord . cells [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cell . type Ġ== ĠColumn Type . INT Ġ|| Ġcell . type Ġ== ĠColumn Type . SMALLINT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . intValue Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . text Value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtable Mapper . update ( record ) ĊĠĠĠĠĠĠĠ Ġif Ġ( updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġ"${ update Count } Ġrecords Ġupdated \ n " ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdelete Query ( session : ĠClient Session , Ġrecipe : ĠDelete Query Recipe ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdb Info Ġ= Ġchoose Database ( session ) ĊĠĠĠ Ġval ĠtableName Ġ= Ġrecipe . target Table ĊĊĠĠĠ Ġval Ġresult Ġ= Ġdb Info . tables . filter Ġ{ Ġtb Ġ-> ĊĠĠĠĠĠ Ġtb . name Ġ== ĠtableName ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġdoesn 't Ġexist Ġ-> Ġ${ tableName }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtable Ġ= Ġresult [ 0 ] ĊĊĠĠĠ Ġval Ġtable File Ġ= Ġsession . db Path . resolve ( table . fileName ). to File () ĊĠĠĠ Ġif Ġ(! table File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" table Ġjournal Ġis Ġgone ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln ( table File . absolute Path ) ĊĊĠĠĠ Ġ// ĠTODO Ġmake Ġit Ġloose Ġcouple ĊĠĠĠ Ġtable Mapper . build ( table , Ġtable File . absolute Path ). use Ġ{ Ġtable Mapper Ġ-> ĊĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġtable Mapper . columns () ĊĊĠĠĠĠĠ Ġval Ġresult 2 Ġ= Ġtable Mapper . select ( listOf ()) ĊĠĠĠĠĠ Ġvar Ġresult 3 Ġ= Ġarray ListOf < Record >() ĊĠĠĠĠĠ Ġvar Ġcompiled Ġ= Ġquery Compiler . compile Where ( columns , Ġrecipe . where Tree [ 0 ]) ĊĠĠĠĠĠ Ġfor Ġ( record Ġin Ġresult 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( compiled . is Satisf ied ( record )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult 3 . add ( record ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġvar Ġupdate Count Ġ= Ġ 0 ĊĠĠĠĠĠ Ġfor Ġ( record Ġin Ġresult 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġupdated Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtable Mapper . delete ( record ) ĊĠĠĠĠĠĠĠ Ġif Ġ( updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġ"${ update Count } Ġrecords Ġupdated \ n " ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchoose Database ( session : ĠClient Session ): ĠDatabase Information Ġ{ ĊĠĠĠ Ġif Ġ( session . db Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDB RuntimeException (" DB Ġis Ġnot Ġselected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsession . db Info !! ĊĠ Ġ} Ċ }