dbms-class-2022/tasks

Задача №0

Opened this issue · 0 comments

Задача для разминки. Никаких баллов не приносит, peer code review не требуется. Нужна для того, чтобы убедиться, что вы можете работать с кодом и гитхабом.

Сценарий

  1. Поставить git, Java 17, gradle, любимую IDE или редактор.
  2. Посмотреть в этот каталог в репозитории project0. Там вы найдёте класс TaskSetup, который создаёт "базу данных" с двумя таблицами table1 и table2, каждая из которых состоит из трех столбцов, и заполняет их данными. Будем считать, что в таблице table1 столбцы называются id, address, weather, а в таблице table2 -- id, date, buzzwords. Фактически атрибут table1.id является ключом, а table2.id является внешним ключом для table1.id
  3. Склонировать репозиторий https://github.com/dbms-class-2022/project0 к себе на рабочую машину. Делать форки репозитория на гитхабе не нужно. Ключевое слово: git clone. Клонируйте через SSH, потому что через HTTPS вы не сможете сделать git push.
  4. Сделать свою ветку (branch), названную task0-<ваша фамилия>, например task0-barashev. Постарайтесь, чтоб из названия ветки было понятно, как зовут её автора. Ключевое слово: git checkout -b task0-my-last-name
  5. Написать код, решающий задачу
  6. Сделать git push в репозиторий https://github.com/dbms-class-2022/project0.
  7. Сделать pull request в репозитории https://github.com/dbms-class-2022/project0.

Задача

Написать в виде JUnit теста код, который выдаёт результат, эквивалентный запросу

SELECT id, date, weather FROM table1 JOIN table2 ON table1.id=table2.id WHERE EXTRACT(YEAR FROM date) = 2024

Это можно сделать прямо в классе DumbTest или же в своём классе. Язык -- Kotlin или Java -- не важен.
Результат -- тройки Record3<Int, Date, String> -- напечатайте в System.out

Важные ограничения: нельзя использовать для хранения данных в RAM ничего, кроме страниц PageCache и переменных константного размера (то есть, не зависящие от размера исходных данных или кеша). Идея "давайте прочитаем всё записи с диска в ArrayList в память и там сделаем два вложенных цикла" не работает. Кеш и storage нужно использовать те, которые создает TaskSetup при инициализации и заполнении таблиц.

После окончания работы алгоритма напишите в System.out значение storage.totalAcessCost

Never asked questions

Как читать записи из массива байт?

Примерно так:

new Record3(RecordsKt.intField(), RecordsKt.dateField(), RecordsKt.stringField()).fromBytes(byteArray)
Как вытащить год из даты? https://www.baeldung.com/java-year-month-day#java7
А как реализовать соединение? Например так: два вложенных цикла, один по записям одной таблицы, вложенный в него по записям другой, проверка на равенство идентификаторов.