package Ġgov . cdc . prime . router Ċ Ċ import Ġtech . tables aw . api . String Column Ċ import Ġtech . tables aw . api . Table Ċ import Ġtech . tables aw . columns . Column Ċ import Ġtech . tables aw . selection . Selection Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util . UUID Ċ Ċ /** Ċ Ġ* ĠReport Ġid Ċ Ġ*/ Ċ type alias ĠReport Id Ġ= ĠUUID Ċ Ċ /** Ċ Ġ* ĠThe Ġreport Ġrepresents Ġthe Ġreport Ġfrom Ġone Ġagent - organization , Ġand Ġwhich Ġis Ċ Ġ* Ġtranslated Ġand Ġsent Ġto Ġanother Ġagent - organization . ĠEach Ġreport Ġhas Ġa Ġschema , Ċ Ġ* Ġunique Ġid Ġand Ġname Ġas Ġwell Ġas Ġlist Ġof Ġsources Ġfor Ġthe Ġcreation Ġof Ġthe Ġreport . Ċ Ġ*/ Ċ class ĠReport Ġ{ ĊĠĠĠ Ġval Ġid : ĠReport Id ĊĠĠĠ Ġval Ġschema : ĠSchema ĊĠĠĠ Ġval Ġsources : ĠList < Source > ĊĠĠĠ Ġval Ġdestination : ĠOrganization Service ? ĊĠĠĠ Ġval Ġcreated DateTime : ĠOffset DateTime ĊĊĠĠĠ Ġval Ġitem Count : ĠInt Ġget () Ġ= Ġthis . table . rowCount () ĊĠĠĠ Ġval Ġrow Indices : ĠInt Range Ġget () Ġ= Ġ 0 Ġuntil Ġthis . table . rowCount () ĊĠĠĠ Ġval Ġname : ĠString Ġget () Ġ= Ġform FileName ( id , Ġschema . base Name , Ġdestination ?. format , Ġcreated DateTime ) ĊĊĠĠĠ Ġ// ĠThe Ġuse Ġof Ġa ĠTable S aw Ġis Ġan Ġimplementation Ġdetail Ġhidden Ġby Ġthis Ġclass ĊĠĠĠ Ġ// ĠThe ĠTable S aw Ġtable Ġis Ġmutable , Ġwhile Ġthis Ġclass Ġis Ġhas Ġimmutable Ġsemantics ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠDev ĠNote : ĠTable S aw Ġis Ġnot Ġmulti - platform , Ġso Ġit Ġcould Ġbe Ġswitched Ġout Ġin Ġthe Ġfuture . ĊĠĠĠ Ġ// ĠDon 't Ġlet Ġthe ĠTable S aw Ġabstraction Ġleak . ĊĠĠĠ Ġ// ĊĠĠĠ Ġprivate Ġval Ġtable : ĠTable ĊĊĠĠĠ Ġ// ĠGeneric ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġschema : ĠSchema , ĊĠĠĠĠĠĠĠ Ġvalues : ĠList < List < String >>, ĊĠĠĠĠĠĠĠ Ġsources : ĠList < Source >, ĊĠĠĠĠĠĠĠ Ġdestination : ĠOrganization Service ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġthis . schema Ġ= Ġschema ĊĠĠĠĠĠĠĠ Ġthis . sources Ġ= Ġsources ĊĠĠĠĠĠĠĠ Ġthis . created DateTime Ġ= ĠOffset DateTime . now () ĊĠĠĠĠĠĠĠ Ġthis . destination Ġ= Ġdestination ĊĠĠĠĠĠĠĠ Ġthis . table Ġ= Ġcreate Table ( schema , Ġvalues ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTest Ġsource ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġschema : ĠSchema , ĊĠĠĠĠĠĠĠ Ġvalues : ĠList < List < String >>, ĊĠĠĠĠĠĠĠ Ġsource : ĠTest Source , ĊĠĠĠĠĠĠĠ Ġdestination : ĠOrganization Service ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġthis . schema Ġ= Ġschema ĊĠĠĠĠĠĠĠ Ġthis . sources Ġ= ĠlistOf ( source ) ĊĠĠĠĠĠĠĠ Ġthis . destination Ġ= Ġdestination ĊĠĠĠĠĠĠĠ Ġthis . created DateTime Ġ= ĠOffset DateTime . now () ĊĠĠĠĠĠĠĠ Ġthis . table Ġ= Ġcreate Table ( schema , Ġvalues ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠClient Ġsource ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġschema : ĠSchema , ĊĠĠĠĠĠĠĠ Ġvalues : ĠList < List < String >>, ĊĠĠĠĠĠĠĠ Ġsource : ĠOrganization Client , ĊĠĠĠĠĠĠĠ Ġdestination : ĠOrganization Service ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġthis . schema Ġ= Ġschema ĊĠĠĠĠĠĠĠ Ġthis . sources Ġ= ĠlistOf ( Client Source ( source . organization . name , Ġsource . name )) ĊĠĠĠĠĠĠĠ Ġthis . destination Ġ= Ġdestination ĊĠĠĠĠĠĠĠ Ġthis . created DateTime Ġ= ĠOffset DateTime . now () ĊĠĠĠĠĠĠĠ Ġthis . table Ġ= Ġcreate Table ( schema , Ġvalues ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġschema : ĠSchema , ĊĠĠĠĠĠĠĠ Ġtable : ĠTable , ĊĠĠĠĠĠĠĠ Ġsources : ĠList < Source >, ĊĠĠĠĠĠĠĠ Ġdestination : ĠOrganization Service ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠ Ġthis . schema Ġ= Ġschema ĊĠĠĠĠĠĠĠ Ġthis . table Ġ= Ġtable ĊĠĠĠĠĠĠĠ Ġthis . sources Ġ= Ġsources ĊĠĠĠĠĠĠĠ Ġthis . destination Ġ= Ġdestination ĊĠĠĠĠĠĠĠ Ġthis . created DateTime Ġ= ĠOffset DateTime . now () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Dest ruct ure ") ĊĠĠĠ Ġprivate Ġfun Ġcreate Table ( schema : ĠSchema , Ġvalues : ĠList < List < String >> ): ĠTable Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġvalues To Columns ( schema : ĠSchema , Ġvalues : ĠList < List < String >> ): ĠList < Column <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġschema . elements . map Indexed Ġ{ Ġindex , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Column . create ( element . name , Ġvalues . map Ġ{ Ġit [ index ] Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTable . create (" prime ", Ġvalues To Columns ( schema , Ġvalues )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfrom This Report ( action : ĠString ) Ġ= ĠlistOf ( Report Source ( this . id , Ġaction )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDoes Ġa Ġshallow Ġcopy Ġof Ġthis Ġreport . ĠWill Ġhave Ġa Ġnew Ġid Ġand Ġcreate Ġdate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy ( destination : ĠOrganization Service ? Ġ= Ġnull ): ĠReport Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDev ĠNote : Ġtable Ġis Ġimmutable , Ġso Ġno Ġneed Ġto Ġduplicate Ġit ĊĠĠĠĠĠĠĠ Ġreturn ĠReport ( this . schema , Ġthis . table , Ġfrom This Report (" copy "), Ġdestination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . rowCount () Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString ( row : ĠInt , Ġcolumn : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . getString ( row , Ġcolumn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString ( row : ĠInt , Ġcol Name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . getString ( row , Ġcol Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString WithDefault ( row : ĠInt , Ġcol Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( table . column Names (). contains ( col Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . getString ( row , Ġcol Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema . findElement ( col Name )?. default Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter ( filter Functions : ĠList < String >): ĠReport Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcombined Selection Ġ= ĠSelection . with Range ( 0 , Ġtable . rowCount ()) ĊĠĠĠĠĠĠĠ Ġfilter Functions . forEach Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( fn Name , Ġfn Args ) Ġ= ĠJ urisdiction al Filters . parse J urisdiction al Filter ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Fn Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata . find J urisdiction al Filter ( fn Name ) Ġ?: Ġerror (" J urisdiction al Filter Ġ$ fn Name Ġis Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Fn Selection Ġ= Ġfilter Fn . getSelection ( fn Args , Ġtable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombined Selection . and ( filter Fn Selection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Table Ġ= Ġtable . where ( combined Selection ) ĊĠĠĠĠĠĠĠ Ġreturn ĠReport ( this . schema , Ġfiltered Table , Ġfrom This Report (" filter : Ġ$ filter Functions ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġde identify (): ĠReport Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġschema . elements . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . pi i Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Default Column ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . column ( it . name ). copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠReport ( schema , ĠTable . create ( columns ), Ġfrom This Report (" de identify ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Mapping ( mapping : ĠSchema . Mapping ): ĠReport Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġmapping . to Schema . elements . map Ġ{ Ġbuild Column ( mapping , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Table Ġ= ĠTable . create ( columns ) ĊĠĠĠĠĠĠĠ Ġreturn ĠReport ( mapping . to Schema , Ġnew Table , Ġfrom This Report (" mapping ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Column ( mapping : ĠSchema . Mapping , Ġto Element : ĠElement ): ĠString Column Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( to Element . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġmapping . use Direct ly Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . string Column ( mapping . use Direct ly [ to Element . name ]). copy (). setName ( to Element . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġmapping . use Mapper Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mapped Column ( to Element , Ġmapping . use Mapper . getValue ( to Element . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġmapping . use Default Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Default Column ( to Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" missing Ġmapping Ġfor Ġelement : Ġ${ to Element . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Default Column ( element : ĠElement ): ĠString Column Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Values Ġ= ĠArray ( table . rowCount ()) Ġ{ Ġelement . default Ġ?: Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠString Column . create ( element . name , Ġdefault Values . asList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Mapped Column ( to Element : ĠElement , Ġmapper : ĠMapper ): ĠString Column Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠMap pers . parse Mapper Field ( to Element . mapper Ġ?: Ġerror (" mapper Ġis Ġmissing ")). second ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArray ( table . rowCount ()) Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Values Ġ= Ġmapper . value Names ( to Element , Ġargs ). map NotNull Ġ{ Ġelement Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġtable . getString ( row , Ġelement Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . isBlank ()) Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġschema . findElement ( element Name ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠElement And Value ( element , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . apply ( to Element , Ġargs , Ġinput Values ) Ġ?: Ġto Element . default Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠString Column . create ( to Element . name , Ġvalues . asList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmerge ( inputs : ĠList < Report >): ĠReport Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputs . isEmpty ()) Ġerror (" Cannot Ġmerge Ġan Ġempty Ġreport Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputs . size Ġ== Ġ 1 ) Ġreturn Ġinputs [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġinputs [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġinputs . sub List ( 1 , Ġinputs . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġschema ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġhead . schema ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail . find Ġ{ Ġit . schema Ġ!= Ġschema Ġ} ?. let Ġ{ Ġerror ("${ it . schema . name } Ġdoes Ġnot Ġmatch Ġthe Ġrest Ġof Ġthe Ġmerge ") Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuild Ġtable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Table Ġ= Ġhead . table . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Table . append ( it . table ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuild Ġsources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsources Ġ= Ġinputs . map Ġ{ ĠReport Source ( it . id , Ġ" merge ") Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠReport ( schema , Ġnew Table , Ġsources ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġform FileName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid : ĠReport Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Format : ĠOrganization Service . Format ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated DateTime : ĠOffset DateTime ĊĠĠĠĠĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠDateTime Formatter . of Pattern (" YYYY MM dd HH mm ss ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Prefix Ġ= Ġ"${ Schema . form Base Name ( schema Name )} -$ id -${ formatter . format ( created DateTime )}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Suffix Ġ= Ġfile Format ?. to Ext () Ġ?: ĠOrganization Service . Format . CSV . to Ext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ name Prefix .$ name Suffix " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }