You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@couchdb.apache.org by Nathan Vander Wilt <na...@calftrail.com> on 2011/12/07 21:40:05 UTC

Rewrite not able to combine multiple path parts into single query value?

I'm trying to spin up a very simple blog engine in CouchDB. Each post has a "path" property like "2010/11/building_ppc_couchdb" that I'd like to use via a rewrite rule as follows:
{
    "from": "/blog/*",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": "*"
    }
}

However, the asterisk in the rewrite rule seems to only capture the first path component in the logs I see:
/dev/_design/glob/_rewrite/blog/2010/11/building_ppc_couchdb     ...get rewritten to:
/dev/_design/glob/_list/posts/by_path?key=%222010%22&include_docs=true


So I thought maybe I'll just set up four or five rules like:
{
    "from": "/blog/:path1/:path2/:path3/",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": ":path1/:path2/:path3"
    }
}

...to handle anywhere from one to several path components. But in that case the variables in "key" don't get rewritten:
/dev/_design/glob/_list/posts/by_path?key=%22%3Apath1%2F%3Apath2%2F%3Apath3%22&include_docs=true&path1=2010&path2=11&path3=building_ppc_couchdb

The rewriter logic seems frustratingly fickle; are both of the above examples behaving as intended? The wiki documentation is pretty clear as far as matching goes, but fuzzy as far as how the subsequent templating into the "to" and "query" values is supposed to work.


The only way I've been able to figure out is to tweak my view function to .split("/") the path before emitting it, and then set up a handful of rules like:

{
    "from": "/blog/:path1/",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": [":path1"]
    }
}, {
    "from": "/blog/:path1/:path2/",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": [":path1",":path2"]
    }
}, {
    "from": "/blog/:path1/:path2/:path3/",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": [":path1",":path2",":path3"]
    }
}, {
    "from": "/blog/:path1/:path2/:path3/:path4/",
    "to": "_list/posts/by_path",
    "query": {
        "include_docs": "true",
        "key": [":path1",":path2",":path3",":path4"]
    }
}

This works, but is there a better way to accomplish this general idea?

thanks,
-natevw