package Ġch . der lin . bb data . common . cassandra čĊč Ċ import Ġch . der lin . bb data . Profiles č Ċ import Ġorg . joda . time . DateTime č Ċ import Ġorg . joda . time . Year Month č Ċ import Ġorg . springframework . context . annotation . Profile č Ċ import Ġorg . springframework . data . cassandra . repository . C assandra Repository č Ċ import Ġorg . springframework . data . cassandra . repository . Query č Ċ import Ġorg . springframework . stereotype . Repository čĊč Ċ /** čĊ Ġ* Ġdate : Ġ 2 7 . 0 1 . 2 0 čĊ Ġ* Ġ@ author ĠLuc y ĠL inder Ġ< luc y . der lin @ gmail . com > čĊ Ġ*/ čĊč Ċ @ Repository č Ċ interface ĠRaw Value Repository Ġ: ĠCassandra Repository < Raw Value , ĠRaw Value PK > Ġ{ čĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġraw _ values ĠWHERE Ġobject _ id Ġ= Ġ: objectId ĠAND Ġmonth ĠIN Ġ: months Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AND Ġtimestamp Ġ>= Ġ: d from ĠAND Ġtimestamp Ġ<= Ġ: dto ") čĊĠĠĠ Ġfun ĠfindBy Timestamp Between ( objectId : ĠInt , Ġmonths : ĠList < String >, Ġd from : ĠDateTime , Ġdto : ĠDateTime ): ĠIterable < Raw Value > čĊčĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġraw _ values ĠWHERE Ġobject _ id Ġ= Ġ: objectId ĠAND Ġmonth Ġ= Ġ: month Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AND Ġtimestamp Ġ<= Ġ: before ĠORDER ĠBY Ġtimestamp ĠDESC Ġlimit Ġ 1 ") čĊĠĠĠ Ġfun Ġget Latest ( objectId : ĠInt , Ġmonth : ĠString , Ġbefore : ĠDateTime ): ĠRaw Value ? č Ċ } čĊčĊč Ċ @ Repository č Ċ interface ĠAg greg ations Repository Ġ: ĠCassandra Repository < Aggregation , ĠAg gregation PK > Ġ{ čĊĠĠĠ Ġ@ Query (" SELECT Ġ* ĠFROM Ġaggreg ations ĠWHERE Ġminutes Ġ= Ġ: minutes ĠAND Ġobject _ id Ġ= Ġ: objectId ĠAND Ġdate ĠIN Ġ: months Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AND Ġtimestamp Ġ>= Ġ: d from ĠAND Ġtimestamp Ġ<= Ġ: dto ") čĊĠĠĠ Ġfun ĠfindBy Timestamp Between ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġminutes : ĠInt , Ġobject Id : ĠInt , Ġmonths : ĠList < String >, Ġd from : ĠDateTime , Ġdto : ĠDateTime ): ĠIterable < Aggregation > č Ċ } čĊč Ċ @ Profile ( Profiles . C ASS AND RA _ STATS ) č Ċ @ Repository č Ċ interface ĠObject Stats Repository Ġ: ĠCassandra Repository < Object Stats , ĠInt > Ġ{ čĊčĊĠĠĠ Ġ@ Query (" UPDATE Ġobjects _ stats ĠSET Ġlast _ ts Ġ= Ġ: last Timestamp , Ġavg _ sample _ period Ġ= Ġ: avg Sample Period ĠWHERE Ġobject _ id Ġ= Ġ: objectId ") čĊĠĠĠ Ġfun Ġupdate ( objectId : ĠInt , Ġavg Sample Period : ĠFloat , Ġlast Timestamp : ĠDateTime ) č Ċ } čĊč Ċ @ Profile ( Profiles . C ASS AND RA _ STATS ) č Ċ @ Repository č Ċ interface ĠObject Stats Counter Repository Ġ: ĠCassandra Repository < Object Stats Counter , ĠInt > Ġ{ čĊčĊĠĠĠ Ġ@ Query (" UPDATE Ġobjects _ stats _ counter ĠSET Ġn _ values Ġ= Ġn _ values Ġ+ Ġ 1 ĠWHERE Ġobject _ id Ġ= Ġ: objectId ") čĊĠĠĠ Ġfun Ġupdate Write Counter ( objectId : ĠInt ) čĊčĊĠĠĠ Ġ@ Query (" UPDATE Ġobjects _ stats _ counter ĠSET Ġn _ reads Ġ= Ġn _ reads Ġ+ Ġ 1 ĠWHERE Ġobject _ id Ġ= Ġ: objectId ") čĊĠĠĠ Ġfun Ġupdate Read Counter ( objectId : ĠInt ) č Ċ } čĊčĊč Ċ fun ĠRaw Value Repository . find Latest Value ( objectId : ĠLong , Ġfrom : ĠDateTime , Ġto : ĠDateTime ): ĠRaw Value ? Ġ{ čĊĠĠĠ Ġ// Ġdo Ġthe Ġsearch , Ġone Ġmonth Ġat Ġa Ġtime , Ġstop Ġwhen Ġone Ġis Ġfound čĊĠĠĠ Ġval Ġsearch Months Ġ= ĠCassandra Utils . months Between ( Year Month ( from ), ĠYear Month ( to )) čĊĠĠĠ Ġreturn Ġsearch Months . as Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġthis . get Latest ( objectId . toInt (), Ġit , Ġto ) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit Ġ== Ġnull Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () č Ċ }