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; +