/* ĠCopyright Ġ( c ) Ġ 2 0 2 2 Ġbit lap . org Ġ*/ Ċ package Ġorg . bit lap . core . md m Ċ Ċ import Ġorg . bit lap . common . utils . Pre Conditions Ċ import Ġorg . bit lap . core . md m . model . Row Ċ import Ġorg . bit lap . core . storage . load . Has Metric Key Ċ Ċ /** Ċ Ġ* Ġmetric Ġor Ġdimension Ġcontainer Ġto Ġmanager Ġkv Ġpairs Ċ Ġ*/ Ċ class ĠMD Container < I Ġ: ĠHas Metric Key , ĠR >( private Ġval Ġkey Size : ĠInt ) Ġ: ĠLinkedHashMap < List < Any ? >, ĠMutable Map < String , ĠR >>() Ġ{ ĊĊĠĠĠ Ġfun Ġput ( key : ĠAny , Ġrow : ĠI , Ġinitial : Ġ( I ) Ġ-> ĠR , Ġreducer : Ġ( R , ĠI ) Ġ-> ĠR ): ĠMD Container < I , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . put ( listOf ( key ), Ġrow , Ġinitial , Ġreducer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput ( key : ĠList < Any ? >, Ġrow : ĠI , Ġinitial : Ġ( I ) Ġ-> ĠR , Ġreducer : Ġ( R , ĠI ) Ġ-> ĠR ): ĠMD Container < I , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ ĠPre Conditions . check Expression ( key . size Ġ== Ġkey Size ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcompute If Absent ( key ) Ġ{ Ġmutable Map Of () Ġ} ĊĠĠĠĠĠĠĠ Ġvalue [ row . metric Key ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . containsKey ( row . metric Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer ( value [ row . metric Key ] !! , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflat Rows ( metrics : ĠList < String >, ĠdefaultValue : Ġ() Ġ-> ĠAny ): ĠList < Row > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . map Ġ{ Ġ( keys , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf Null s < Any >( key Size Ġ+ Ġmetrics . size ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . forEach Indexed Ġ{ Ġi , Ġkey Ġ-> Ġit [ i ] Ġ= Ġkey Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . map Indexed Ġ{ Ġi , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ i Ġ+ Ġkey Size ] Ġ= Ġvalue [ p ] Ġ?: ĠdefaultValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ