package Ġdev . cap y bar al abs . d 4 j . store . redis . repository Ċ Ċ import Ġdev . cap y bar al abs . d 4 j . store . redis . Redis Factory Ċ import Ġorg . springframework . data . domain . Range Ċ import Ġorg . springframework . data . redis . core . Z Set Operations Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono ĊĊ Ċ fun Ġtwo Way Index ( key : ĠString , Ġfactory : ĠRedis Factory ): ĠTwo Way Index < Long > Ġ{ Ċ ĉ return Ġtwo Way Index ( key , Ġfactory , ĠLong :: class . java ) Ċ } Ċ Ċ fun Ġ< V > Ġtwo Way Index ( key : ĠString , Ġfactory : ĠRedis Factory , Ġvalue Class : ĠClass < V >): ĠTwo Way Index < V > Ġ{ Ċ ĉ return ĠTwo Way Index ( key , Ġfactory , Ġvalue Class ) Ċ } Ċ Ċ /** Ċ Ġ* ĠSecondary ĠRedis Ġindex Ġimplementation . Ċ Ġ* Ċ Ġ* ĠTwo - way Ġindex : ĠUses Ġa ĠZ set , Ġbecause Ġsh ards Ġids Ġare Ġintegers Ġwhich ĠCAN Ġbe Ġused Ġas Ġa Ġscore . Ċ Ġ* Ċ Ġ* ĠUse Ġ[ One Way Index ] Ġto Ġbuild Ġsnow fl akes - to - snow fl akes Ġindices . Ċ Ġ*/ Ċ class ĠTwo Way Index < V >( private Ġval Ġkey : ĠString , Ġfactory : ĠRedis Factory , Ġvalue Class : ĠClass < V >) Ġ{ ĊĊ ĉ private Ġval Ġz set Ops Ġ= Ġfactory . create Redis Z Set Operations ( String :: class . java , Ġvalue Class ) ĊĊĊ ĉ fun Ġadd Elements ( groupId : ĠInt , Ġelements : ĠCollection < V >): ĠMono < Long > Ġ{ Ċĉ ĉ if Ġ( elements . isEmpty ()) Ġ{ Ċĉĉ ĉ return ĠMono . empty () Ċĉ ĉ } Ċĉ ĉ val Ġtuples Ġ= Ġelements . map Ġ{ ĠZ Set Operations . Typed Tuple . of ( it , ĠgroupId . toDouble ()) Ġ} Ċĉ ĉ return Ġz set Ops . addAll ( key , Ġtuples ) Ċ ĉ } ĊĊ ĉ fun Ġremove Elements ( var arg Ġelements : ĠV ): ĠMono < Long > Ġ{ Ċĉ ĉ if Ġ( elements . isEmpty ()) Ġ{ Ċĉĉ ĉ return ĠMono . empty () Ċĉ ĉ } Ċĉ ĉ return Ġz set Ops . remove ( key , Ġ* elements ) Ċ ĉ } ĊĊ ĉ fun Ġget Elements By Group ( groupId : ĠInt ): ĠFlux < V > Ġ{ Ċĉ ĉ return Ġz set Ops . range By Score ( key , ĠRange . just ( groupId . toDouble ())) Ċ ĉ } ĊĊ ĉ fun Ġget Elements NotIn Group ( groupId : ĠInt ): ĠFlux < V > Ġ{ Ċĉ ĉ val Ġexclusive Shard Index Ġ= ĠRange . Bound . exclusive ( groupId . toDouble ()) Ċĉ ĉ val Ġleft Un bounded Ġ= ĠRange . left Un bounded ( exclusive Shard Index ) Ċĉ ĉ val Ġright Un bounded Ġ= ĠRange . right Un bounded ( exclusive Shard Index ) ĊĊĉ ĉ val Ġleft Ġ= Ġz set Ops . range By Score ( key , Ġleft Un bounded ) Ċĉ ĉ val Ġright Ġ= Ġz set Ops . range By Score ( key , Ġright Un bounded ) ĊĊĉ ĉ return Ġleft . concat With ( right ) Ċ ĉ } ĊĊ ĉ fun Ġdelete By GroupId ( groupId : ĠInt ): ĠMono < Long > Ġ{ Ċĉ ĉ return Ġz set Ops . remove Range By Score ( key , ĠRange . just ( groupId . toDouble ())) Ċ ĉ } Ċ } Ċ