2015-08-06 4 views
1

Кажется, что API-интерфейс Riak Datatype API не позволяет различать несуществующие ключи и значения по умолчанию. Например, если я запросить несуществующий ключ следующим образом:Riak Dataypes: значения по умолчанию или несуществующие ключи

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"} 

Там обходной путь вы можете сделать с существующим кли однако.

Вы можете создать обычную операцию Fetch Object (предпочтительно установить для параметра «Только HEAD» значение true) для этого счетчика. Счетчик Riak (или любой другой тип данных) по-прежнему существует как обычный объект, и вы можете выдать ему HEAD-запрос (в отличие от счетчика Fetch), и он вернет 404, как ожидалось.

+0

Спасибо, Дмитрий! Не могли бы вы также прокомментировать, подходит ли трюк с нулевым контекстом для набора? Он чувствует себя взломанным. – Tim

+0

Конечно, позвольте мне проверить это. –

 Смежные вопросы

  • Нет связанных вопросов^_^