On Thu, Feb 12, 2009 at 07:30:17AM +1030, Antony Blakey wrote:
>
> On 12/02/2009, at 7:27 AM, Antony Blakey wrote:
>
>> That guard could be an erlang function, defined in the design doc.
>
> And an obvious extension is to allow view functions to be written in
> erlang - no JSON conversion, no external.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I am working on an Erlang view server (EVS). It currently works
in a rudimentary fashion. I have been testing from Futon. I do
not think it is currently as flexible as the default javascript map
funs, though do not know all the map fun capabilities available with
the default.
The only CDB changes I have needed are to add the following two
functions to couch_query_servers.erl (valid as of CDB v740870)
before their respective existing funs.
The start_doc_map/2 fun is different only in that it provides EVS
Pid rather than using get_os_process(Lang). Because the EVS is
started as a daemon and not like main.js is started,
get_os_process(Lang) does not work as written.
The map_docs/2 fun is different in that no JSON <-> Erlang term()
conversion is done (not needed when talking Erlang <-> Erlang).
start_doc_map(<<"erlang">>, Functions) ->
Pid = erlang:whereis(erlview) , % need to parameterize erlview
% Pid is fed to map_docs
lists:foreach(fun(FunctionSource) ->
true = couch_os_process:prompt(Pid,
[<<"add_fun">>,
FunctionSource])
end, Functions),
{ok, {<<"erlang">>, Pid}}
;
% Pid comes from start_doc_map/2 (see call in couch_view_updater)
map_docs({<<"erlang">>, Pid}, Docs) ->
Results = lists:map( fun( Doc ) ->
couch_os_process:prompt(Pid, [<<"map_doc">>, Doc])
end,
Docs) ,
{ok, Results}
;
NOTE that the additional start_doc_map/2 fun can be eliminated if you
want to change get_os_process/1 to ...
get_os_process(Lang) ->
case Lang
of <<"erlang">> -> erlang:whereis(erlview) ;
_ -> gen_server:call(couch_query_servers,
{get_proc, Lang})
end
.
Also note that, obviously, the EVS name 'erlview' is hard-coded and
should be a local.ini parameter.
Above is a first-cut; possibly a message passing protocol to the
EVS would be faster though that would require more CDB hacking.
I'll post some code when it does a bit more than gurgle bubbles.
Please, if there is some activity to change CDB internals to
simplify a native Erlang view server or create a more direct
interface, let me know so I don't go too far down this road.
No sense replicating effort (only databases!).
~Michael
>
> Antony Blakey
> -------------
> CTO, Linkuistics Pty Ltd
> Ph: 0438 840 787
>
> One should respect public opinion insofar as is necessary to avoid
> starvation and keep out of prison, but anything that goes beyond this is
> voluntary submission to an unnecessary tyranny.
> -- Bertrand Russell
>
>
--
Michael McDaniel
Portland, Oregon, USA
http://trip.autosys.us
http://autosys.us