Skip to content
This repository has been archived by the owner on Dec 7, 2019. It is now read-only.

Shared disk cache #285

Open
fabioCollini opened this issue Nov 7, 2017 · 1 comment
Open

Shared disk cache #285

fabioCollini opened this issue Nov 7, 2017 · 1 comment

Comments

@fabioCollini
Copy link
Contributor

I am using many stores with a disk cache, usually I define the PathResolver as a toString of the parameters. Using this pathResolver there is an error when two stores use the same input parameter. This case can happen, for example in my app I have a store to retrieve the weather condition and another to retrieve the forecast, both stores have the city as input.
The problem can be reproduced using this Activity:

data class Weather(val weather: String)

data class Forecast(val forecast: String)

class StoreTestActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val weatherStore = StoreBuilder.parsedWithKey<String, BufferedSource, Weather>()
                .fetcher { Single.just(Buffer().writeUtf8("""{"weather":"abc"}""")) }
                .persister(FileSystemPersister.create(FileSystemFactory.create(filesDir), { it }))
                .parser(GsonParserFactory.createSourceParser(Gson(), Weather::class.java))
                .open()

        val forecastStore = StoreBuilder.parsedWithKey<String, BufferedSource, Forecast>()
                .fetcher { Single.just(Buffer().writeUtf8("""{"forecast":"def"}""")) }
                .persister(FileSystemPersister.create(FileSystemFactory.create(filesDir), { it }))
                .parser(GsonParserFactory.createSourceParser(Gson(), Forecast::class.java))
                .open()

        val textView = TextView(this)
        setContentView(textView)

        weatherStore.get("myCity")
                .flatMap { weather -> forecastStore.get("myCity").map { forecast -> weather to forecast } }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    textView.text = it.toString()
                }, {
                    it.printStackTrace()
                })
    }
}

Unfortunately I don't get an error but the forecast fields are null (even if are defined as not nullable in the Kotlin class!):

(Weather(weather=abc), Forecast(forecast=null))

The problem can be fixed easily using a prefix in the string returned by PathResolver.

@ramonaharrison
Copy link
Contributor

Another option here could be to use different flatDir for each different Store. Or, as you proposed, it could be nice to add a newPathResolver subclass that uses the Store name as a prefix (or containing directory, similar to how BarCodeReadAllPathResolver works). Feel free to submit a PR if this is something you're interested in.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants