From bc1f0b1b014626e91234e652815bd5f43caee019 Mon Sep 17 00:00:00 2001 From: lvca Date: Tue, 9 Nov 2021 10:37:17 -0500 Subject: [PATCH] Redis: implemented PING, EXISTS and HEXISTS commands Issue #203 --- .../arcadedb/redis/RedisNetworkExecutor.java | 35 +++++++++++ .../java/com/arcadedb/redis/RedisWTest.java | 61 ++++++++++++++----- 2 files changed, 82 insertions(+), 14 deletions(-) diff --git a/redisw/src/main/java/com/arcadedb/redis/RedisNetworkExecutor.java b/redisw/src/main/java/com/arcadedb/redis/RedisNetworkExecutor.java index e4f5dad123..d8514e7886 100755 --- a/redisw/src/main/java/com/arcadedb/redis/RedisNetworkExecutor.java +++ b/redisw/src/main/java/com/arcadedb/redis/RedisNetworkExecutor.java @@ -133,10 +133,18 @@ private void executeCommand(final Object command) { getDel(list); break; + case "EXISTS": + exists(list); + break; + case "HDEL": hDel(list); break; + case "HEXISTS": + hExists(list); + break; + case "HGET": hGet(list); break; @@ -162,6 +170,10 @@ private void executeCommand(final Object command) { incrBy(list, true); break; + case "PING": + ping(list); + break; + case "SET": set(list); break; @@ -199,6 +211,15 @@ private void decrBy(final List list) { value.append(newValue); } + private void exists(final List list) { + final String k = (String) list.get(1); + int total = 0; + for (int i = 1; i < list.size(); i++) + total += defaultBucket.containsKey(list.get(i)) ? 1 : 0; + + respondValue(total, false); + } + private void get(final List list) { final String k = (String) list.get(1); final Object v = defaultBucket.get(k); @@ -253,6 +274,14 @@ private void hDel(final List list) { value.append(deleted); } + private void hExists(final List list) { + final String bucketName = (String) list.get(1); + final String key = (String) list.get(2); + + final Record record = getRecord(bucketName, key); + respondValue(record != null ? 1 : 0, false); + } + private void hGet(final List list) { final String bucketName = (String) list.get(1); final String key = (String) list.get(2); @@ -339,6 +368,12 @@ private void set(final List list) { value.append("OK"); } + private void ping(final List list) { + final String response = list.size() > 1 ? (String) list.get(1) : "PONG"; + value.append("+"); + value.append(response); + } + private Object parseNext() throws IOException { final byte b = readNext(); diff --git a/redisw/src/test/java/com/arcadedb/redis/RedisWTest.java b/redisw/src/test/java/com/arcadedb/redis/RedisWTest.java index 0bec205629..32c7397e99 100644 --- a/redisw/src/test/java/com/arcadedb/redis/RedisWTest.java +++ b/redisw/src/test/java/com/arcadedb/redis/RedisWTest.java @@ -38,12 +38,37 @@ public class RedisWTest extends BaseGraphServerTest { public void testRAMCommands() { Jedis jedis = new Jedis("localhost", DEF_PORT); + // PING + Assertions.assertEquals("PONG", jedis.ping()); + Assertions.assertEquals("This is a test", jedis.ping("This is a test")); + // SET long beginTime = System.currentTimeMillis(); for (int i = 0; i < TOTAL_RAM; ++i) jedis.set("foo" + i, String.valueOf(i)); System.out.println("SET " + TOTAL_RAM + " items in the default bucket. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); + // EXISTS + Assertions.assertFalse(jedis.exists("fooNotFound")); + + beginTime = System.currentTimeMillis(); + for (int i = 0; i < TOTAL_RAM; ++i) + Assertions.assertTrue(jedis.exists("foo" + i)); + System.out.println("EXISTS " + TOTAL_RAM + " items in the default bucket. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); + + Assertions.assertEquals(0, jedis.exists("fooNotFound", "eitherThis")); + + beginTime = System.currentTimeMillis(); + for (int i = 0; i < TOTAL_RAM; i += 10) { + final String[] keyChunk = new String[10]; + for (int k = 0; k < 10; ++k) + keyChunk[k] = "foo" + (i + k); + Long result = jedis.exists(keyChunk); + Assertions.assertEquals(10, result); + } + System.out.println( + "MULTI EXISTS (chunk of 10 keys) " + TOTAL_RAM + " items in the default bucket. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); + // GET beginTime = System.currentTimeMillis(); for (int i = 0; i < TOTAL_RAM; ++i) @@ -90,18 +115,6 @@ public void testRAMCommands() { Assertions.assertNull(jedis.get("foo" + i)); } - @Test - public void testCommandNotSupported() { - Jedis jedis = new Jedis("localhost", DEF_PORT); - try { - jedis.aclList(); - Assertions.fail(); - } catch (JedisDataException e) { - // EXPECTED - Assertions.assertEquals("Command not found", e.getMessage()); - } - } - @Test public void testPersistentCommands() { Jedis jedis = new Jedis("localhost", DEF_PORT); @@ -120,6 +133,15 @@ public void testPersistentCommands() { jedis.hset(getDatabaseName(), "Account", "{'id':" + i + ",'email':'jay.miner" + i + "@commodore.com','firstName':'Jay','lastName':'Miner'}"); System.out.println("HSET " + TOTAL_PERSISTENT + " items to the database. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); + // HEXISTS + beginTime = System.currentTimeMillis(); + for (int i = 0; i < TOTAL_PERSISTENT; ++i) { + // RETRIEVE BY ID (LONG) + Assertions.assertTrue(jedis.hexists(getDatabaseName() + ".Account[id]", String.valueOf(i))); + Assertions.assertTrue(jedis.hexists(getDatabaseName() + ".Account[email]", "jay.miner" + i + "@commodore.com")); + } + System.out.println("HEXISTS " + TOTAL_PERSISTENT + " items to the database. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); + // HGET beginTime = System.currentTimeMillis(); JSONObject expectedJson = new JSONObject("{'firstName':'Jay','lastName':'Miner'}"); @@ -176,9 +198,8 @@ public void testPersistentCommands() { beginTime = System.currentTimeMillis(); for (int i = 0; i < TOTAL_PERSISTENT; i += 10) { final String[] ridChunk = new String[10]; - for (int k = 0; k < 10; ++k) { + for (int k = 0; k < 10; ++k) ridChunk[k] = rids.get(i + k).toString(); - } // RETRIEVE BY CHUNK OF 10 RIDS final List result = jedis.hmget(getDatabaseName(), ridChunk); @@ -203,6 +224,18 @@ public void testPersistentCommands() { System.out.println("HDEL " + TOTAL_PERSISTENT + " items from the database. Elapsed " + (System.currentTimeMillis() - beginTime) + "ms"); } + @Test + public void testCommandNotSupported() { + Jedis jedis = new Jedis("localhost", DEF_PORT); + try { + jedis.aclList(); + Assertions.fail(); + } catch (JedisDataException e) { + // EXPECTED + Assertions.assertEquals("Command not found", e.getMessage()); + } + } + @Override protected boolean isPopulateDatabase() { return false;