The discussion of alternative approaches to view engines is one that
bubbles up semi regularly, with the latest addition for a Lua native query
server described in COUCHDB-1842 by Alexander. Lua is a great language for
embedding into systems and provides powerful sandboxing facilities.

I'm very intrigued by optimizing for the standard use case, where a user
wants to build a simple secondary index on their data, and then use a built
in reduce function. I think we can find a solution that allows a user to
define a doc level transformation in a DSL or query language or some other
approach that allows us to keep the view generation functionality within
the Erlang VM and avoid the overhead costs of using an external engine.

I do think it makes sense to have an external engine for flexibility, and
allowing us to focus on the simple cases while providing a fallback for
more complex user defined functions.

To experiment with different approaches, I built a Lisp interpreter on top
of Erlang with the premise of white listing the entire language, allowing
explicit control over what the user can and cannot do in view functions.
You can see it here: [Lispenport](https://github.com/chewbranca/lispenport).
It's by no means a full solution, but it has some interesting properties
such as really just being syntactic sugar on top of Erlang and all
constructs are direct Erlang terms, even lambdas are just Erlang funs.

Now, while I would be intrigued by a Lisp DSL for user defined functions in
CouchDB, I didn't expect that to be well received by everyone, so I've
considered this just an experiment. If we were going to take this approach,
I would rather take Lisp Flavored Erlang (LFE, another project by Robert
Virding along with Luerl, and also erlog, a Prolog interpreter in Erlang),
and rip out all the pieces we would not want a user to access and use LFE
as a base starting point. LFE compiles down to intermediate Erlang bytecode
and is designed to follow Erlang functionality, making it a nice option for
building a view engine to execute in the Erlang VM.

I've also toyed around with the idea of building a NIF around [JQ](
http://stedolan.github.io/jq/) which is a great application for slicing and
dicing json data structures written in C.

So my general proposal for discussion is that we build a minimal DSL of
some sort, providing fast and simple doc manipulations that executes
securely in the Erlang VM, and then we abstract out all functionality for a
"full" view engine, list functions, show functions, etc to a separate
engine that is easily swappable and not required for standard functionality.

Thoughts?


-Russell

Reply via email to