2011-07-24 29 views
0

UPDATE2 我找到了解決方案(thx to rvirding)。我必須把對象這樣erlang pb客戶端鍵過濾器問題

Object = riakc_obj:new(list_to_binary(Bucket), 
         list_to_binary(Time), 
         list_to_binary(TimeValue)), 
ok = riakc_pb_socket:put(Db_pid, Object); 

而作出這樣

Query = [{map,             %query type 
      {modfun, riak_kv_mapreduce, map_object_value},   %function from riak erlang built-in module 
      none, true}], 
    Inputs = {Bucket, [[<<"between">>, <<"0">>, <<"0.05">>]]}, 
    Result = riakc_pb_socket:mapred(Pid, Inputs, Query), 

我認爲它應該在文檔提到的請求。

順便說一句!如果我寫了

Object = riakc_obj:new(<<Bucket>>, 
       <<Time>>, 
       <<TimeValue>>), 

我得到了有關badarg的錯誤。仍然感到困惑這個問題。(

UPDATE

如果我寫這篇文章

Inputs = {Bucket, [[<<"between">>, 0, 1]]} 

我沒有錯誤,我甚至有「OK」的結果,但它是空的,這是不期望行爲)。

=========================================== ====================

我完全失去了我的想法,但我必須完成它。

我有一個簡單的應用程序:它從txt文件(數據如「時間戳值」)中提取數據,將其推送到Riak並進行一些範圍查詢。 問題是,當我做關鍵過濾器查詢我得到{錯誤,斷開}。 我以這種方式在riak中查找數據:key - timestamp(如0.43),value-value(如1.14),bucket-time數據添加(如「2011-07-24-23-39-45」)。 這裏的請求的代碼:

(dca_db.erl)

handle_call({range_query, Bucket, From, To}, _, #state{db_pid = Pid} = State) -> 
    Query = [{map,             %query type 
      {modfun, riak_kv_mapreduce, map_object_value},   %function from riak erlang built-in module 
      none, true}], 
    Inputs = {Bucket, [["between", 0, 1]]}, 
    Result = riakc_pb_socket:mapred(Pid, Inputs, Query), 
    {reply, Result, State}; 

(測試/ dca_db_tests.erl)

range_request(Pid) -> 
Bucket = <<"2011-07-24-23-39-45">>, 
Result = gen_server:call(Pid, {range_query, Bucket, 0, 1}), 
error_logger:info_msg("RESULT:~p~n",[Result]). 

你可以找到我的代碼在github上 - https://github.com/DimitryDushkin/distributed_calc_riak_matlab

如果我使用類似(在dca_db.erl中)

Inputs = {Bucket, [["eq", 1]]}, 

我有另一個錯誤

Compiled src/dca_db.erl 
undefined 
*unexpected termination of test process* 
::{{badmatch,{<<"2011-07-24-23-39-45">>,[["eq",1]]}}, 
    [{dca_db,handle_call,3}, 
    {gen_server,handle_msg,5}, 
    {proc_lib,init_p_do_apply,3}]} 


=ERROR REPORT==== 25-Jul-2011::00:27:24 === 
** Generic server dca_db terminating 
** Last message in was {range_query,<<"2011-07-24-23-39-45">>,0,1} 
** When Server state == {state,<0.105.0>} 
** Reason for termination == 
** {{badmatch,{<<"2011-07-24-23-39-45">>,[["eq",1]]}}, 
    [{dca_db,handle_call,3}, 
    {gen_server,handle_msg,5}, 
    {proc_lib,init_p_do_apply,3}]} 
======================================================= 
    Failed: 0. Skipped: 0. Passed: 1. 
One or more tests were cancelled. 
Cover analysis: /Users/ddushkin/Documents/workspaces/eclipse/distributed_calc_riak_matlab/.eunit/index.html 
ERROR: One or more eunit tests failed. 
make: *** [test_db] Error 1 

如果我不使用過濾器一切正常:

Inputs = Bucket, 

謝謝。

回答

2

桶和鑰匙riak應該是二進制文件,這就是爲什麼你沒有錯誤。你沒有發現任何東西意味着桶/鍵是錯誤的。數據添加到數據庫時他們是如何創建的?確保你以完全相同的方式做到這一點!在我與他們合作的應用中,他們的價值是term_to_binary(Key),但它可以以您選擇的任何方式完成。

+0

omg,你是tottaly rigth! – Dimitry