Sent from my iPhone

On Apr 26, 2009, at 2:26 PM, Wout Mertens <[email protected]> wrote:

Hi Adam,

On Apr 22, 2009, at 4:48 PM, Adam Kocoloski wrote:

Hi Wout, thanks for writing this up.

One comment about the map-only views: I think you'll find that Couch has already done a good bit of the work needed to support them, too. Couch maintains a btree for each design doc keyed on docid that stores all the view keys emitted by the maps over each document. When a document is updated and then analyzed, Couch has to consult that btree, purge all the KVs associated with the old version of the doc from each view, and then insert the new KVs. So the tracking information correlating docids and view keys is already available.

See I did not know that :-) Although I should have guessed.

However, in the mail before this one I argued that it doesn't make sense to combine or chain map-only views since you can always write a map function that does it in one step. Do you agree?

You might also know the answer to this: is it possible to make the Review DB be a sort of view index on the current database? All it needs are JSON keys and values, no other fields.

You'd still be left with the problem of generating unique docids for the documents in the Review DB, but I think that's a problem that needs to be solved. The restriction to only MR views with no duplicate keys across views seems too strong to me.

Well, since the Review DB is a local(*) hidden database that's handled a bit specially, I think the easiest is to assign _id a sequence number and create a default view that indexes the documents by doc.key (for updating the value for that key). There will never be contention and we're only interested in the key index.

We discussed this a little at CouchHack and I argued that the simplest solution is actually good for a few reasons.

The simple solution: provide a mechanism to copy the rows of a grouped reduce function to a new database.

Good because it is most like Hadoop/Google style map reduce. In that paradigm, the output of a map/reduce job is not incremental, and it is persisted in a way that allows for multiple later reduce stages to be run on it. It's common in Hadoop to chain many m/r stages, and to try a few iterations of each stage while developing code.

I like this also because it provides the needed functionality without adding any new primitives to CouchDB.

The only downside of this approach is that it is not incremental. I'm not sure that incremental chainability has much promise, as the index management could be a pain, especially if you have branching chains.

Another upside is that by reducing to a db, you give the user power to do things like use replication to merge multiple data sets before applying more views.

I don't want to discourage anyone from experimenting with code, just want to point out this simple solution which would be Very Easy to implement.



(*)local: I'm assuming that views are not replicated and need to be recalculated for each CouchDB node. If they are replicated somehow, I think it would still work but we'd have to look at it a little more.

With that said, I'd prefer to spend my time extending the view engine to handle chainable MR workflows in a single shot. Especially in the simple sort_by_value case it just seems like a cleaner way to go about things.

Yes, that seems to be the gist of all repliers and I agree :-)

In a nutshell, I'm hoping that:
* A review is a new sort of view that has an "inputs" array in its definition.
* Only MR views are allowed as inputs, no KV duplication allowed.
* It builds a persistent index of the incoming views when those get updated. * That index is then used to build the view index for the review when the review gets updated. * I think I covered the most important algorithms needed to implement this in my original proposal.

Does this sound feasible? If so I'll update my proposal accordingly.

Wout.

Reply via email to