incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Chris Anderson <jch...@apache.org>
Subject Re: Subselect Possible?
Date Tue, 28 Sep 2010 16:44:34 GMT
On Tue, Sep 28, 2010 at 9:36 AM, Doug Reeder <reeder.29@gmail.com> wrote:
> The cmlenz post on CouchDB "Joins" is useful; are there other articles on CouchDB design
patterns?
>

banking transactions:

http://guide.couchdb.org/draft/recipes.html#banking

sql-ish:

http://guide.couchdb.org/draft/cookbook.html

>
> On Sep 28, 2010, at 11:18 AM, Paul Davis wrote:
>
>> On Tue, Sep 28, 2010 at 9:04 AM, Doug Reeder <reeder.29@gmail.com> wrote:
>>> 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?
>>>
>>
>> No, there's nothing in general. SQL is a query language. Views are
>> range matches. The question is if you can rephrase your subselect to
>> give you the same data using collation. It may seem a bit limiting at
>> first, but there are a few different methods for arranging data.
>>
>> For instance, things like this:
>> http://www.cmlenz.net/archives/2007/10/couchdb-joins
>> Or this might be helpful:
>> http://blog.couchone.com/post/1167966323/a-gentle-introduction-to-couchdb-for-relational
>>
>> If you're still not able to get what you want, you might want to try
>> couchdb-lucene.
>>
>> HTH,
>> Paul Davis
>>
>>>
>>> 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
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>
> Doug Reeder
> reeder.29@gmail.com
> http://reeder29.livejournal.com/
> https://twitter.com/reeder29
>
> https://twitter.com/hominidsoftware
> http://outlinetracker.com
>
>
>
>
>
>
>
>
>



-- 
Chris Anderson
http://jchrisa.net
http://couch.io

Mime
View raw message