map
was already supported in version 0.3. You could define map
functions in Scala as ..val mapfn = """(doc: dispatch.json.JsValue) => {
val it = couch.json.JsBean.toBean(doc, classOf[couch.json.TestBeans.Item_1])._3;
for (st <- it.prices)
yield(List(it.item, st._2))
}"""
Now you can do
reduce
too ..val redfn = """(key: List[(String, String)], values: List[dispatch.json.JsNumber], rereduce: Boolean) => {
values.foldLeft(BigDecimal(0.00))
((s, f) => s + (f match { case dispatch.json.JsNumber(n) => n }))
}"""
attach the
map
and reduce
functions to a view ..val view = new View(mapfn, redfn)
and finally fetch using the view query ..
val ls1 =
couch(test view(
Views.builder("big/big_lunch")
.build))
ls1.size should equal(1)
reduce
, by default returns only one row through a computation on the result set returned by map
. The above query does not use grouping and returns 1 row as the result. You can also use view results grouping and return rows grouped by keys ..val ls1 =
couch(test view(
Views.builder("big/big_lunch")
.options(optionBuilder group(true) build) // with grouping
.build))
ls1.size should equal(3)
For a more detailed discussion and examples have a look at the project home page documentation or browse through the test script ScalaViewServerSpec.
The current trunk is 0.3.1. The previous version has been tagged as 0.3 and available in tags folder.
Next up ..
- JPA like collections of objects directly from scouchdb views
- more capable reduce options (rereduce, collations etc.)
- replication
- advanced exception management with new dbDispatch
.. and lots of other features ..
Stay tuned!