Курсовой проект 2019 года курса "Использование баз данных" в Технополис.
Форкните проект, склонируйте и добавьте upstream:
$ git clone git@github.com:<username>/2019-db-lsm.git
Cloning into '2019-db-lsm'...
...
$ cd 2019-db-lsm
$ git remote add upstream git@github.com:polis-mail-ru/2019-db-lsm.git
$ git fetch upstream
From github.com:polis-mail-ru/2019-db-lsm
* [new branch] master -> upstream/master
Так можно запустить интерактивную консоль:
$ gradle run
А вот так -- тесты:
$ gradle test
Откройте в IDE -- IntelliJ IDEA Community Edition нам будет достаточно.
В своём Java package ru.mail.polis.<username> реализуйте интерфейс DAO, используя одну из реализаций java.util.SortedMap.
Возвращайте свою реализацию интерфейса в DAOFactory.
Продолжайте запускать тесты и исправлять ошибки, не забывая подтягивать новые тесты и фиксы из upstream. Если заметите ошибку в upstream, заводите баг и присылайте pull request ;)
Когда всё будет готово, присылайте pull request в master со своей реализацией на review. Не забывайте отвечать на комментарии в PR и исправлять замечания!
На данном этапе необходимо реализовать персистентное хранение данных на диске. Папка, в которую нужно складывать файлы, передаётся в качестве параметра DAOFactory.create(), где конструируется Ваша реализация DAO.
Как и раньше необходимо обеспечить прохождение тестов PersistenceTest, а также приветствуется добавление новых тестов отдельным pull request'ом.
На данном этапе необходимо реализовать (блокирующий) метод DAO.compact(), который должен устранять устаревшие версии ячеек на диске, чтобы не занимать лишнее место.
Необходимо обеспечить прохождение тестов CompactionTest.
Референсные реализации:
Менее очевидные моменты:
- Помните о лимите
-Xmx128m-- необходимо начинать сбрасывать данные на диск до возникновенияOutOfMemoryException - Удаления (a.k.a. tombstone) тоже нужно хранить, иначе это чревато "возрождением" удалённых значений
- Необходимо каким-либо образом упорядочивать значения для одного ключа по времени, чтобы возвращать наиболее "свежее"
- Эффективность навигации до
fromэлемента при реализацииDAO.iterator()-- линейная сложность неприемлема