/*
* Copyright 2011 VZ Netzwerke Ltd
* Copyright 2014 devbliss GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mongojack;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.mongojack.mock.MockObject;
public class TestMapReduce extends MongoDBTestBase {
private JacksonDBCollection<MockObject, String> coll;
@Before
public void setup() throws Exception {
coll = getCollection(MockObject.class, String.class);
}
@Test
public void testInlineMapReduce() throws Exception {
simpleMapReduce(MapReduce.OutputType.INLINE, null);
}
@Test
public void testReplaceMapReduce() throws Exception {
JacksonDBCollection<Simple, String> resultColl = getCollection(
Simple.class, String.class);
simpleMapReduce(MapReduce.OutputType.REPLACE, resultColl.getName());
}
private void simpleMapReduce(MapReduce.OutputType outputType,
String collection) {
coll.insert(new MockObject("foo", 10));
coll.insert(new MockObject("foo", 15));
coll.insert(new MockObject("bar", 5));
MapReduceOutput<Simple, String> output = coll
.mapReduce(MapReduce
.build("function() {emit(this.string, this.integer);}",
"function(k, vals) {var sum=0;for(var i in vals) sum += vals[i];return sum;}",
outputType, collection, Simple.class,
String.class));
Simple foo = null;
Simple bar = null;
for (Simple result : output.results()) {
if (result._id.equals("foo")) {
foo = result;
} else if (result._id.equals("bar")) {
bar = result;
} else {
fail("Unknown result: " + result._id);
}
}
assertNotNull(foo);
assertEquals(25, foo.value);
assertNotNull(bar);
assertEquals(5, bar.value);
}
public static class Simple {
public String _id;
public int value;
}
@Test
public void testComplexInlineMapReduce() throws Exception {
complexMapReduce(MapReduce.OutputType.INLINE, null);
}
@Test
public void testComplexReplaceMapReduce() throws Exception {
JacksonDBCollection<Complex, String> resultColl = getCollection(
Complex.class, String.class);
complexMapReduce(MapReduce.OutputType.REPLACE, resultColl.getName());
}
private void complexMapReduce(MapReduce.OutputType outputType,
String collection) {
coll.insert(new MockObject("foo", 10));
coll.insert(new MockObject("foo", 15));
coll.insert(new MockObject("bar", 5));
MapReduceOutput<Complex, String> output =
coll
.mapReduce(MapReduce
.build("function() {emit(this.string, {sum: this.integer, product: this.integer});}",
"function(k, vals) {var sum=0,product=1;for(var i in vals){sum+=vals[i].sum;product*=vals[i].product;}return {sum:sum,product:product};}",
outputType, collection, Complex.class,
String.class));
Complex foo = null;
Complex bar = null;
for (Complex result : output.results()) {
if (result._id.equals("foo")) {
foo = result;
} else if (result._id.equals("bar")) {
bar = result;
} else {
fail("Unknown result: " + result._id);
}
}
assertNotNull(foo);
assertEquals(25, foo.value.sum);
assertEquals(150, foo.value.product);
assertNotNull(bar);
assertEquals(5, bar.value.sum);
assertEquals(5, bar.value.product);
}
public static class Complex {
public String _id;
public Value value;
}
public static class Value {
public int sum;
public int product;
}
}