Default values vs non-existing keys for CRDTs

2015-08-19 Thread Timur Fayruzov
Hello,

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. Is it a valid trick to use though?

I posted this to StackOverflow a while ago, but no luck:
http://stackoverflow.com/questions/31845164/riak-dataypes-default-values-vs-non-existing-keys

Thanks,

Timur
___
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com


Re: Default values vs non-existing keys for CRDTs

2015-08-19 Thread Dmitri Zagidulin
>From what I understand, this is a limitation of that particular client
(what language is that, by the way?). Feel free to open an issue on Github
for it.

The HTTP API, at least, does distinguish between a non-existent counter and
a counter whose value happens to be 0.

For example, here's the result of trying to access an existing key (with a
value set to 0):

curl
http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/room-215
{"type":"counter","value":0}

And here's the result of retrieving the value of a non-existent key:

curl
http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/non-existent-room
{"type":"counter","error":"notfound"}

There's a workaround you can do with your existing client, however (until
the issue with the FetchCounter request gets fixed).

You can issue a regular Fetch Object operation (preferably setting the
'HEAD only' option to true) for that counter. A Riak counter (or any other
data type) still exists as a regular object, and you can issue a HEAD
request to it (as opposed to a Fetch Counter or whatever), and it'll return
a 404 as expected.

On Wed, Aug 19, 2015 at 8:59 PM, Timur Fayruzov 
wrote:

> Hello,
>
> 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. Is it a valid trick to use though?
>
> I posted this to StackOverflow a while ago, but no luck:
> http://stackoverflow.com/questions/31845164/riak-dataypes-default-values-vs-non-existing-keys
>
> Thanks,
>
> Timur
>
> ___
> riak-users mailing list
> riak-users@lists.basho.com
> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>
>
___
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com