/* Ċ Ġ* Ġ Ġ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 . Dimension Item Ċ import Ġorg . h isp . dh is . android . core . analytics . ag gregated . Metadata Item Ċ import Ġorg . h isp . dh is . android . core . arch . db . query builders . internal . Where Clause Builder Ċ import Ġorg . h isp . dh is . android . core . arch . db . stores . internal . Ident ifiable Object Store Ċ import Ġorg . h isp . dh is . android . core . category . Category Ċ import Ġorg . h isp . dh is . android . core . category . Category Option Ċ import Ġorg . h isp . dh is . android . core . data element . Data Element Ċ import Ġorg . h isp . dh is . android . core . data element . Data Element Operand Ċ import Ġorg . h isp . dh is . android . core . indicator . Indicator Ċ import Ġorg . h isp . dh is . android . core . organisation unit . Organ isation Unit Ċ import Ġorg . h isp . dh is . android . core . organisation unit . Organ isation Unit Group Ċ import Ġorg . h isp . dh is . android . core . organisation unit . Organ isation Unit Level Ċ import Ġorg . h isp . dh is . android . core . organisation unit . Organ isation Unit Level Table Info Ċ import Ġorg . h isp . dh is . android . core . period . internal . Parent Period Generator Ċ import Ġorg . h isp . dh is . android . core . period . internal . Period Helper Ċ import Ġorg . h isp . dh is . android . core . program . Program Indicator Ċ Ċ @ Suppress (" Long Parameter List ") Ċ internal Ġclass ĠAnalytics Service Metadata Helper Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcategory Store : ĠIdent ifiable Object Store < Category >, ĊĠĠĠ Ġprivate Ġval Ġcategory Option Store : ĠIdent ifiable Object Store < Category Option >, ĊĠĠĠ Ġprivate Ġval Ġdata Element Store : ĠIdent ifiable Object Store < Data Element >, ĊĠĠĠ Ġprivate Ġval Ġdata Element Operand Store : ĠIdent ifiable Object Store < Data Element Operand >, ĊĠĠĠ Ġprivate Ġval Ġindicator Store : ĠIdent ifiable Object Store < Indicator >, ĊĠĠĠ Ġprivate Ġval Ġorganisation Unit Store : ĠIdent ifiable Object Store < Organ isation Unit >, ĊĠĠĠ Ġprivate Ġval Ġorganisation Unit Group Store : ĠIdent ifiable Object Store < Organ isation Unit Group >, ĊĠĠĠ Ġprivate Ġval Ġorganisation Unit Level Store : ĠIdent ifiable Object Store < Organ isation Unit Level >, ĊĠĠĠ Ġprivate Ġval Ġprogram Indicator Store : ĠIdent ifiable Object Store < Program Indicator >, ĊĠĠĠ Ġprivate Ġval Ġanalytics Organ isation Unit Helper : ĠAnalytics Organ isation Unit Helper , ĊĠĠĠ Ġprivate Ġval Ġparent Period Generator : ĠParent Period Generator , ĊĠĠĠ Ġprivate Ġval Ġperiod Helper : ĠPeriod Helper Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġget Metadata ( evaluation Items : ĠList < Analytics Service Evaluation Item >): ĠMap < String , ĠMetadata Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetadata : ĠMutable Map < String , ĠMetadata Item > Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġevaluation Items . forEach Ġ{ Ġevaluation Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ+= Ġget Metadata ( evaluation Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Metadata ( evaluation Item : ĠAnalytics Service Evaluation Item ): ĠMap < String , ĠMetadata Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetadata : ĠMutable Map < String , ĠMetadata Item > Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġ( evaluation Item . dimension Items Ġ+ Ġevaluation Item . filters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠDimension Item Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! metadata . containsKey ( item . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Items Ġ= Ġget Metadata Items ( item ). map Ġ{ Ġit . id Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ+= Ġmetadata Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmetadata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Metadata Items ( item : ĠDimension Item ): ĠList < Metadata Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Data Item Ġ-> ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Data Item . Data Element Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Element Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdata Element Ġ-> ĠMetadata Item . Data Element Item ( data Element ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠBuild Ġa Ġmeaningful Ġname Ġfor ĠData Element Operand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Data Item . Data Element Operand Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Element Operand Store . select By Uid ( item . id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdata Element Operand Ġ-> ĠMetadata Item . Data Element Operand Item ( data Element Operand ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Data Item . Indicator Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġindicator Ġ-> ĠMetadata Item . Indicator Item ( indicator ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Data Item . Program Indicator Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Indicator Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġprogram Indicator Ġ-> ĠMetadata Item . Program Indicator Item ( program Indicator ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Period Item Ġ-> ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Period Item . Absolute Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperiod Ġ= Ġperiod Helper . blocking Get Period For Period Id ( item . period Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata Item . Period Item ( period ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Period Item . Relative Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperiods Ġ= Ġparent Period Generator . generate Relative Periods ( item . relative ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata Item . Relative Period Item ( item . relative , Ġperiods ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Organ isation Unit Item Ġ-> ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Organ isation Unit Item . Absolute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganisation Unit Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġorganisation Unit Ġ-> ĠMetadata Item . Organ isation Unit Item ( organisation Unit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Organ isation Unit Item . Relative Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorg unit U ids Ġ= Ġanalytics Organ isation Unit Helper . get Relative Organ isation Units ( item . relative ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata Item . Organ isation Unit Relative Item ( item . relative , Ġorg unit U ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Organ isation Unit Item . Level Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel Clause Builder Ġ= ĠWhere Clause Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Key Number Value ( Organ isation Unit Level Table Info . Columns . LEVEL , Ġitem . level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganisation Unit Level Store . select One Where ( level Clause Builder ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġlevel Ġ-> ĠMetadata Item . Organ isation Unit Level Item ( level ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Organ isation Unit Item . Group Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganisation Unit Group Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġgroup Ġ-> ĠMetadata Item . Organ isation Unit Group Item ( group ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDimension Item . Category Item Ġ-> ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Store . select By Uid ( item . uid ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġcategory Ġ-> ĠMetadata Item . Category Item ( category ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Option Store . select By Uid ( item . category Option ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġcategory Option Ġ-> ĠMetadata Item . Category Option Item ( category Option ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ