将CouchDB的JavaScript视图转换为Erlang

9

我需要帮助将以下CouchDB视图从JavaScript翻译成Erlang。我需要它们用Erlang编写,因为在JavaScript中,该视图使用了所有可用的堆栈内存并导致couchjs崩溃(请参见此错误报告 https://issues.apache.org/jira/browse/COUCHDB-893)。

我目前在JavaScript中拥有的映射函数如下:

sync/transaction_keys

function(doc) {
  if(doc.doc_type == "Device") {
      for(key in doc.transactions)
          emit(key, null);
  }
}

同步/事务

function(doc) {
  if(doc.doc_type == "Device") {
      for(key in doc.transactions) {
          t = doc.transactions[key];
          t.device = doc.device;
          emit(key, t);
     }
  }
}

一个示例文档可能是:
{
   "_id": "fcef7b5c-cbe6-31af-8363-2b446a7e4cf2",
   "_rev": "3-c90abd075404a75744fd3e5e4f04ebad",
   "device": "fcef7b5c-cbe6-31af-8363-2b446a7e4cf2",
   "doc_type": "Device",
   "transactions": {
       "79fe8630-c0c0-30c6-9913-79b2f93e3e6e": {
           "timestamp": 1309489169533,
           "version": 10008,
           "some_more_data" : "more_data"
       }
       "e4678930-c465-76a6-8821-75a3e888765a": {
           "timestamp": 1309489169533,
           "version": 10008,
           "some_more_data" : "more_data"
       }
   }
}

基本上,sync/transaction_keys会发出事务字典中的所有键,而sync/transaction会发出事务字典中的所有条目。

不幸的是,我以前从未使用过Erlang,我需要很快重写该代码,因此任何帮助都非常受欢迎。

提前致谢。


你的大型文档中有多少个交易?虽然我认为这在这种情况下并不重要,但最好避免使用全局变量。 - Dustin
大约有594个交易/文档。但它不断增长,因为每15分钟会添加另一个交易。 - Simon
也许将这些交易表示为新文档会更好。有没有不这样做的原因?这样建模似乎更容易。 - Dustin
是的,那是我之前做的,但被告知要更改为一个文档/设备。 - Simon
1个回答

15
我刚刚完成了你的第二个问题(更为复杂的那一个)。第一个问题可以从中轻松推导出来。
fun({Doc}) ->
        %% Helper function to get a toplevel value from this doc.
        F = fun(B) -> proplists:get_value(B, Doc) end,
        %% switch on doc type
        case F(<<"doc_type">>) of
            <<"Device">> ->
                %% Grab the transactions from this document
                {Txns} = F(<<"transactions">>),
                lists:foreach(fun({K,V}) ->
                                      %% Emit the key and the value as
                                      %% the transaction + the device
                                      %% id
                                      {T} = proplists:get_value(K, Txns),
                                      Emit(K, {[{<<"device">>, F(<<"device">>)} | T]})
                              end,
                             Txns);
            _ -> false %% Not a device -- ignoring this document
        end
end.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接