erlang pb客户端中密钥过滤器的问题

时间:2011-07-24 20:07:49

标签: erlang riak

UPDATE2 我找到了解决方案(thx to rvirding)。我必须把像这样的对象

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的错误。仍然对此感到困惑。(

更新

如果我写这个

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

我没有错误,我甚至得到了“ok”结果,但它是空的,这不是预期的行为。)

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

我完全忘记了这一点,但我必须完成它。

我有一个简单的应用程序:它从txt文件中提取数据(像“timestamp value”这样的数据),将其推送到Riak并进行一些范围查询。 问题是,当我进行密钥过滤查询时,我得到{error,disconnected}。 我用这种方式在riak中编写数据:key - timestamp(如0.43),value - value(如1.14),bucket - 添加数据的时间(如“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,

谢谢。

1 个答案:

答案 0 :(得分:2)

riak的存储桶和密钥应该是二进制文件,这就是没有错误的原因。您没有找到任何东西意味着桶/密钥错误。数据添加到数据库时是如何创建的?确保你以完全相同的方式做到这一点!在我使用的应用中,他们为term_to_binary(Key)做了价值,但可以通过您选择的任何方式完成。