couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Doug Reeder <reeder...@gmail.com>
Subject Re: Subselect Possible?
Date Tue, 28 Sep 2010 13:04:11 GMT
Sorry, my earlier response seems to have gone astray.

Thank you, but this map and reduce function produce exactly the same results as mine.

Is there a general method of structuring data and map-reduce functions to do the same thing
that a subselect does?


On Sep 26, 2010, at 8:16 PM, Paul Davis wrote:

> Hrm, I haven't thought this through to the end, but something that
> might get you started:
> 
> Change your emit to emit(key, 1);
> 
> Change your reduce to:
> 
> function(keys, vals) {
>    return sum(vals);
> }
> 
> Then query like such:
> 
> ?key=query_key&limit=1
> ?group_level=length(query_key)&key=query_key
> 
> It seems like there should be a fancy way to get the reduce call to
> tell you if the original node had < 0 work but I'm distracted by other
> code right now.
> 
> HTH,
> Paul Davis
> 
> On Sun, Sep 26, 2010 at 7:46 PM, Doug Reeder <reeder.29@gmail.com> wrote:
>> I've searched the wiki and googled for "subselect" and "subquery", and not found
anything relevelant.
>> 
>> I'm evaluating whether CouchDB can handle an app which currently stores a tree structure
in a relational database using the "materialized path" represenation.  For example, the item
with path "QG" is a child of the item with path "Q" and a parent of the item with path "QGC".
>> 
>> The trickiest query is, in English, "find all items with work less than zero and
whether they have any children with work less than zero".  The SQL for this is
>> SELECT item.*, EXISTS (SELECT work FROM item AS d WHERE d.path > item.path AND
d.path <= item.path || '\ufffd' AND d.work < 0) AS undonePrereq, FROM item WHERE work
< 0
>> 
>> Can this be done in CouchDB, using a limited, small number of queries?
>> 
>> My closest sally is the map function
>> function(doc) {
>>  if (doc.work < 0) {
>>    var key = [];
>>    var i;
>>    for (i=0; i<doc._id.length; ++i)
>>      key.push(doc._id.charCodeAt(i));
>>    emit(key, doc.work);
>>  }
>> }
>> 
>> and the reduce function
>> function(keys, values, rereduce) {
>>  var shortestKeyLength = Infinity;
>>  for (var i=0; i<keys.length; ++i) {
>>    if (keys[i][0].length < shortestKeyLength)
>>        shortestKeyLength = keys[i][0].length;
>>  }
>> 
>>  return [keys.length, shortestKeyLength, keys[0][0].slice(0,shortestKeyLength), values.length];
>> }
>> 
>> A query such as
>> curl -X GET 'http://127.0.0.1:5984/tracker1/_design/trackerA/_view/undoneArrayNum?startkey=\[45,65,65\]&endkey=\[45,65,9999\]&group_level=2'
>> will return the data necessary for items at the second level, but the desired items
could be at any level.

Doug Reeder
reeder.29@gmail.com
http://reeder29.livejournal.com/
https://twitter.com/reeder29

https://twitter.com/hominidsoftware
http://outlinetracker.com









Mime
View raw message