package Ġorg . kom apper . core . template Ċ Ċ import Ġorg . kom apper . core . data . Statement Ċ import Ġorg . kom apper . core . data . Statement Buffer Ċ import Ġorg . kom apper . core . data . Value Ċ import Ġorg . kom apper . core . expr . Expr Evaluator Ċ import Ġorg . kom apper . core . expr . Expr Exception Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . full . member Properties Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ interface ĠStatement Builder Ġ{ ĊĠĠĠ Ġfun Ġbuild ( ĊĠĠĠĠĠĠĠ Ġtemplate : ĠCharSequence , ĊĠĠĠĠĠĠĠ Ġparams : ĠAny ĊĠĠĠ Ġ): ĠStatement Ċ } Ċ Ċ open Ġclass ĠDefault Statement Builder ( ĊĠĠĠ Ġprivate Ġval Ġformatter : Ġ( Any ?, ĠK Class <* >) Ġ-> ĠString , ĊĠĠĠ Ġprivate Ġval Ġsql Node Factory : ĠSql Node Factory , ĊĠĠĠ Ġprivate Ġval Ġexpr Evaluator : ĠExpr Evaluator Ċ ) Ġ: ĠStatement Builder Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclause Regex Ġ= ĠRegex ( ĊĠĠĠĠĠĠĠ Ġ""" ^( select | from | where | group Ġby | having | order Ġby | for Ġupdate | option )\ s """, ĠRegex Option . IGNORE _ CASE ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild ( template : ĠCharSequence , Ġparams : ĠAny ): ĠStatement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= Ġto Map ( params ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild ( template . toString (), Ġctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Map ( any : ĠAny ): ĠMap < String , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġany :: class . member Properties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . visibility Ġ== ĠK Visibility . PUBLIC Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate Ġ{ Ġit . name Ġto ĠValue ( it . call ( any ), Ġit . returnType . jvm Er asure ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ( ĊĠĠĠĠĠĠĠ Ġsql : ĠCharSequence , ĊĠĠĠĠĠĠĠ Ġctx : ĠMap < String , ĠValue > Ġ= Ġempty Map () ĊĠĠĠ Ġ): ĠStatement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġsql Node Factory . get ( sql ) ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġvisit ( State ( ctx ), Ġnode ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . to Statement () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit ( state : ĠState , Ġnode : ĠSql Node ): ĠState Ġ= Ġwhen Ġ( node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Statement Ġ-> Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Set Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġvisit ( State ( state ), Ġnode . left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left . available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġvisit ( State ( state ), Ġnode . right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right . available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left . available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Clause . Select Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Clause . From Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Clause . For Update Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Clause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild State Ġ= Ġnode . node List . fold ( State ( state ), Ġ:: visit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child State . available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ). append ( child State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( child State . startsWith Clause ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( child State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Bi Logical Op Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . keyword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Token Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠSql Node . Token . Word Ġ|| Ġnode Ġis ĠSql Node . Token . Other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( node . token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Paren Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit ( state , Ġnode . node ). append (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Bind Value Directive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġeval ( node . location , Ġnode . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġobj Ġ= Ġresult . any ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIterable < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( o Ġin Ġobj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(++ counter Ġ> Ġ 1 ) Ġstate . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( o ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPair < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( f , Ġs ) Ġ= Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( newValue ( f )). append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( newValue ( s )). append (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTrip le < *, Ġ*, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( f , Ġs , Ġt ) Ġ= Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( newValue ( f )). append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( newValue ( s )). append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( newValue ( t )). append (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstate . bind ( newValue ( o )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" null ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstate . bind ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Embedded Value Directive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( obj ) Ġ= Ġeval ( node . location , Ġnode . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġobj ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Literal Value Directive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( obj , Ġtype ) Ġ= Ġeval ( node . location , Ġnode . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġliteral Ġ= Ġformatter ( obj , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . append ( literal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . node List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . If Block Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġchoose NodeList (): ĠList < Sql Node > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( result ) Ġ= Ġeval ( node . if Directive . location , Ġnode . if Directive . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . if Directive . node List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse If Directive Ġ= Ġnode . elseif Directives . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( r ) Ġ= Ġeval ( it . location , Ġit . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( else If Directive Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelse If Directive . node List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . else Directive Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . else Directive . node List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode List Ġ= Ġchoose NodeList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List . fold ( state , Ġ:: visit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . For Block Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfor Directive Ġ= Ġnode . for Directive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfor Directive . identifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( expression ) Ġ= Ġeval ( node . for Directive . location , Ġnode . for Directive . expression , Ġstate . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġas ? ĠIterable < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠSql Exception (" The Ġexpression Ġ${ for Directive . expression } Ġis Ġnot ĠIterable Ġat Ġ${ for Directive . location }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġexpression . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreserved Ġ= Ġs . ctx [ id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Index Ġ= Ġid Ġ+ Ġ"_ index " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Has Next Ġ= Ġid Ġ+ Ġ"_ has _ next " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeach Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx [ id ] Ġ= ĠnewValue ( each ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx [ id Index ] Ġ= ĠValue ( index ++, ĠInt :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx [ id Has Next ] Ġ= ĠValue ( it . hasNext (), ĠBoolean :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġnode . for Directive . node List . fold ( s , Ġ:: visit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre served Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx [ id ] Ġ= Ġpreserved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx . remove ( id Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . ctx . remove ( id Has Next ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . If Directive , ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Else if Directive , ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . Else Directive , ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . End Directive , ĊĠĠĠĠĠĠĠ Ġis ĠSql Node . For Directive Ġ-> Ġerror (" unreachable ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠnewValue ( o : ĠAny ?) Ġ= ĠValue ( o , Ġo ?. let Ġ{ Ġit :: class Ġ} Ġ?: ĠAny :: class ) ĊĊĠĠĠ Ġprivate Ġfun Ġeval ( location : ĠSql Location , Ġexpression : ĠString , Ġctx : ĠMap < String , ĠValue >): ĠValue Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġexpr Evaluator . eval ( expression , Ġctx ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠExpr Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠSql Exception (" The Ġexpression Ġevaluation Ġwas Ġfailed Ġat Ġ$ location .", Ġe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠState ( ctx : ĠMap < String , ĠValue >) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( state : ĠState ) Ġ: Ġthis ( state . ctx ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbuf Ġ= ĠStatement Buffer ( formatter ) ĊĠĠĠĠĠĠĠ Ġval Ġctx : ĠMutable Map < String , ĠValue > Ġ= ĠHashMap ( ctx ) ĊĠĠĠĠĠĠĠ Ġvar Ġavailable : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġappend ( state : ĠState ): ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . sql . append ( state . buf . sql ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . log . append ( state . buf . log ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . values . addAll ( state . buf . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġappend ( s : ĠCharSequence ): ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( value : ĠValue ): ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . bind ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart sWith Clause (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġbuf . toString (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclause Regex . contains Match In ( s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Statement () Ġ= Ġbuf . to Statement () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġbuf . toString () ĊĠĠĠ Ġ} Ċ } Ċ