diff --git a/redis/pom.xml b/redis/pom.xml
index 0d1de45d..c374869c 100644
--- a/redis/pom.xml
+++ b/redis/pom.xml
@@ -1,45 +1,69 @@
4.0.0
com.yahoo.ycsb
binding-parent
0.6.0-SNAPSHOT
../binding-parent
redis-binding
Redis DB Binding
jar
redis.clients
jedis
${redis.version}
com.yahoo.ycsb
core
${project.version}
provided
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 2.15
+
+ true
+ ../checkstyle.xml
+ true
+ true
+
+
+
+ validate
+ validate
+
+ checkstyle
+
+
+
+
+
+
diff --git a/redis/src/main/java/com/yahoo/ycsb/db/RedisClient.java b/redis/src/main/java/com/yahoo/ycsb/db/RedisClient.java
index 8d0d4e2a..fbcfcb0a 100644
--- a/redis/src/main/java/com/yahoo/ycsb/db/RedisClient.java
+++ b/redis/src/main/java/com/yahoo/ycsb/db/RedisClient.java
@@ -1,149 +1,157 @@
/**
* Copyright (c) 2012 YCSB contributors. All rights reserved.
*
* 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. See accompanying
* LICENSE file.
*/
/**
* Redis client binding for YCSB.
*
* All YCSB records are mapped to a Redis *hash field*. For scanning
* operations, all keys are saved (by an arbitrary hash) in a sorted set.
*/
package com.yahoo.ycsb.db;
+
import com.yahoo.ycsb.ByteIterator;
import com.yahoo.ycsb.DB;
import com.yahoo.ycsb.DBException;
import com.yahoo.ycsb.Status;
import com.yahoo.ycsb.StringByteIterator;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Protocol;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
+/**
+ * YCSB binding for Redis.
+ *
+ * See {@code redis/README.md} for details.
+ */
public class RedisClient extends DB {
- private Jedis jedis;
+ private Jedis jedis;
- public static final String HOST_PROPERTY = "redis.host";
- public static final String PORT_PROPERTY = "redis.port";
- public static final String PASSWORD_PROPERTY = "redis.password";
+ public static final String HOST_PROPERTY = "redis.host";
+ public static final String PORT_PROPERTY = "redis.port";
+ public static final String PASSWORD_PROPERTY = "redis.password";
- public static final String INDEX_KEY = "_indices";
+ public static final String INDEX_KEY = "_indices";
- public void init() throws DBException {
- Properties props = getProperties();
- int port;
+ public void init() throws DBException {
+ Properties props = getProperties();
+ int port;
- String portString = props.getProperty(PORT_PROPERTY);
- if (portString != null) {
- port = Integer.parseInt(portString);
- }
- else {
- port = Protocol.DEFAULT_PORT;
- }
- String host = props.getProperty(HOST_PROPERTY);
-
- jedis = new Jedis(host, port);
- jedis.connect();
-
- String password = props.getProperty(PASSWORD_PROPERTY);
- if (password != null) {
- jedis.auth(password);
- }
+ String portString = props.getProperty(PORT_PROPERTY);
+ if (portString != null) {
+ port = Integer.parseInt(portString);
+ } else {
+ port = Protocol.DEFAULT_PORT;
}
+ String host = props.getProperty(HOST_PROPERTY);
- public void cleanup() throws DBException {
- jedis.disconnect();
- }
+ jedis = new Jedis(host, port);
+ jedis.connect();
- /* Calculate a hash for a key to store it in an index. The actual return
- * value of this function is not interesting -- it primarily needs to be
- * fast and scattered along the whole space of doubles. In a real world
- * scenario one would probably use the ASCII values of the keys.
- */
- private double hash(String key) {
- return key.hashCode();
+ String password = props.getProperty(PASSWORD_PROPERTY);
+ if (password != null) {
+ jedis.auth(password);
}
-
- //XXX jedis.select(int index) to switch to `table`
-
- @Override
- public Status read(String table, String key, Set fields,
- HashMap result) {
- if (fields == null) {
- StringByteIterator.putAllAsByteIterators(result, jedis.hgetAll(key));
- }
- else {
- String[] fieldArray = (String[])fields.toArray(new String[fields.size()]);
- List values = jedis.hmget(key, fieldArray);
-
- Iterator fieldIterator = fields.iterator();
- Iterator valueIterator = values.iterator();
-
- while (fieldIterator.hasNext() && valueIterator.hasNext()) {
- result.put(fieldIterator.next(),
- new StringByteIterator(valueIterator.next()));
- }
- assert !fieldIterator.hasNext() && !valueIterator.hasNext();
- }
- return result.isEmpty() ? Status.ERROR : Status.OK;
+ }
+
+ public void cleanup() throws DBException {
+ jedis.disconnect();
+ }
+
+ /*
+ * Calculate a hash for a key to store it in an index. The actual return value
+ * of this function is not interesting -- it primarily needs to be fast and
+ * scattered along the whole space of doubles. In a real world scenario one
+ * would probably use the ASCII values of the keys.
+ */
+ private double hash(String key) {
+ return key.hashCode();
+ }
+
+ // XXX jedis.select(int index) to switch to `table`
+
+ @Override
+ public Status read(String table, String key, Set fields,
+ HashMap result) {
+ if (fields == null) {
+ StringByteIterator.putAllAsByteIterators(result, jedis.hgetAll(key));
+ } else {
+ String[] fieldArray =
+ (String[]) fields.toArray(new String[fields.size()]);
+ List values = jedis.hmget(key, fieldArray);
+
+ Iterator fieldIterator = fields.iterator();
+ Iterator valueIterator = values.iterator();
+
+ while (fieldIterator.hasNext() && valueIterator.hasNext()) {
+ result.put(fieldIterator.next(),
+ new StringByteIterator(valueIterator.next()));
+ }
+ assert !fieldIterator.hasNext() && !valueIterator.hasNext();
}
-
- @Override
- public Status insert(String table, String key, HashMap values) {
- if (jedis.hmset(key, StringByteIterator.getStringMap(values)).equals("OK")) {
- jedis.zadd(INDEX_KEY, hash(key), key);
- return Status.OK;
- }
- return Status.ERROR;
- }
-
- @Override
- public Status delete(String table, String key) {
- return jedis.del(key) == 0
- && jedis.zrem(INDEX_KEY, key) == 0
- ? Status.ERROR : Status.OK;
+ return result.isEmpty() ? Status.ERROR : Status.OK;
+ }
+
+ @Override
+ public Status insert(String table, String key,
+ HashMap values) {
+ if (jedis.hmset(key, StringByteIterator.getStringMap(values))
+ .equals("OK")) {
+ jedis.zadd(INDEX_KEY, hash(key), key);
+ return Status.OK;
}
-
- @Override
- public Status update(String table, String key, HashMap values) {
- return jedis.hmset(key, StringByteIterator.getStringMap(values)).equals("OK") ?
- Status.OK : Status.ERROR;
+ return Status.ERROR;
+ }
+
+ @Override
+ public Status delete(String table, String key) {
+ return jedis.del(key) == 0 && jedis.zrem(INDEX_KEY, key) == 0 ? Status.ERROR
+ : Status.OK;
+ }
+
+ @Override
+ public Status update(String table, String key,
+ HashMap values) {
+ return jedis.hmset(key, StringByteIterator.getStringMap(values))
+ .equals("OK") ? Status.OK : Status.ERROR;
+ }
+
+ @Override
+ public Status scan(String table, String startkey, int recordcount,
+ Set fields, Vector> result) {
+ Set keys = jedis.zrangeByScore(INDEX_KEY, hash(startkey),
+ Double.POSITIVE_INFINITY, 0, recordcount);
+
+ HashMap values;
+ for (String key : keys) {
+ values = new HashMap();
+ read(table, key, fields, values);
+ result.add(values);
}
- @Override
- public Status scan(String table, String startkey, int recordcount,
- Set fields, Vector> result) {
- Set keys = jedis.zrangeByScore(INDEX_KEY, hash(startkey),
- Double.POSITIVE_INFINITY, 0, recordcount);
-
- HashMap values;
- for (String key : keys) {
- values = new HashMap();
- read(table, key, fields, values);
- result.add(values);
- }
-
- return Status.OK;
- }
+ return Status.OK;
+ }
}
diff --git a/redis/src/main/java/com/yahoo/ycsb/db/package-info.java b/redis/src/main/java/com/yahoo/ycsb/db/package-info.java
new file mode 100644
index 00000000..d000d6c8
--- /dev/null
+++ b/redis/src/main/java/com/yahoo/ycsb/db/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2014, Yahoo!, Inc. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * The YCSB binding for Redis.
+ */
+package com.yahoo.ycsb.db;
+