From d047d1b24afb7d5ad2c70f1c8c47cc3e2d5a9f90 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 22 Apr 2019 00:10:10 +0200 Subject: [PATCH] Query optimizations --- .../database/blocks/DatabaseBlocksIO.java | 18 ++++++++++++++++++ .../references/DatabaseReferencesIO.java | 11 +++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksIO.java b/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksIO.java index 2a37500..2440579 100644 --- a/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksIO.java +++ b/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksIO.java @@ -55,6 +55,24 @@ public class DatabaseBlocksIO implements IBlocksIO { return fileIO.readAt(blockInfo.getIndex(), blockInfo.getSize()); } + public ByteBuffer readBlockSizeAndLastElementOfReferencesList(long blockId) throws IOException { + if (blockId == EMPTY_BLOCK_ID) { + return ByteBuffer.wrap(new byte[0]); + } + if (blockId == ERROR_BLOCK_ID) { + throw new IOException("Errored block id"); + } + if (blockId < 0) { + throw new IOException("Block id " + blockId + " is not valid"); + } + BlockInfo blockInfo = blocksMetadata.getBlockInfo(blockId); + if (blockInfo.getSize() >= Integer.BYTES * 2 + Long.BYTES) { + return fileIO.readAt(blockInfo.getIndex() + blockInfo.getSize() - (Integer.BYTES + Long.BYTES), Integer.BYTES + Long.BYTES); + } else { + return fileIO.readAt(blockInfo.getIndex(), blockInfo.getSize()); + } + } + @Override public void close() { diff --git a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java index 1fc0647..9af232c 100644 --- a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java +++ b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java @@ -53,4 +53,15 @@ public class DatabaseReferencesIO implements IReferencesIO { } return blocksIO.readBlock(blockId); } + + public ByteBuffer readFromReferenceSizeAndLastElementOfReferencesList(long reference) throws IOException { + long blockId; + lock.readLock().lock(); + try { + blockId = referencesMetadata.getReferenceBlockId(reference); + } finally { + lock.readLock().unlock(); + } + return blocksIO.readBlockSizeAndLastElementOfReferencesList(blockId); + } }