2011-07-23 10 views
5

Potrzebuję pomocy w tłumaczeniu następujących widoków CouchDB z javascript na erlang. Potrzebuję ich w erlangu, ponieważ w javascriptie widok wykorzystuje całą dostępną pamięć stosu i zawiesza couchjs (zobacz ten raport błędu https://issues.apache.org/jira/browse/COUCHDB-893).Przekłada widoki javascript CouchDB na erlang

Bieżące funkcje map mam w JavaScript są:

sync/transaction_keys

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

i sync/transcation

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

Przykładowy dokument będzie:

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

Zasadniczo sync/transaction_keys emituje wszystkie klucze słownika transakcji, a synchronizacja/transakcja powoduje emisję wszystkich wpisów w słowniku transakcji.

Niestety, nigdy wcześniej nie używałem Erlanga i muszę przepisać ten kod wkrótce, więc każda pomoc jest bardzo mile widziana.

Z góry dziękuję.

+0

Ile transakcji posiadasz w większych dokumentach? To * powinno * być w porządku, chociaż uniknęłoby to zmiennych globalnych (nie sądzę, że * tak naprawdę * ma znaczenie w tym przypadku). – Dustin

+0

około 594 transakcji/dokumentu. Ale ciągle rośnie, ponieważ co 15 minut zostanie dodana kolejna transakcja. – Simon

+0

Być może lepiej byłoby reprezentować te transakcje jako nowe dokumenty. Czy jest jakiś powód, aby tego nie robić? Wygląda na to, że łatwiej będzie to modelować w ten sposób. – Dustin

Odpowiedz

10

Po prostu zrobiłem drugi (ten bardziej skomplikowany). Pierwszy z nich można łatwo ekstrapolować:

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, dziękuję bardzo! – Simon