It seems that Riak Datatype API does not allow to distinguish between non-existing keys and default values. For example, if I query for non-existing key as follows:
val fetchOp = new FetchCounter.Builder(key).build()
val c = client.execute(fetchOp).getDatatype
I'll get a counter that holds 0. Now, if I put counter with value 0 at this key and run the query, I get the same result. Is there any way to distinguish between these two different states?
Note: when working with sets there is a context that I can check. If I fetch a set and the context is null, it means that the set does not exist under this key. This trick does not work for counters though, as they do not maintain context.
Update: Dmitri's suggestion below leads to the following solution:
val fetchOp = new FetchValue.Builder(location).withOption(FetchValue.Option.HEAD, java.lang.Boolean.TRUE).build()
val res = client.execute(fetchOp) // res.isNotFound should equal(true)
However, the downside is that now I need to make an additional query.