2011-07-23 69 views
5

我需要一些幫助,將以下CouchDB視圖從javascript轉換爲erlang。我需要他們在erlang中,因爲在JavaScript中,視圖使用了所有可用的堆棧內存並崩潰了couchjs(請參閱此bugreport https://issues.apache.org/jira/browse/COUCHDB-893)。將CouchDB javascript視圖轉換爲erlang

當前地圖功能我有在JavaScript是:

同步/ transaction_keys

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

同步/ transcation

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,我需要很快重寫該代碼,所以任何幫助都非常受歡迎。

在此先感謝。

+0

您在較大的文檔中進行了多少交易?這*應該是好的,雖然我會避免全局變量(我認爲*真的不重要在這種情況下)。 – Dustin

+0

約594個交易/文件。但它不斷增長,因爲每增加15分鐘另一筆交易。 – Simon

+0

也許你最好將這些交易記錄爲新文件。有沒有理由不這樣做?看來這樣模擬會更容易。 – Dustin

回答

10

我剛剛做了你的第二個(更復雜的)。第一個可以很容易從那裏推斷出:

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. 
+0

Wohoo,非常感謝! – Simon