Riak Dataypes: значения по умолчанию против несуществующих ключей
Похоже, API Riak Datatype не позволяет различать несуществующие ключи и значения по умолчанию. Например, если я запрашиваю несуществующий ключ следующим образом:
val fetchOp = new FetchCounter.Builder(key).build()
val c = client.execute(fetchOp).getDatatype
Я получу счетчик, который содержит 0. Теперь, если я добавлю счетчик со значением 0 в этот ключ и выполню запрос, я получу тот же результат. Есть ли способ отличить эти два разных состояния?
Примечание: при работе с наборами есть контекст, который я могу проверить. Если я получаю набор и контекст имеет значение null, это означает, что набор не существует под этим ключом. Этот прием не работает для счетчиков, так как они не поддерживают контекст.
Обновление: предложение Дмитрия ниже приводит к следующему решению:
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)
Однако недостатком является то, что теперь мне нужно сделать дополнительный запрос.
1 ответ
Из того, что я понимаю, это ограничение конкретного клиента (кстати, что это за язык?). Не стесняйтесь, чтобы открыть вопрос на Github для него.
HTTP API, по крайней мере, различает несуществующий счетчик и счетчик, значение которого равно 0.
Например, вот результат попытки получить доступ к существующему ключу (со значением, установленным в 0):
$ curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/room-215 -v
> GET /types/counters/buckets/room_occupancy/datatypes/room-215 HTTP/1.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:38:56 GMT
< Content-Type: application/json
< Content-Length: 28
<
* Connection #0 to host localhost left intact
{"type":"counter","value":0}
И вот результат получения значения несуществующего ключа:
curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/non-existent-room -v
> GET /types/counters/buckets/room_occupancy/datatypes/non-existent-room HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8098
> Accept: */*
>
< HTTP/1.1 404 Object Not Found
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:32:51 GMT
< Content-Type: application/json
< Content-Length: 37
<
{"type":"counter","error":"notfound"}
Однако есть обходной путь, который вы можете сделать со своим существующим клиентом.
Для этого счетчика вы можете выполнить обычную операцию извлечения объекта (предпочтительно установив для параметра "HEAD only" значение true). Счетчик Riak (или любой другой тип данных) все еще существует как обычный объект, и вы можете отправить ему запрос HEAD (в отличие от счетчика выборок или чего-либо еще), и он вернет 404, как и ожидалось.