package com.mongodb.hadoop; import com.jayway.awaitility.Awaitility; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.MongoClientURI; import com.mongodb.hadoop.testutils.BaseHadoopTest; import com.mongodb.hadoop.util.MongoClientURIBuilder; import org.junit.After; import org.junit.Before; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import static java.lang.String.format; import static org.junit.Assert.assertEquals; public class TreasuryTest extends BaseHadoopTest { private static final Logger LOG = LoggerFactory.getLogger(TreasuryTest.class); public static final File TREASURY_YIELD_HOME; public static final File TREASURY_JSON_PATH; private final MongoClientURI outputUri; private final MongoClientURI inputUri; private final List<DBObject> reference = new ArrayList<DBObject>(); protected static final File JOBJAR_PATH; static { TREASURY_YIELD_HOME = new File(PROJECT_HOME, "examples/treasury_yield"); TREASURY_JSON_PATH = new File(TreasuryTest.TREASURY_YIELD_HOME, "/src/main/resources/yield_historical_in.json"); JOBJAR_PATH = findProjectJar(TreasuryTest.TREASURY_YIELD_HOME); } public TreasuryTest() { reference.add(dbObject("_id", 1990, "count", 250, "avg", 8.552400000000002, "sum", 2138.1000000000004)); reference.add(dbObject("_id", 1991, "count", 250, "avg", 7.8623600000000025, "sum", 1965.5900000000006)); reference.add(dbObject("_id", 1992, "count", 251, "avg", 7.008844621513946, "sum", 1759.2200000000005)); reference.add(dbObject("_id", 1993, "count", 250, "avg", 5.866279999999999, "sum", 1466.5699999999997)); reference.add(dbObject("_id", 1994, "count", 249, "avg", 7.085180722891565, "sum", 1764.2099999999996)); reference.add(dbObject("_id", 1995, "count", 250, "avg", 6.573920000000002, "sum", 1643.4800000000005)); reference.add(dbObject("_id", 1996, "count", 252, "avg", 6.443531746031742, "sum", 1623.769999999999)); reference.add(dbObject("_id", 1997, "count", 250, "avg", 6.353959999999992, "sum", 1588.489999999998)); reference.add(dbObject("_id", 1998, "count", 250, "avg", 5.262879999999994, "sum", 1315.7199999999984)); reference.add(dbObject("_id", 1999, "count", 251, "avg", 5.646135458167332, "sum", 1417.1800000000003)); reference.add(dbObject("_id", 2000, "count", 251, "avg", 6.030278884462145, "sum", 1513.5999999999985)); reference.add(dbObject("_id", 2001, "count", 248, "avg", 5.02068548387097, "sum", 1245.1300000000006)); reference.add(dbObject("_id", 2002, "count", 250, "avg", 4.61308, "sum", 1153.27)); reference.add(dbObject("_id", 2003, "count", 250, "avg", 4.013879999999999, "sum", 1003.4699999999997)); reference.add(dbObject("_id", 2004, "count", 250, "avg", 4.271320000000004, "sum", 1067.8300000000008)); reference.add(dbObject("_id", 2005, "count", 250, "avg", 4.288880000000001, "sum", 1072.2200000000003)); reference.add(dbObject("_id", 2006, "count", 250, "avg", 4.7949999999999955, "sum", 1198.7499999999989)); reference.add(dbObject("_id", 2007, "count", 251, "avg", 4.634661354581674, "sum", 1163.3000000000002)); reference.add(dbObject("_id", 2008, "count", 251, "avg", 3.6642629482071714, "sum", 919.73)); reference.add(dbObject("_id", 2009, "count", 250, "avg", 3.2641200000000037, "sum", 816.0300000000009)); reference.add(dbObject("_id", 2010, "count", 189, "avg", 3.3255026455026435, "sum", 628.5199999999996)); inputUri = authCheck(new MongoClientURIBuilder() .collection("mongo_hadoop", "yield_historical.in")).build(); outputUri = authCheck(new MongoClientURIBuilder() .collection("mongo_hadoop", "yield_historical.out")).build(); } @Before public void setUp() { dropMongoHadoop(); mongoImport("yield_historical.in", TreasuryTest.TREASURY_JSON_PATH); } @After public void dropMongoHadoop() { try { Awaitility .await() .atMost(5, TimeUnit.MINUTES) .until(new Callable<Boolean>() { @Override public Boolean call() throws Exception { try { getClient(getInputUri()).getDB("mongo_hadoop").dropDatabase(); return true; } catch (Exception e) { LOG.error(e.getMessage(), e); return false; } } }); } catch (Exception e) { LOG.info(e.getMessage(), e); } } protected void compareDoubled(final DBCollection out) { List<DBObject> referenceDoubled = new ArrayList<DBObject>(); for (DBObject object : getReference()) { DBObject doubled = new BasicDBObject(); doubled.putAll(object); referenceDoubled.add(doubled); Integer count = (Integer) object.get("count") * 2; Double sum = (Double) object.get("sum") * 2; doubled.put("count", count); doubled.put("avg", sum / count); doubled.put("sum", sum); } compareResults(out, referenceDoubled); } protected void compareResults(final DBCollection collection, final List<DBObject> expected) { List<DBObject> output = toList(collection.find().sort(new BasicDBObject("_id", 1))); assertEquals("count is not same: " + output, expected.size(), output.size()); for (int i = 0; i < output.size(); i++) { final DBObject doc = output.get(i); // round to account for slight changes due to precision in case ops are run in different order. DBObject referenceDoc = expected.get(i); assertEquals(format("IDs[%s] do not match: %s%n vs %s", i, doc, referenceDoc), doc.get("_id"), referenceDoc.get("_id")); assertEquals(format("counts[%s] do not match: %s%n vs %s", i, doc, referenceDoc), doc.get("count"), referenceDoc.get("count")); assertEquals(format("averages[%s] do not match: %s%n vs %s", i, doc, referenceDoc), round((Double) doc.get("avg"), 7), round((Double) referenceDoc.get("avg"), 7)); } } private BigDecimal round(final Double value, final int precision) { return new BigDecimal(value).round(new MathContext(precision)); } public List<DBObject> getReference() { return reference; } public MongoClientURI getOutputUri() { return outputUri; } public MongoClientURI getInputUri() { return inputUri; } }