From aed0d2745f375fae7366b9058be1eb9586e30612 Mon Sep 17 00:00:00 2001 From: Anton Khodakivskiy Date: Thu, 14 Feb 2019 20:00:17 +0200 Subject: [PATCH 1/2] HaloDB.contains method --- src/main/java/com/oath/halodb/HaloDB.java | 4 +++ .../java/com/oath/halodb/HaloDBInternal.java | 6 ++++- src/test/java/com/oath/halodb/HaloDBTest.java | 27 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oath/halodb/HaloDB.java b/src/main/java/com/oath/halodb/HaloDB.java index b0ea540..cae6236 100644 --- a/src/main/java/com/oath/halodb/HaloDB.java +++ b/src/main/java/com/oath/halodb/HaloDB.java @@ -56,6 +56,10 @@ public void delete(byte[] key) throws HaloDBException { } } + public boolean contains(byte[] key) { + return dbInternal.contains(key); + } + public void close() throws HaloDBException { try { dbInternal.close(); diff --git a/src/main/java/com/oath/halodb/HaloDBInternal.java b/src/main/java/com/oath/halodb/HaloDBInternal.java index a558cf0..8216db9 100644 --- a/src/main/java/com/oath/halodb/HaloDBInternal.java +++ b/src/main/java/com/oath/halodb/HaloDBInternal.java @@ -381,13 +381,17 @@ boolean clearSnapshot() { return false; } - return true; + return true; } else { logger.info("snapshot not existed"); return true; } } + boolean contains(byte[] key) { + return inMemoryIndex.containsKey(key); + } + void delete(byte[] key) throws IOException { writeLock.lock(); try { diff --git a/src/test/java/com/oath/halodb/HaloDBTest.java b/src/test/java/com/oath/halodb/HaloDBTest.java index acd92b6..0e23ca6 100644 --- a/src/test/java/com/oath/halodb/HaloDBTest.java +++ b/src/test/java/com/oath/halodb/HaloDBTest.java @@ -76,6 +76,33 @@ public void testPutUpdateAndGetDB(HaloDBOptions options) throws HaloDBException }); } + @Test(dataProvider = "Options") + public void testPutAndContainsDB(HaloDBOptions options) throws HaloDBException { + String directory = TestUtils.getTestDirectory("HaloDBTest", "testPutAndGetDB"); + + options.setCompactionDisabled(true); + + HaloDB db = getTestDB(directory, options); + + int noOfRecords = 10_000; + List records = TestUtils.insertRandomRecordsOfSize(db, noOfRecords, 128); + + List missingKeys = new ArrayList<>(); + for (int i = 0; i < noOfRecords; i++) { + missingKeys.add(TestUtils.generateRandomByteArray(64)); + } + + List actual = new ArrayList<>(); + db.newIterator().forEachRemaining(actual::add); + + Assert.assertTrue(actual.containsAll(records) && records.containsAll(actual)); + + records.forEach(record -> Assert.assertTrue(db.contains(record.getKey()))); + + missingKeys.forEach(key -> Assert.assertFalse(db.contains(key))); + } + + @Test(dataProvider = "Options") public void testCreateCloseAndOpenDB(HaloDBOptions options) throws HaloDBException { From f2c2cd34d0f5a3c0a7b64d44f9083b445aec2e28 Mon Sep 17 00:00:00 2001 From: Anton Khodakivskiy Date: Fri, 22 Feb 2019 02:06:58 +0200 Subject: [PATCH 2/2] HaloDB.size method --- src/main/java/com/oath/halodb/HaloDB.java | 4 ++++ src/main/java/com/oath/halodb/HaloDBInternal.java | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/oath/halodb/HaloDB.java b/src/main/java/com/oath/halodb/HaloDB.java index cae6236..2424406 100644 --- a/src/main/java/com/oath/halodb/HaloDB.java +++ b/src/main/java/com/oath/halodb/HaloDB.java @@ -40,6 +40,10 @@ public byte[] get(byte[] key) throws HaloDBException { } } + public int size(byte[] key) { + return dbInternal.size(key); + } + public boolean put(byte[] key, byte[] value) throws HaloDBException { try { return dbInternal.put(key, value); diff --git a/src/main/java/com/oath/halodb/HaloDBInternal.java b/src/main/java/com/oath/halodb/HaloDBInternal.java index 8216db9..ee47597 100644 --- a/src/main/java/com/oath/halodb/HaloDBInternal.java +++ b/src/main/java/com/oath/halodb/HaloDBInternal.java @@ -414,6 +414,15 @@ long size() { return inMemoryIndex.size(); } + int size(byte[] key) { + InMemoryIndexMetaData metaData = inMemoryIndex.get(key); + if (metaData == null) { + return -1; + } + + return metaData.getValueSize(); + } + void setIOErrorFlag() throws IOException { DBMetaData metaData = new DBMetaData(dbDirectory); metaData.loadFromFileIfExists();