diff --git a/.idea/misc.xml b/.idea/misc.xml index 8dc554d..e923908 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ - + diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/redis/RedisMap.java b/src/main/java/org/redis/RedisMap.java new file mode 100644 index 0000000..c2424ba --- /dev/null +++ b/src/main/java/org/redis/RedisMap.java @@ -0,0 +1,138 @@ +package org.redis; + +import redis.clients.jedis.JedisPool; + +import java.util.*; +import java.util.stream.Collectors; + +public class RedisMap implements Map { + private final JedisPool jedisPool; + private final String namespace; + + public RedisMap(JedisPool jedisPool, String namespace) { + this.jedisPool = jedisPool; + this.namespace = namespace; + } + + @Override + public int size() { + try (var jedis = jedisPool.getResource()) { + return jedis.keys(builtRedisKey("*")).size(); + } + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public boolean containsKey(Object key) { + try (var jedis = jedisPool.getResource()) { + return jedis.get(builtRedisKey(key)) != null; + } + } + + @Override + public boolean containsValue(Object value) { + try (var jedis = jedisPool.getResource()) { + for (var key : jedis.keys(builtRedisKey("*"))) { + if (Objects.equals(jedis.get(key), value)) { + return true; + } + } + return false; + } + } + + @Override + public String get(Object key) { + try (var jedis = jedisPool.getResource()) { + return jedis.get(builtRedisKey(key)); + } + } + + @Override + public String put(String key, String value) { + try (var jedis = jedisPool.getResource()) { + var rKey = builtRedisKey(key); + var oldValue = jedis.get(rKey); + jedis.set(rKey, value); + return oldValue; + } + } + + @Override + public String remove(Object key) { + try (var jedis = jedisPool.getResource()) { + var rKey = builtRedisKey(key); + var oldValue = jedis.get(rKey); + jedis.del(rKey); + return oldValue; + } + } + + @Override + public void putAll(Map m) { + try (var jedis = jedisPool.getResource()) { + for (var entry : m.entrySet()) { + jedis.set(builtRedisKey(entry.getKey()), entry.getValue()); + } + } + } + + @Override + public void clear() { + try (var jedis = jedisPool.getResource()) { + var keySet = jedis.keys(builtRedisKey("*")); + if (keySet.isEmpty()) return; + String[] keys = keySet.toArray(new String[0]); + jedis.del(keys); + } + } + + @Override + public Set keySet() { + try (var jedis = jedisPool.getResource()) { + var keysWithNamespace = jedis.keys(builtRedisKey("*")); + return keysWithNamespace.stream() + .map(rKey -> extractKey(rKey)) + .collect(Collectors.toSet()); + } + } + + @Override + public Collection values() { + try (var jedis = jedisPool.getResource()) { + List valiesList = new ArrayList<>(); + for (var key : jedis.keys(builtRedisKey("*"))) { + valiesList.add(jedis.get(key)); + } + return valiesList; + } + } + + @Override + public Set> entrySet() { + try (var jedis = jedisPool.getResource()) { + var entrySet = new HashSet>(); + + var keySet = jedis.keys(builtRedisKey("*")); + for (var rKey : keySet) { + var value = jedis.get(rKey); + + var key = extractKey(rKey); + entrySet.add(new AbstractMap.SimpleEntry<>(key, value)); + } + return entrySet; + } + } + + private String builtRedisKey(Object key) { + return namespace + ":" + key; + } + + private String extractKey(String rKey) { + return rKey.substring(namespace.length() + 1); + } +} diff --git a/src/test/java/org/redis/RedisMapTest.java b/src/test/java/org/redis/RedisMapTest.java new file mode 100644 index 0000000..5371a20 --- /dev/null +++ b/src/test/java/org/redis/RedisMapTest.java @@ -0,0 +1,153 @@ +package org.redis; + +import org.junit.jupiter.api.*; +import redis.clients.jedis.JedisPool; + +import java.util.Map; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class RedisMapTest { + + private RedisMap redisMap; + + @BeforeAll + void setup() { + var jedisPool = new JedisPool("localhost", 6379); + redisMap = new RedisMap(jedisPool, "testnamespace"); + redisMap.clear(); + } + + @AfterEach + void tearDown() { + redisMap.clear(); + } + + @Test + void sizeTest() { + var result = redisMap.size(); + Assertions.assertEquals(0, result); + } + + @Test + void isEmptyTest() { + var resultMapIsEmpty = redisMap.isEmpty(); + redisMap.put("key", "value"); + var resultMapNotEmpty = redisMap.isEmpty(); + Assertions.assertTrue(resultMapIsEmpty); + Assertions.assertFalse(resultMapNotEmpty); + } + + @Test + void getTest() { + var key = "key"; + var expectedValue = "value"; + redisMap.put(key, expectedValue); + var resultValue = redisMap.get(key); + Assertions.assertEquals(expectedValue, resultValue); + } + + @Test + void putTest() { + var key = "key"; + var expectedValue = "value"; + redisMap.put(key, expectedValue); + var size = redisMap.size(); + var resultValue = redisMap.get(key); + Assertions.assertEquals(1, size); + Assertions.assertEquals(expectedValue, resultValue); + } + + @Test + void removeTest() { + var expectedValue = "value"; + redisMap.put("key", expectedValue); + var removedValue = redisMap.remove("key"); + var isEmpty = redisMap.isEmpty(); + Assertions.assertEquals(expectedValue, removedValue); + Assertions.assertTrue(isEmpty); + } + + @Test + void keySetTest() { + String key1 = "key1", key2 = "key2"; + String value1 = "value1", value2 = "value2"; + redisMap.put(key1, value1); + redisMap.put(key2, value2); + var result = redisMap.keySet(); + Assertions.assertEquals(2, result.size()); + Assertions.assertTrue(result.contains(key1)); + Assertions.assertTrue(result.contains(key2)); + } + + @Test + void containsKeyTest() { + var key1 = "key1"; + var value1 = "value1"; + redisMap.put(key1, value1); + var containsKey = redisMap.containsKey(key1); + Assertions.assertTrue(containsKey); + } + + @Test + void containsValueTest() { + var key1 = "key1"; + var value1 = "value1"; + var value2 = "value2"; + redisMap.put(key1, value1); + var containsValue = redisMap.containsValue(value1); + var notContainsValue = redisMap.containsValue(value2); + Assertions.assertTrue(containsValue); + Assertions.assertFalse(notContainsValue); + } + + @Test + void putAllTest() { + String key1 = "key1", key2 = "key2"; + String value1 = "value1", value2 = "value2"; + Map map = Map.of( + key1, value1, + key2, value2 + ); + + redisMap.putAll(map); + var containsKey1 = redisMap.containsKey(key1); + var containsKey2 = redisMap.containsKey(key2); + var containsValue1 = redisMap.containsValue(value1); + var containsValue2 = redisMap.containsValue(value2); + Assertions.assertTrue(containsKey1); + Assertions.assertTrue(containsKey2); + Assertions.assertTrue(containsValue1); + Assertions.assertTrue(containsValue2); + + } + + @Test + void valuesTest() { + Map map = Map.of( + "key1", "value1", + "key2", "value1" + ); + var expectedValues = map.values(); + redisMap.putAll(map); + + var resultValues = redisMap.values(); + + Assertions.assertEquals(expectedValues.size(), resultValues.size()); + Assertions.assertTrue(resultValues.containsAll(expectedValues)); + } + + @Test + void entrySetTest() { + Map map = Map.of( + "key1", "value1", + "key2", "value1" + ); + redisMap.putAll(map); + + var expectedEntrySet = map.entrySet(); + var resultEntrySet = redisMap.entrySet(); + + Assertions.assertEquals(expectedEntrySet.size(), resultEntrySet.size()); + Assertions.assertTrue(resultEntrySet.containsAll(expectedEntrySet)); + } +}