package Ġio . ze ko . db . sql Ċ Ċ data Ġclass ĠQuery Info ( val Ġsql : ĠString , Ġval Ġcolumns : ĠList < String >, Ġval Ġsql Fields : ĠString , Ġval Ġparts : ĠQuery Parts ) Ċ Ċ class ĠQuery Parts Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrg x Find Field Ġ= Ġ" ([^ \\\" \\ Ġ][ a - zA - Z 0 - 9 \\ _ ]+ [^ \\\" \\ Ġ]) \\. ([^ \\\" \\ s ][ a - zA - Z 0 - 9 \\ _ \\ - \\ = \\ ` \\ ~ \\ :\\ .\\ , \\ | \\ * \\ ^ \\ # \\ @ \\\ $ ]+ [ \\ ^ \" \\ s ]) ". to Regex () ĊĠĠĠ Ġprivate Ġval Ġrg x Replace Ġ= Ġ"\\ \"\ $ 1 \\\" .\ $ 2 " ĊĠĠĠ Ġvar Ġline break : ĠString Ġ= Ġ" Ġ" ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġquery : Query ĊĠĠĠ Ġvar Ġfields : ĠLinkedHashMap < String , ĠArray < String >> ĊĠĠĠ Ġvar Ġfrom : ĠList < Any > ĊĠĠĠ Ġvar Ġjoins : ĠLinkedHashMap < String , ĠArrayList < Condition >> ĊĠĠĠ Ġvar Ġwhere : ĠList < Condition > ĊĠĠĠ Ġvar Ġgroup By s : ĠList < String > ĊĠĠĠ Ġvar Ġh avings : ĠList < Condition > ĊĠĠĠ Ġvar Ġorder : ĠList < Sort > ĊĠĠĠ Ġvar Ġlimit : ĠArray < Int >? ĊĠĠĠ Ġvar Ġcustom : ĠMap < Custom Part , ĠList < Query Block >> ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery : Query , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields : ĠLinkedHashMap < String , ĠArray < String >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom : ĠList < Any >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoins : ĠLinkedHashMap < String , ĠArrayList < Condition >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere : ĠList < Condition >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder : ĠList < Sort >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit : ĠArray < Int > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By s : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhaving Condition : ĠList < Condition >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Expression : ĠMap < Custom Part , ĠList < Query Block >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fields Ġ= Ġfields ĊĠĠĠĠĠĠĠ Ġthis . query Ġ= Ġquery ĊĠĠĠĠĠĠĠ Ġthis . from Ġ= Ġfrom ĊĠĠĠĠĠĠĠ Ġthis . join s Ġ= Ġjoins ĊĠĠĠĠĠĠĠ Ġthis . where Ġ= Ġwhere ĊĠĠĠĠĠĠĠ Ġthis . order Ġ= Ġorder ĊĠĠĠĠĠĠĠ Ġthis . limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠ Ġthis . groupBy s Ġ= Ġgroup By s ĊĠĠĠĠĠĠĠ Ġthis . hav ings Ġ= Ġhaving Condition ĊĠĠĠĠĠĠĠ Ġthis . custom Ġ= Ġcustom Expression ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġescape TableName ( statement : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrg x Find Field . replace ( statement , Ġrg x Replace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompile () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild From Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfrom Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( from . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġfrom [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Tables Ġ= Ġif Ġ( from . size Ġ== Ġ 1 ) Ġfrom Ġelse Ġfrom . distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Tables . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! t . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( esp TableName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ+= Ġ"${ esp }${ t }${ esp }, Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ+= Ġ"$ t , Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f Ġis ĠQuery ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Parts Ġ= Ġf . compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Parts . parts . from . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Table Ġ= Ġsub Parts . parts . from [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Table Ġ= Ġif Ġ( esp TableName ) Ġ"$ esp $ sub Table $ esp " Ġelse Ġsub Table ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ= Ġ" (${ sub Parts . sql }) ĠAS Ġ$ as Table " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( esp TableName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ= Ġescape TableName ( from Part ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ= Ġ" (${ sub Parts . sql })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Part Ġ= Ġfrom Part . substring ( 0 , Ġfrom Part . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfrom Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Join s Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġjoins Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ(( join , Ġconditions ) Ġin Ġjoins ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġjoin . split ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtbl Ġ= Ġif Ġ( esp TableName ) Ġ"$ esp ${ parts . last ()} $ esp " Ġelse Ġparts . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjoin Stmt Ġ= Ġparts . sub List ( 0 , Ġparts . size Ġ- Ġ 1 ). join ToString (" Ġ"). toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlogic Stmt Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ" Ġ${ it . get Statement ()} Ġ${ it . get Operator ()} Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġs . split (" =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ> Ġ 0 Ġ&& Ġ! parts [ 0 ]. contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġ"${ tbl }.${ s . trim Start () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Stmt Ġ+= Ġif Ġ( esp TableName ) Ġescape TableName ( s ) Ġelse Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( logic Stmt Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Stmt Ġ= Ġlogic Stmt . substring ( 0 , Ġlogic Stmt . length Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoins Part Ġ+= Ġline break Ġ+ Ġ"$ join Stmt Ġ$ tbl ĠON Ġ($ logic Stmt )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjoins Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Where Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwhere Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġwhere . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ"${ it . get Statement ()} Ġ${ it . get Operator ()} Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Part Ġ+= Ġline break Ġ+ Ġ( if Ġ( esp TableName ) Ġescape TableName ( s ) Ġelse Ġs ). trim End () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( where Part Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Part Ġ= Ġline break Ġ+ Ġ" WHERE " Ġ+ Ġwhere Part . substring ( 0 , Ġwhere Part . length Ġ- Ġ 3 ). replace (" Ġ Ġ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhere Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild GroupBy Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgroup By Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( groupBy s . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( esp TableName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By Part Ġ+= Ġescape TableName ("$ it , Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By Part Ġ+= Ġ"$ it , Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By Part Ġ= Ġline break Ġ+ Ġ" GROUP ĠBY Ġ" Ġ+ Ġgroup By Part . substring ( 0 , Ġgroup By Part . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgroup By Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Having Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhaving Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġh avings . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ"${ it . get Statement ()} Ġ${ it . get Operator ()} Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhaving Part Ġ+= Ġline break Ġ+ Ġ( if Ġ( esp TableName ) Ġescape TableName ( s ) Ġelse Ġs ). trim End () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( having Part Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhaving Part Ġ= Ġline break Ġ+ Ġ" HAV ING " Ġ+ Ġhaving Part . substring ( 0 , Ġhaving Part . length Ġ- Ġ 3 ). replace (" Ġ Ġ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhaving Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild OrderBy Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġorder Part Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġorder . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ"${ it . fieldName } Ġ${ it . get Direction ()}, Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder Part Ġ+= Ġif Ġ( esp TableName ) Ġescape TableName ( s ) Ġelse Ġs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( order Part Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorder Part Ġ= Ġline break Ġ+ Ġ" ORDER ĠBY Ġ" Ġ+ Ġorder Part . substring ( 0 , Ġorder Part . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġorder Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Limit Offset Part ( esp : ĠString , Ġesp TableName : ĠBoolean ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline break Ġ+ Ġif Ġ( limit Ġ!= Ġnull ) Ġ" LIMIT Ġ${ limit ! ![ 0 ]} ĠOFFSET Ġ${ limit ! ![ 1 ]} Ġ" Ġelse Ġ"" ĊĊĠĠĠ Ġfun Ġpre compile (): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( columns , Ġsql Fields ) Ġ= Ġquery . compile Select () ĊĠĠĠĠĠĠĠ Ġval Ġesp Ġ= Ġquery . esp Char ĊĠĠĠĠĠĠĠ Ġval Ġesp TableName Ġ= Ġquery . esp TableName ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Part Ġ= Ġbuild From Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġjoins Part Ġ= Ġbuild Join s Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġwhere Part Ġ= Ġbuild Where Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup By Part Ġ= Ġbuild GroupBy Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġhaving Part Ġ= Ġbuild Having Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġorder Part Ġ= Ġbuild OrderBy Part ( esp , Ġesp TableName ) ĊĠĠĠĠĠĠĠ Ġval Ġlimit Part Ġ= Ġbuild Limit Offset Part ( esp , Ġesp TableName ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( sql Fields , Ġfrom Part , Ġjoins Part , Ġwhere Part , Ġgroup By Part , Ġhaving Part , Ġorder Part , Ġlimit Part ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompile (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Parts Ġ= Ġpre compile () ĊĠĠĠĠĠĠĠ Ġval Ġsql Fields Ġ= Ġall Parts [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġothers Ġ= Ġall Parts . slice ( 1 Ġuntil Ġall Parts . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcustom Parts Ġ= ĠCustom Part . values () ĊĠĠĠĠĠĠĠ Ġval Ġpart Names Ġ= Ġcustom Parts . slice ( 2 Ġuntil Ġcustom Parts . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġparts Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġothers . forEach Indexed Ġ{ Ġidx , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġs . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ!= Ġ"") Ġparts Ġ+= Ġ"$ p Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom . containsKey ( part Names [ idx ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġcustom [ part Names [ idx ]] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts Ġ+= Ġit . toString (). trim () Ġ+ Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsql Ġ= Ġ" SELECT Ġ" ĊĠĠĠĠĠĠĠ Ġif Ġ( custom . containsKey ( Custom Part . SELECT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġcustom [ Custom Part . SELECT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocks ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Ġ+= Ġ"$ it Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Ġ= Ġsql . replace (" Ġ Ġ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsql Ġ+= Ġ"$ sql Fields Ġ" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( custom . containsKey ( Custom Part . FIELD )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocks Ġ= Ġcustom [ Custom Part . SELECT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocks ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql Ġ+= Ġ"$ it Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql Ġ= Ġsql . replace (" Ġ Ġ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsql Ġ= Ġsql . trim End () ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" $ sql ĠFROM Ġ$ parts """. trim End () ĊĠĠĠ Ġ} Ċ } Ċ