From 11f0c515b013efcd99a471845c516d20e3c0b353 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 20 Jun 2012 10:05:16 +0200 Subject: [PATCH] DATAMONGO-378 - Fixed potential ClassCastException for MapReduceResults and upcoming MongoDB release. The type of the value returned for the total field of the timing map in map-reduce results has changed from Integer to Long as of MongoDB version 2.1.0 apparently. Changed MapReduceResults to accommodate either Integer or Long types. --- .../mongodb/core/mapreduce/MapReduceResults.java | 16 ++++++++++++++-- .../mapreduce/MapReduceResultsUnitTests.java | 13 +++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResults.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResults.java index a32cbf1a0..34769d7ea 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResults.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResults.java @@ -88,13 +88,25 @@ public class MapReduceResults implements Iterable { } if (timing.get("mapTime") != null && timing.get("emitLoop") != null && timing.get("total") != null) { - return new MapReduceTiming((Long) timing.get("mapTime"), (Integer) timing.get("emitLoop"), - (Integer) timing.get("total")); + return new MapReduceTiming(getAsLong(timing, "mapTime"), getAsLong(timing, "emitLoop"), + getAsLong(timing, "total")); } return new MapReduceTiming(-1, -1, -1); } + /** + * Returns the value of the source's field with the given key as {@link Long}. + * + * @param source + * @param key + * @return + */ + private Long getAsLong(DBObject source, String key) { + Object raw = source.get(key); + return raw instanceof Long ? (Long) raw : (Integer) raw; + } + /** * Parses the raw {@link DBObject} result into a {@link MapReduceCounts} value object. * diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResultsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResultsUnitTests.java index b5eafc998..ac7b29d61 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResultsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/MapReduceResultsUnitTests.java @@ -56,4 +56,17 @@ public class MapReduceResultsUnitTests { assertThat(results.getOutputCollection(), is("FOO")); } + /** + * @see DATAMONGO-378 + */ + @Test + public void handlesLongTotalInResult() { + + DBObject inner = new BasicDBObject("total", 1L); + inner.put("mapTime", 1L); + inner.put("emitLoop", 1); + + DBObject source = new BasicDBObject("timing", inner); + new MapReduceResults(Collections.emptyList(), source); + } }