2012-11-09 40 views
1

我在JavaScript中運行的複製篩選器速度太慢,而it was suggested我嘗試在erlang中重新編寫它。將couchdb複製過濾器從javascript轉換爲erlang

我已經設置了環境,並且能夠在蒲團「temp_view」對話框中成功執行簡單的erlang視圖,但是我沒有任何運氣將我的JavaScript函數翻譯成erlang。

任何人都可以建議如何最好在erlang重寫以下內容?任何幫助將不勝感激。

function(doc, req) { 
    if (doc.date && doc.user_id && (doc.user_id == req.query.userid) && (doc._id.indexOf(\"_design\") != 0)){ 
     var doc_month = "" + doc.date[1]; 
     if(doc_month.length == 1) { 
      doc_month = "0" + doc_month; 
     } 
     var doc_day = "" + doc.date[2]; 
     if(doc_day.length == 1) { 
      doc_day = "0" + doc_day; 
     } 
     var req_month = "" + req.query.month; 
     if(req_month.length == 1) { 
      req_month = "0" + req_month; 
     } 
     var req_day = "" + req.query.day; 
     if(req_day.length == 1) { 
      req_day = "0" + req_day; 
     } 
     var doc_datestring = doc.date[0] + "-" + doc_month + "-" + doc_day; 
     var req_datestring = req.query.year + "-" + req_month + "-" + req_day; 

     return (doc_datestring >= req_datestring); 
    } else { 
     return false; 
    } 
} 

回答

1

我剛剛寫完了一些我認爲與你的javascript函數類似的東西。我在文檔中有一個月和一個月的字段 - 都表示爲整數。

這是我結束了:

 

{ 
    "_id": "_design/fast_segmenting", 
    "language": "erlang", 
    "filters": { 
     "by_year_month": "... see below for erlang function ..." 
    } 
} 

 

類的醜陋,所以這裏是Erlang的過濾功能以更好的格式:

 

fun({Doc}, {Req}) -> 
    {Query} = proplists:get_value((<<\"query\">>, Req), 
    Month = list_to_integer(binary_to_list(proplists:get_value((<<\"month\">>, Query))), 
    Year = list_to_integer(binary_to_list(proplists:get_value((<<\"year\">>, Query))), 

    case {proplists:get_value((<<\"pubMonth\">>, Doc), proplists:get_value((<<\"pubYear\">>, Doc)} of 
     {Month, Year} -> true; 
     _ -> false 
    end 
end. 
 

最好玩的是發現,該值在Query對象中是Erlang中的二進制文件,這就是爲什麼我們需要將它們轉換爲整數。