diff --git a/couchbase/pom.xml b/couchbase/pom.xml index a7d231a7a7e884c5e05c99800fe6ff33f6ca3fa8..10dfced32ddacbbf6528b53e48ed314c44ead41c 100644 --- a/couchbase/pom.xml +++ b/couchbase/pom.xml @@ -54,6 +54,13 @@ LICENSE file. <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> + <!-- Gson: Java to Json conversion --> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + <version>2.2.4</version> + <scope>compile</scope> + </dependency> </dependencies> <repositories> diff --git a/couchbase/src/main/java/com/yahoo/ycsb/db/CouchbaseClient.java b/couchbase/src/main/java/com/yahoo/ycsb/db/CouchbaseClient.java index d5179b34915ae86f4e18c52a91fce97172938a27..bf1338794e8e74cfb5526e5c0d3428b134221f25 100644 --- a/couchbase/src/main/java/com/yahoo/ycsb/db/CouchbaseClient.java +++ b/couchbase/src/main/java/com/yahoo/ycsb/db/CouchbaseClient.java @@ -17,11 +17,13 @@ package com.yahoo.ycsb.db; +import com.couchbase.client.protocol.views.*; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.gson.*; import com.yahoo.ycsb.ByteIterator; import com.yahoo.ycsb.DB; import com.yahoo.ycsb.DBException; @@ -37,6 +39,7 @@ import org.slf4j.LoggerFactory; import java.io.StringWriter; import java.io.Writer; +import java.lang.reflect.Type; import java.net.URI; import java.util.Arrays; import java.util.HashMap; @@ -82,6 +85,43 @@ public class CouchbaseClient extends DB { private boolean checkFutures; private boolean useJson; private final Logger log = LoggerFactory.getLogger(getClass()); + private volatile Stale stale; + public final ThreadLocal<Gson> gson = new ThreadLocal<Gson>() { + public Gson get() { + return GSON_BUILDER + .create(); + } + }; + + /** + * {@link Gson} instance builder + */ + private static GsonBuilder GSON_BUILDER = new GsonBuilder().registerTypeAdapter( + ByteIterator.class, + new JsonSerializer<ByteIterator>() { + + @Override + public JsonElement serialize( + ByteIterator arg0, + Type arg1, + JsonSerializationContext arg2) { + return new JsonPrimitive( + arg0.toString()); + } + }) + .registerTypeAdapter( + ByteIterator.class, + new JsonDeserializer<ByteIterator>() { + @Override + public ByteIterator deserialize( + JsonElement arg0, + Type arg1, + JsonDeserializationContext arg2) + throws JsonParseException { + return new StringByteIterator( + arg0.toString()); + } + }); @Override public void init() throws DBException { @@ -196,6 +236,38 @@ public class CouchbaseClient extends DB { @Override public Status scan(final String table, final String startkey, final int recordcount, final Set<String> fields, final Vector<HashMap<String, ByteIterator>> result) { + String designDoc = getProperties().getProperty("ddoc"); + String viewName = getProperties().getProperty("view"); + + if (designDoc == null || viewName == null) { + System.err.println("Scan requires [ddoc, view] params"); + return Status.ERROR; + } + + try { + final View view = client.getView(designDoc, viewName); + Query query = new Query().setRangeStart(startkey) + .setLimit(recordcount).setIncludeDocs(Boolean.TRUE) + .setStale(stale); + + ViewResponse response = client.query(view, query); + + HashMap<String, ByteIterator> resultMap = new HashMap<String, ByteIterator>(); + for (ViewRow row : response) { + Object obj = row.getDocument(); + if (obj == null) { + continue; + } + ByteIterator recVal = gson.get().fromJson(obj.toString(), + ByteIterator.class); + resultMap.put(row.getKey(), recVal); + } + result.add(resultMap); + return Status.OK; + } catch (Exception e) { + System.err.println(e.getMessage()); + } + return Status.ERROR; }