package Ġcom . ath ert on . up next . data . repository Ċ Ċ import Ġcom . ath ert on . up next . data . db . dao . SearchResult Dao Ċ import Ġcom . ath ert on . up next . data . db . model . search . Room SearchResult Ċ import Ġcom . ath ert on . up next . data . db . model . search . Room Search Term Ċ import Ġcom . ath ert on . up next . data . mapper . to Domain L ce Response Ċ import Ġcom . ath ert on . up next . data . mapper . to Domain Search ables Ċ import Ġcom . ath ert on . up next . data . mapper . to Room SearchResults Ċ import Ġcom . ath ert on . up next . data . network . model . Network Response Ċ import Ġcom . ath ert on . up next . data . network . model . T mdb Multi SearchResult Ċ import Ġcom . ath ert on . up next . data . network . service . T mdb Search Service Ċ import Ġcom . ath ert on . up next . domain . model . L ce Response Ċ import Ġcom . ath ert on . up next . domain . model . Search able Ċ import Ġcom . ath ert on . up next . domain . repository . Search Repository Ċ import Ġio . reactivex . Observable Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠC aching Search Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġsearch Result Dao : ĠSearch Result Dao , ĊĠĠĠ Ġprivate Ġval Ġsearch Service : ĠT mdb Search Service Ċ ) Ġ: ĠSearch Repository Ġ{ ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ 1 ) ĠS aves Ġsearch Ġterm Ġinto Ġdatabase ĊĠĠĠĠ Ġ* Ġ 2 ) ĠF etches Ġthe Ġsearch Ġresults Ġfrom Ġthe Ġnetwork ĊĠĠĠĠ Ġ* Ġ 3 ) ĠStores Ġsearch Ġterm Ġin Ġdatabase ĊĠĠĠĠ Ġ* Ġ 4 ) ĠStores Ġsearch Ġresults Ġin Ġdatabase ĊĠĠĠĠ Ġ* Ġ 5 ) ĠStores Ġsearch Ġresults Ġ' known Ġfor ' Ġin Ġdatabase ĊĠĠĠĠ Ġ* Ġ 6 ) ĠStores Ġsearch Ġterm Ġand Ġresults Ġjoin Ġid 's Ġin Ġdatabase ĊĠĠĠĠ Ġ* Ġ 6 ) ĠRetrieves Ġsearch Ġresults Ġfrom Ġdatabase Ġ( db Ġis Ġsource Ġof Ġtruth ) Ġand Ġmaps Ġthen Ġto Ġdomain Ġobjects ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsearch Multi ( query : ĠString ): ĠObservable < L ce Response < List < Search able >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Service . search Multi ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġnetwork Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Response Ġis ĠNetwork Response . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork SearchResults : ĠList < T mdb Multi SearchResult > Ġ= Ġnetwork Response . body . results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Dao . insert SearchResults ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= ĠRoom Search Term ( search Term Ġ= Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results Ġ= Ġnetwork SearchResults . to Room SearchResults () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnetwork Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Results : ĠList < Room SearchResult > Ġ= Ġsearch Result Dao . get SearchResults For Search Term ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Results : ĠList < Search able > Ġ= Ġdb Results . to Domain Search ables () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Response . to Domain L ce Response ( data Ġ= Ġdomain Results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ