Added linkWalkAsType() method, added spec test for it, also added cache-busting logic to M/R tests.

This commit is contained in:
J. Brisbin
2010-12-10 11:00:11 -06:00
parent 1ab20270c1
commit e9ddfab942
2 changed files with 47 additions and 7 deletions

View File

@@ -527,6 +527,25 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue
*/
@SuppressWarnings({"unchecked"})
public <B, T, K> T linkWalk(B bucket, K key, String tag) {
return (T) linkWalkAsType(bucket, key, tag, null);
}
/**
* Use Riak's link walking mechanism to retrieve a multipart message that will be decoded like
* they were individual objects (e.g. using the built-in HttpMessageConverters of
* RestTemplate) and return the result as a list of objects of one of: <ol> <li>The type
* specified by <code>requiredType</code></li> <li>If that's null, try using the bucket name
* in which the object was stored</li> <li>If all else fails, use a {@link java.util.Map}</li>
* </ol>
*
* @param bucket
* @param key
* @param tag
* @param requiredType
* @return
*/
@SuppressWarnings({"unchecked"})
public <B, T, K> T linkWalkAsType(B bucket, K key, String tag, final Class<T> requiredType) {
final RestTemplate restTemplate = getRestTemplate();
final List<MediaType> types = new ArrayList<MediaType>();
types.add(MediaType.ALL);
@@ -540,7 +559,7 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue
}
},
new ResponseExtractor<Object>() {
@SuppressWarnings({"unchecked", "unchecked"})
@SuppressWarnings({"unchecked"})
public Object extractData(ClientHttpResponse response) throws
IOException {
String contentType = ((List) response.getHeaders().get("Content-Type")).get(0)
@@ -575,12 +594,17 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue
break;
}
}
Class clazz = Map.class;
if (null != bucketName) {
Class<?> clazz = requiredType;
if (null == clazz && null != bucketName) {
try {
clazz = Class.forName(bucketName);
} catch (ClassNotFoundException e) {
// Default to a Map. We know that will work.
clazz = Map.class;
}
} else {
// Default to a Map. We know that will work.
clazz = Map.class;
}
// Can convert message?

View File

@@ -40,6 +40,7 @@ class RiakTemplateSpec extends Specification {
@Shared def riakBin = System.getenv("RIAK_BIN") ?: "/usr/sbin/riak"
@Shared def p
/*
def setupSpec() {
p = "/usr/sbin/riak start".execute()
p.waitFor()
@@ -50,6 +51,7 @@ class RiakTemplateSpec extends Specification {
p = "/usr/sbin/riak stop".execute()
p.waitFor()
}
*/
def "Test Map object"() {
@@ -161,6 +163,18 @@ class RiakTemplateSpec extends Specification {
}
def "Test link walking as type"() {
when:
def val = riak.linkWalkAsType("test", "test", "test", Map)
then:
null != val
1 == val.size()
val.get(0) instanceof Map
}
def "Test getAndSet with Map"() {
given:
@@ -179,10 +193,11 @@ class RiakTemplateSpec extends Specification {
given:
MapReduceJob job = riak.createMapReduceJob()
def mapJs = new JavascriptMapReduceOperation("function(v){ ejsLog('/tmp/mapred.log', 'map v: '+JSON.stringify(v)); var o=Riak.mapValuesJson(v); return [1]; }\n")
def uuid = UUID.randomUUID().toString()
def mapJs = new JavascriptMapReduceOperation("function(v){ var uuid='$uuid'; ejsLog('/tmp/mapred.log', 'map input: '+JSON.stringify(v)); var o=Riak.mapValuesJson(v); return [1]; }")
def mapPhase = new RiakMapReducePhase("map", "javascript", mapJs)
def reduceJs = new JavascriptMapReduceOperation("function(v){ ejsLog('/tmp/mapred.log', 'red v: '+JSON.stringify(v)); var s=Riak.reduceSum(v); return s; }\n")
def reduceJs = new JavascriptMapReduceOperation("function(v){ var uuid='$uuid'; ejsLog('/tmp/mapred.log', 'reduce input: '+JSON.stringify(v)); var s=Riak.reduceSum(v); ejsLog('/tmp/mapred.log', 'reduce output: '+JSON.stringify(s)); return s; }")
def reducePhase = new RiakMapReducePhase("reduce", "javascript", reduceJs)
job.addInputs(["test"]).
@@ -202,10 +217,11 @@ class RiakTemplateSpec extends Specification {
given:
MapReduceJob job = riak.createMapReduceJob()
def mapJs = new JavascriptMapReduceOperation("function(v){ ejsLog('/tmp/mapred.log', 'map v: '+JSON.stringify(v)); var o=Riak.mapValuesJson(v); return [1]; }\n")
def uuid = UUID.randomUUID().toString()
def mapJs = new JavascriptMapReduceOperation("function(v){ var uuid='$uuid'; ejsLog('/tmp/mapred.log', 'map input: '+JSON.stringify(v)); var o=Riak.mapValuesJson(v); return [1]; }")
def mapPhase = new RiakMapReducePhase("map", "javascript", mapJs)
def reduceJs = new JavascriptMapReduceOperation("function(v){ ejsLog('/tmp/mapred.log', 'red v: '+JSON.stringify(v)); var s=Riak.reduceSum(v); return s; }\n")
def reduceJs = new JavascriptMapReduceOperation("function(v){ var uuid='$uuid'; ejsLog('/tmp/mapred.log', 'reduce input: '+JSON.stringify(v)); var s=Riak.reduceSum(v); ejsLog('/tmp/mapred.log', 'reduce output: '+JSON.stringify(s)); return s; }")
def reducePhase = new RiakMapReducePhase("reduce", "javascript", reduceJs)
job.addInputs(["test"]).