Query optimizations
This commit is contained in:
parent
dc56da3bbb
commit
d047d1b24a
@ -55,6 +55,24 @@ public class DatabaseBlocksIO implements IBlocksIO {
|
|||||||
return fileIO.readAt(blockInfo.getIndex(), blockInfo.getSize());
|
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
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
|
||||||
|
@ -53,4 +53,15 @@ public class DatabaseReferencesIO implements IReferencesIO {
|
|||||||
}
|
}
|
||||||
return blocksIO.readBlock(blockId);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user