package Ġorg . ev om aster . core . problem . rest . resource . dependency Ċ Ċ import Ġorg . ev om aster . client . java . controller . api . dto . database . execution . Execution Dto Ċ import Ġorg . ev om aster . core . database . SQL Key Ċ import Ġorg . ev om aster . core . problem . rest . param . Body Param Ċ import Ġorg . ev om aster . core . problem . rest . param . Param Ċ import Ġorg . ev om aster . core . problem . rest . util . inference . model . Matched Info Ċ Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġresource Ġand Ġtables Ċ Ġ* Ġ@ property Ġkey Ġrefers Ġto Ġan Ġresource Ġnode Ċ Ġ*/ Ċ class ĠResource Related ToTable ( val Ġkey : ĠString ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFROM _ E VO _ DTO Ġ= Ġ" ____ FROM _ DTO ____ " ĊĊĠĠĠĠĠĠĠ Ġfun Ġgenerate From Dto Matched Info ( table : ĠString ) Ġ: ĠMat ched Info Ġ= ĠMat ched Info ( FROM _ E VO _ DTO , Ġtable , Ġ 1 . 0 , Ġ- 1 , Ġ- 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġtable Ġname ĊĠĠĠĠ Ġ* Ġvalue Ġis ĠMat ched Info , Ġ[ Matched Info . target Matched ] Ġrefers Ġto Ġa Ġtable Ġname , Ġ[ Matched Info . input ] Ġis Ġeither Ġsegment Ġor Ġrefer Type ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġthe Ġmap Ġis Ġderived Ġbased Ġon ĊĠĠĠĠ Ġ* ĠĠ 1 ) Ġtype , Ġfor Ġinstance Ġ/ A /{ b }/ B /{ b }, Ġbody Ġparam Ġ{ c } Ġrefer Ġto Ġtype ĠC . Ġ( input Ġindicator Ġis Ġ 0 ) ĊĠĠĠĠ Ġ* ĠĠ 2 ) Ġsegments , Ġfor Ġinstance Ġthere Ġare Ġtwo Ġsegments Ġ( i . e ., Ġ/ A Ġand Ġ/ B ) Ġregarding Ġthe Ġpath Ġ/ A /{ a }/ B /{ b }. Ġfor ĠB , Ġthe Ġinput Ġindicator Ġis Ġ 0 , Ġfor ĠA , Ġthe Ġinput Ġindicator Ġis Ġ 1 ĊĠĠĠĠ Ġ* Ġthen Ġdetect Ġwhether Ġthere Ġare Ġtables Ġrelated Ġto ĠC , ĠA Ġand ĠB . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġderived Map Ġ: ĠMutable Map < String , ĠMutable List < Matched Info >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġid Ġof Ġparam ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġmatched Ġinfo ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġparam ToTable Ġ: ĠMutable Map < String , ĠParam Related ToTable > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġtable Ġname ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġboolean , Ġindicating Ġwhether Ġthe Ġrelationship Ġis Ġdirect ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġwhether Ġthe Ġrelated Ġtable Ġis Ġconfirmed Ġby Ġev om aster Ġdriver , Ġi . e ., Ġreturn Ġ[ Execution Dto ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġto Ġbind Ġparam Ġof Ġaction Ġregarding Ġtable , ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġwe Ġneed Ġto Ġfurther Ġdetect Ġwhether Ġthe Ġrelationship Ġbetween Ġresource Ġand Ġtable Ġis Ġdirect ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġconfirmed Set Ġ: ĠMutable Map < String , ĠBoolean > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġverb Ġof Ġthe Ġaction ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġrelated Ġtable Ġwith Ġits Ġfields ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġsame Ġaction Ġmay Ġexecute Ġdifferent ĠSQL Ġcomm ends Ġdue Ġto Ġe . g ., Ġcookies Ġor Ġdifferent Ġvalues ĊĠĠĠĠ Ġ* ĠWhen Ġupdating Ġ[ action To Tables ], Ġwe Ġcheck Ġif Ġexisting Ġ[ Action Related ToTable ] Ġsubs umes Ġ[ Execution Dto ] Ġor Ġ[ Execution Dto ] Ġsubs ume Ġ[ Action Related ToTable ] Ġregarding Ġinvolved Ġtables . ĊĠĠĠĠ Ġ* Ġif Ġsub su med , Ġwe Ġupdate Ġexisting Ġ[ Action Related ToTable ]; Ġelse Ġcreate Ġ[ Action Related ToTable ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġaction To Tables Ġ: ĠMutable Map < String , ĠMutable List < Action Related ToTable >> Ġ= Ġmutable Map Of () ĊĊĊĠĠĠ Ġfun Ġupdate Action Related ToTable ( verb Ġ: ĠString , Ġdto : ĠExecution Dto , Ġexisting Tables Ġ: ĠSet < String >) Ġ: ĠBoolean { ĊĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= Ġmutable ListOf < String >(). plus ( dto . deleted Data ). plus ( dto . updated Data . keys ). plus ( dto . inserted Data . keys ). plus ( dto . quer ied Data . keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġexisting Tables . contains ( it ) Ġ|| Ġexisting Tables . any Ġ{ Ġe -> e . toLowerCase () Ġ== Ġit . toLowerCase () Ġ}} . to HashSet () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tables . isEmpty ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġaction To Tables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Or Put ( verb ){ Ġmutable ListOf ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . does Sub s ume ( tables , Ġtrue ) Ġ|| Ġit . does Sub s ume ( tables , Ġfalse )} ĊĊĠĠĠĠĠĠĠ Ġval Ġdoes Update Param Table Ġ= Ġ( access Ġ== Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġif ( access == Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= ĠAction Related ToTable ( verb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction To Tables [ verb ] !!. add ( access ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaccess . update Table With Fields ( dto . deleted Data . map Ġ{ ĠPair ( it , Ġmutable Set Of < String >()) Ġ}. toMap (), ĠSQL Key . DELETE ) ĊĠĠĠĠĠĠĠ Ġaccess . update Table With Fields ( dto . inserted Data , ĠSQL Key . INSERT ) ĊĠĠĠĠĠĠĠ Ġaccess . update Table With Fields ( dto . quer ied Data , ĠSQL Key . SELECT ) ĊĠĠĠĠĠĠĠ Ġaccess . update Table With Fields ( dto . updated Data , ĠSQL Key . UPDATE ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdoes Update Param Table ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Confirmed Direct Tables () Ġ: ĠSet < String >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġderived Map . keys . filter Ġ{ Ġt -> Ġconfirmed Set [ t ] Ġ!= Ġnull Ġ&& Ġconfirmed Set [ t ] !! Ġ}. to HashSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Best Table For Param ( tables : ĠSet < String >, Ġsimple P 2 Table Ġ: ĠSimple Param Related ToTable , Ġonly Confirmed Column Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠPair < Set < String >, ĠDouble >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġsimple P 2 Table . derived Map . filter Ġ{ Ġtables . any Ġ{ Ġt -> Ġt . equals ( it . key , Ġignore Case Ġ= Ġtrue ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( it . key , Ġit . value . similarity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġif ( map . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbest Ġ= Ġmap . as Sequence (). sorted By Ġ{ Ġit . value Ġ}. last (). value ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( map . filter Ġ{ Ġit . value Ġ== Ġbest Ġ}. keys , Ġbest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn ĠPair . first Ġis Ġname Ġof Ġtable , ĠPair . second Ġis Ġcolumn Ġof ĠTable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Simple Param To Specified Table ( table : ĠString , Ġsimple P 2 Table Ġ: ĠSimple Param Related ToTable , Ġonly Confirmed Column Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠPair < String , ĠString >? Ġ{ ĊĠĠĠĠĠĠĠ Ġsimple P 2 Table . derived Map . filter Ġ{ Ġtable . equals ( it . key , Ġignore Case Ġ= Ġtrue ) Ġ}. let Ġ{ Ġmap -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn ĠPair ( table , Ġmap . values . first (). target Matched ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġkey Ġis Ġfield Ġname ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġvalue Ġis Ġa Ġpair , Ġthe Ġfirst Ġof Ġpair Ġof Ġrelated Ġtable Ġand Ġthe Ġsecond Ġis Ġsimilarity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Best Table For Param ( tables : ĠSet < String >, Ġbody P 2 Table Ġ: ĠBody Param Related ToTable , Ġonly Confirmed Column Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠMutable Map < String , ĠPair < Set < String >, ĠDouble >> ? { ĊĠĠĠĠĠĠĠ Ġval Ġfmap Ġ= Ġbody P 2 Table . fields Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . derived Map . any Ġ{ Ġm -> Ġtables . any Ġ{ Ġt -> Ġt . equals ( m . key , Ġignore Case Ġ= Ġtrue ) Ġ} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġif ( f map . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ: ĠMutable Map < String , ĠPair < Set < String >, ĠDouble >> Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġfmap . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelated Ġ= Ġu . derived Map . filter Ġ{ Ġm -> Ġtables . any Ġ{ Ġt -> Ġt . equals ( m . key , Ġignore Case Ġ= Ġtrue ) Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( related . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbest Ġ= Ġrelated . map Ġ{ Ġit . value . similarity Ġ}. max () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put ( t , ĠPair ( related . filter Ġ{ Ġit . value . similarity Ġ== Ġbest Ġ}. keys , Ġbest )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn ĠPair . first Ġis Ġname Ġof Ġtable , Ġkey Ġof Ġthe Ġsecond Ġis Ġfield , Ġvalue Ġis Ġthe Ġcolumn ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Body Param To Specified Table ( table : String , Ġbody P 2 Table Ġ: ĠBody Param Related ToTable , Ġonly Confirmed Column Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠPair < String , ĠMap < String , ĠString >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfmap Ġ= Ġbody P 2 Table . fields Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . derived Map . any Ġ{ Ġm -> m . key . toLowerCase () Ġ== Ġtable . toLowerCase () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġif ( f map . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( table , Ġfmap . map Ġ{ Ġf -> ĠPair ( f . key , Ġf . value . get Related Column ( table ) !!. first ()) }. toMap ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn ĠPair . first Ġis Ġname Ġof Ġtable , Ġkey Ġof Ġthe Ġsecond Ġis Ġfield , Ġvalue Ġis Ġthe Ġcolumn ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġonly Confirmed Column Ġwill Ġbe Ġused Ġto Ġonly Ġfind Ġthe Ġfield Ġthat Ġare Ġconfirmed Ġbased Ġon Ġfeedback Ġfrom Ġev om aster Ġdriver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Body Param To Specified Table ( table : String , Ġbody P 2 Table Ġ: ĠBody Param Related ToTable , ĠfieldName Ġ: ĠString , Ġonly Confirmed Column Ġ: ĠBoolean Ġ= Ġfalse ) Ġ: ĠPair < String , ĠPair < String , ĠString >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfmap Ġ= Ġbody P 2 Table . fields Map [ fieldName ] ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġfmap . derived Map . filter Ġ{ Ġit . key . toLowerCase () Ġ== Ġtable . toLowerCase () Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn ĠPair ( table , ĠPair ( fieldName , Ġit . values . first (). target Matched )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Tables In Derived Map () Ġ: ĠSet < String > Ġ= Ġderived Map . keys ĊĊĠĠĠ Ġfun Ġget Tables In Derived Map ( se gs Ġ: ĠList < String >) Ġ: ĠMap < String , ĠString >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġse gs . map Ġ{ Ġinput -> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( input , Ġget Tables In Derived Map ( input ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . isEmpty ()) Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthis . as Sequence (). sorted By Ġ{ Ġit . similarity Ġ}. last (). target Matched ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tables In Derived Map ( input Ġ: ĠString ) Ġ: ĠList < Matched Info >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġderived Map . values . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . filter Ġ{ Ġm -> Ġm . input . toLowerCase () Ġ== Ġinput . toLowerCase ()} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġan Ġrest Ġaction Ġand Ġtables , Ġwhich Ġis Ġfurther Ġextracted Ġbased Ġon Ġfeedback Ġfrom Ġev om aster Ġdriver Ċ Ġ* Ġ@ property Ġkey Ġrefers Ġto Ġan Ġrest Ġaction Ċ Ġ*/ Ċ class ĠAction Related ToTable ( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġkey Ġis Ġtable Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġvalue Ġis Ġhow Ġit Ġaccessed Ġby Ġdb action ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtable With Fields : ĠMutable Map < String , ĠMutable List < Access Table >> Ġ= Ġmutable Map Of () Ċ ) Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġof Ġresult Ġis Ġtable Ġname ĊĠĠĠĠ Ġ* Ġvalue Ġof Ġresult Ġis Ġa Ġset Ġof Ġmanip ulated Ġcolumns ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Table With Fields ( results Ġ: ĠMap < String , ĠSet < String >>, Ġmethod : ĠSQL Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdoes Update Target Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġresults . forEach Ġ{ Ġt , Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoes Update Target Ġ= Ġdoes Update Target Ġ|| Ġtable With Fields . containsKey ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable With Fields . get Or Put ( t ){ Ġmutable ListOf () Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtarget Ġ= Ġfind Ġ{ Ġit . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠAccess Table ( method , Ġt , Ġmutable Set Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . field . addAll ( u ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdoes Sub s ume ( tables Ġ: ĠSet < String >, Ġsubs ume This Ġ: ĠBoolean ) Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( subs ume This ) Ġtables . to HashSet (). contains All ( table With Fields . keys ) ĊĠĠĠĠĠĠĠ Ġelse Ġtable With Fields . keys . contains All ( tables ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ property Ġmethod Ġa Ġsql Ġmethod ĊĠĠĠĠ Ġ* Ġ@ property Ġtable Ġrelated Ġtable ĊĠĠĠĠ Ġ* Ġ@ property Ġfield Ġwhat Ġfields Ġare Ġassess Ġby Ġthe Ġsql Ġcommand ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠAccess Table ( val Ġmethod Ġ: ĠSQL Key , Ġval Ġtable Ġ: ĠString , Ġval Ġfield Ġ: ĠMutable Set < String >) Ċ } Ċ Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġa Ġparam Ġand Ġa Ġtable Ċ Ġ* Ġ@ property Ġkey Ġrefers Ġto Ġa Ġparam Ċ Ġ*/ Ċ abstract Ġclass ĠParam Related ToTable Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠString ){ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġtable Ġname ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġ[ Matched Info ], Ġ[ Match Info . target Matched ] Ġis Ġname Ġof Ġcolumn Ġof Ġthe Ġtable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġderived Map Ġ: ĠMutable Map < String , ĠMat ched Info > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġval Ġconfirmed Column Ġ: ĠMutable Set < String > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġopen Ġfun Ġget Related Column ( table : ĠString ) Ġ: ĠSet < String >? Ġ Ġ= Ġderived Map [ table ]. run Ġ{ Ġif Ġ( this Ġ== Ġnull ) Ġnull Ġelse Ġset Of ( this . target Matched ) Ġ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġa ĠParam Ġ( not ĠBody Param ) Ġand Ġa Ġtable Ċ Ġ*/ Ċ class ĠSimple Param Related ToTable Ġ( key : ĠString , Ġval Ġrefer Param : ĠParam ): ĠParam Related ToTable ( key ) Ċ Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġa ĠBody Param Ġand Ġa Ġtable Ċ Ġ*/ Ċ class ĠBody Param Related ToTable ( key : ĠString , Ġval Ġrefer Param : ĠParam ): ĠParam Related ToTable ( key ){ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( refer Param Ġis ĠBody Param ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġkey Ġis Ġfield Ġname Ġof Ġ[ refer Param ] ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġrelated Ġto Ġtable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfields Map Ġ: ĠMutable Map < String , ĠParam Field Related ToTable > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġoverride Ġfun Ġget Related Column ( table : ĠString ) Ġ: ĠSet < String >? Ġ= Ġfields Map . values . filter Ġ{ Ġit . derived Map . any Ġ{ Ġ Ġm -> Ġm . key . toLowerCase () Ġ== Ġtable . toLowerCase () Ġ}} . run Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . map Ġ{ Ġf -> f . derived Map . filter Keys Ġ{ Ġk -> k . toLowerCase () Ġ== Ġtable . toLowerCase () Ġ}. as Sequence (). first (). value . target Matched }. to HashSet () ĊĠĠĠ Ġ} Ċ Ċ } Ċ /** Ċ Ġ* Ġrelated Ġinfo Ġbetween Ġa Ġfield Ġof ĠBody Param Ġand Ġa Ġtable Ċ Ġ*/ Ċ class ĠParam Field Related ToTable ( key : ĠString ) Ġ: ĠParam Related ToTable ( key ){ ĊĊĠĠĠ Ġoverride Ġfun Ġget Related Column ( table : ĠString ) Ġ: Ġ ĠSet < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġderived Map . filter Ġ{ Ġit . key . toLowerCase () Ġ== Ġtable . toLowerCase () Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn Ġit . values . map Ġ{ m -> Ġm . target Matched }. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊĊ