我在JavaScript中有一个运行速度太慢的复制过滤器,而我尝试在erlang中重写它的it was suggested。
我已经设置了环境,并且能够在蒲团“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;
}
}
答案 0 :(得分: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中的二进制文件,这就是我们需要将它们转换为整数的原因。