/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠPe tr ĠLang r Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . good data . example . services . impl Ċ Ċ import Ġcom . good data . example . data . Sentence Ċ import Ġcom . good data . example . data . Word Ċ import Ġcom . good data . example . data . Word Category Ċ import Ġcom . good data . example . message . Sentence Aggregate Msg Ċ import Ġcom . good data . example . message . Sentence Msg Ċ import Ġcom . good data . example . repository . Sentence Repository Ċ import Ġcom . good data . example . repository . Word Repository Ċ import Ġcom . good data . example . services . Sentence Service Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . data . domain . Page Request Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġjava . util . function . Function Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author Ġpe tr . lang r Ċ Ġ* Ġ@ since Ġ 1 . 0 . 0 Ċ Ġ*/ Ċ @ Service Ċ class ĠSentence ServiceImpl Ġ@ Autowired Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsentence Repository : ĠSentence Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġword Repository : ĠWord Repository Ċ ) Ġ: ĠSentence Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġrandom Ġ= ĠRandom ( 0 ) ĊĊĠĠĠ Ġoverride Ġfun ĠfindAll (): ĠFlux < Sentence Msg > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsentence Repository . findAll (). map Ġ{ Ġs Ġ-> ĠSentence Msg . of ( s ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind ById ( id : ĠString ): ĠMono < Sentence Msg > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġview Sentence ( id ). map Ġ{ Ġs Ġ-> ĠSentence Msg . of ( s ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind ById Y oda Talk ( id : ĠString ): ĠMono < Sentence Msg > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġview Sentence ( id ). map Ġ{ Ġs Ġ-> ĠSentence Msg . y oda ( s ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Sentence (): ĠMono < Sentence Msg > Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Remove Explicit Type Arguments ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFlux . combine Latest < Word , ĠSentence >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Ġ{ Ġwords Ġ-> ĠSentence ( null , Ġwords . map To Typed Array Ġ{ Ġit Ġas ĠWord Ġ}) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Word By Category ( Word Category . NOUN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Word By Category ( Word Category . VERB ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Word By Category ( Word Category . AD JECT IVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġs Ġ-> Ġsentence Repository . insert ( s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġs Ġ-> ĠSentence Msg . of ( s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindBy Words (): ĠFlux < Sentence Aggregate Msg > Ġ= Ġsentence Repository . findBy Words () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠSentence Aggregate Msg . of ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġview Sentence ( id : ĠString ): ĠMono < Sentence > Ġ= ĊĠĠĠĠĠĠĠ Ġsentence Repository . findById ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġs Ġ-> ĠSentence ( s . id , Ġs . words , Ġs . views Ġ+ Ġ 1 , Ġs . created ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġconsider ĠonComplete Ġor Ġother Ġto Ġavoid Ġincrement Ġof Ġfailures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġs Ġ-> Ġsentence Repository . save ( s ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Word By Category ( category : ĠWord Category ): ĠMono < Word > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġword Repository . count By Category ( category ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ> Ġ 0 L Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty ( Mono . error Ġ{ ĠIllegalStateException (" No Ġword Ġfor Ġ'$ category ' Ġcategory ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Repository . findFirst By Category ( category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage Request . of ( random . nextInt ( c . toInt ()), Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T , Ġre ified ĠR > ĠArray < T >. map To Typed Array ( transform : Ġ( T ) Ġ-> ĠR ): ĠArray < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRandom Access Ġ-> ĠArray ( size ) Ġ{ Ġindex Ġ-> Ġtransform ( this [ index ]) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwith ( iterator ()) Ġ{ ĠArray ( size ) Ġ{ Ġtransform ( next ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }