/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 0 4 - 2 0 2 1 , ĠUniversity Ġof ĠOs lo Ċ Ġ* Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* Ġ ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġ Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ġ ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* Ġ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* Ġ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* Ġ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ġ ĠNeither Ġthe Ġname Ġof Ġthe ĠH ISP Ġproject Ġnor Ġthe Ġnames Ġof Ġits Ġcontributors Ġmay Ċ Ġ* Ġ Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ċ Ġ* Ġ Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* Ġ ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND Ċ Ġ* Ġ ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED Ċ Ġ* Ġ ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* Ġ ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR Ċ Ġ* Ġ ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ċ Ġ* Ġ Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; Ċ Ġ* Ġ ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON Ċ Ġ* Ġ ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ Ġ* Ġ Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS Ċ Ġ* Ġ ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġorg . h isp . dh is . android . core . analytics . ag gregated . internal Ċ Ċ import Ġjavax . inject . Inject Ċ import Ġorg . h isp . dh is . android . core . analytics . ag gregated .* Ċ import Ġorg . h isp . dh is . android . core . visualization . Visualization Ċ import Ġorg . h isp . dh is . android . core . visualization . Visualization Collection Repository Ċ Ċ internal Ġclass ĠAnalytics Visual izations Service Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġanalytics Repository : ĠAnalytics Repository , ĊĠĠĠ Ġprivate Ġval Ġvisualization Collection Repository : ĠVisualization Collection Repository , ĊĠĠĠ Ġprivate Ġval Ġdimension Helper : ĠAnalytics Visual izations Service Dimension Helper Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġevaluate ( params : ĠAnalytics Visual izations Repository Params ): ĠGrid Analytics Response Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( params . visualization Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAnalytics Exception . Invalid Arguments (" Null Ġvisualization Ġid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvisualization Ġ= Ġget Visualization ( params . visualization ) ĊĠĠĠĠĠĠĠ Ġval Ġdimensional Response Ġ= Ġget Dimension al Response ( visualization , Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Grid Response ( visualization , Ġdimensional Response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Visualization ( visualization Id : ĠString ): ĠVisualization Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvisualization Collection Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category Dimensions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Data Dimension Items () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uid ( visualization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. blocking Get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAnalytics Exception . Invalid Arguments (" Visualization Ġ$ visualization Id Ġdoes Ġnot Ġexist ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dimension al Response ( ĊĠĠĠĠĠĠĠ Ġvisualization : ĠVisualization , ĊĠĠĠĠĠĠĠ Ġparams : ĠAnalytics Visual izations Repository Params ĊĠĠĠ Ġ): ĠDimension al Response Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġanalytics Repository Ġ= Ġanalytics Repository ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Dimensions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( visualization . row Dimensions () Ġ?: Ġempty List ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( visualization . column Dimensions () Ġ?: Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġquery Items Ġ= Ġdimension Helper . get Dimension Items ( visualization , Ġquery Dimensions ) ĊĠĠĠĠĠĠĠ Ġvar Ġfilter Items Ġ= Ġdimension Helper . get Dimension Items ( visualization , Ġvisualization . filter Dimensions ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOver write Ġperiods ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . periods . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query Items . any Ġ{ Ġit . dimension Ġ== ĠDimension . Period Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Items Ġ= Ġquery Items . filter Not Ġ{ Ġit . dimension Ġ== ĠDimension . Period Ġ} Ġ+ Ġparams . periods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( filter Items . any Ġ{ Ġit . dimension Ġ== ĠDimension . Period Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Items Ġ= Ġfilter Items . filter Not Ġ{ Ġit . dimension Ġ== ĠDimension . Period Ġ} Ġ+ Ġparams . periods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Items Ġ= Ġfilter Items Ġ+ Ġparams . periods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOver write Ġorganisation Units ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . organisation Units . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query Items . any Ġ{ Ġit . dimension Ġ== ĠDimension . Organ isation Unit Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Items Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Items . filter Not Ġ{ Ġit . dimension Ġ== ĠDimension . Organ isation Unit Ġ} Ġ+ Ġparams . organisation Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( filter Items . any Ġ{ Ġit . dimension Ġ== ĠDimension . Organ isation Unit Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Items Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Items . filter Not Ġ{ Ġit . dimension Ġ== ĠDimension . Organ isation Unit Ġ} Ġ+ Ġparams . organisation Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Items Ġ= Ġfilter Items Ġ+ Ġparams . organisation Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġquery Items . forEach Ġ{ Ġanalytics Repository Ġ= Ġanalytics Repository . with Dimension ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġfilter Items . forEach Ġ{ Ġanalytics Repository Ġ= Ġanalytics Repository . with Filter ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġanalytics Repository . blocking Evaluate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Grid Response ( ĊĠĠĠĠĠĠĠ Ġvisualization : ĠVisualization , ĊĠĠĠĠĠĠĠ Ġdimensional Response : ĠDimension al Response ĊĠĠĠ Ġ): ĠGrid Analytics Response Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġgrid Dimension Ġ= Ġdimension Helper . get Grid Dimensions ( visualization ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrow Indexes Ġ= Ġgrid Dimension . rows . map Ġ{ Ġdimensional Response . dimensions . indexOf ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgrouped By Row Ġ= Ġdimensional Response . values . groupBy Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Indexes . map Ġ{ ĠrowIndex Ġ-> Ġvalue . dimensions [ rowIndex ] Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgrid Values Ġ= Ġgrouped By Row . map Ġ{ Ġ( rows , Ġvalue List ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue List . map Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGrid Response Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Ġ= Ġvalue . dimensions . filter Not Ġ{ Ġrows . contains ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows Ġ= Ġrows , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgrid Header Ġ= Ġbuild Grid Header ( grid Values ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGrid Analytics Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ= Ġdimensional Response . metadata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġgrid Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= Ġgrid Dimension , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimension Items Ġ= Ġdimensional Response . dimension Items , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Ġ= Ġdimensional Response . filters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġgrid Values ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Grid Header ( grid Values : ĠList < List < Grid Response Value >> ): ĠGrid Header Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( grid Values . isEmpty () Ġ|| Ġgrid Values . first (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGrid Header ( emptyList (), Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsample Row Ġ= Ġgrid Values . first () ĊĊĠĠĠĠĠĠĠ Ġval Ġcolumn Count Ġ= Ġsample Row . first (). columns . size ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġ( 0 Ġuntil Ġcolumn Count ). map Ġ{ Ġcolumn Idx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Values Ġ= Ġsample Row . map Ġ{ Ġit . columns [ column Idx ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Grid Header Items ( column Values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsample Column Ġ= Ġgrid Values . map Ġ{ Ġit . first () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrow Count Ġ= Ġsample Column . first (). rows . size ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġ( 0 Ġuntil Ġrow Count ). map Ġ{ Ġrow Idx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Values Ġ= Ġsample Column . map Ġ{ Ġit . rows [ row Idx ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Grid Header Items ( row Values ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGrid Header ( columns , Ġrows ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Grid Header Items ( values : ĠList < String >): ĠList < Grid Header Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġmutable ListOf < Grid Header Item >() ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġgroups . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last ?. id Ġ== Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups [ groups . last Index ] Ġ= Ġlast . copy ( weight Ġ= Ġlast . weight Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups . add ( Grid Header Item ( it , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgroups ĊĠĠĠ Ġ} Ċ } Ċ