Направете gem за in-memory база от данни на Ruby.
- Цялата информация на базата от данни трябва да се съхранява локално в един файл, подобно на SQLite. Какъв да е самият формат, зависи от вашата имплементация -
json
,csv
или нещо което вие сте си дефинирали като формат. - Gem-а трябва да доставя достъп до базата посредством следния прост интерфейс или нещо сходно:
connection = RubyDB.connect('/path/to/db.json')
connection.execute('SELECT * FROM random_table')
- Базата трябва да разбира от подмножество на SQL
Вашата база от данни трябва да подържа следните операции за дефиниране на схемата:
- Създаване на таблици с множество колони притежаващи различни типове (поне
text
,integer
,float
). - Ограничения относно колоните за
NULL
(дали колоната може или не може да имаNULL
като валидна стойност). - Опционално, ограничения относно foreign keys.
- Стойности по подразбиране за колоните.
Примерно създаване на две таблици:
CREATE TABLE city(
id integer NOT NULL,
name text NOT NULL
);
CREATE TABLE shop(
id integer NOT NULL,
name text NOT NULL,
address text DEFAULT 'unknown',
city_id integer REFERENCES city(id)
);
Трябва да се подържат следните операции за модифициране на данните:
- Добавяне на нови записи в съществуващите таблици.
- Премахване на записи.
- Промяна на съществуващ запис по просто условие.
Например:
INSERT INTO city (id, name) VALUES (1, 'Sofia');
UPDATE city SET name = 'Burgas' WHERE id = 1;
DELETE FROM city WHERE id = 1;
Заявките към нашата база трябва да подържат следните неща:
- Избиране само на определени колони от таблиците.
- Филтриране по условия посочени в
WHERE
клаузата на заявката (прости сравнения=
,>
,<
,>=
,<=
,IN (list of values)
) - Ограничаване на броя върнати записи.
- Прескачане на определен брой записи.
- Сортиране на редовете по дадена колона.
- Join. Достатъчно е да имплементирате един вид join.
Примерни заявки към базата:
SELECT * FROM city ORDER BY id OFFSET 3 LIMIT 1;
SELECT name, address FROM shop WHERE id = 5;
SELECT shop.name, shop.address, city.name FROM shop JOIN city ON city.id = shop.city_id WHERE shop.name IN ('Elixir and Ruby', 'Grafiti');
- Всички примери са вдъхновени от sql синтаксиса на PostgreSQL. Това е само за примерни цели. Синтаксисът на вашия SQL може да се различава, с цел по-лесна работа с него, но трябва да подържа посочените горе операции.
- Съсредоточете се върху функционалноста, не върху бързината на операциите. Бързината няма да е фактор за оценяването ви.
- Прегледайте следния tutorial за още примери и вдъхновение.
- Въпреки, че се очаква комуникацията с библиотеката ви да минава през
SQL
- това не значи да създадете един гигантски метод, който парсваsql
-а. Вътрешно библиотеката ви може да създава множество класове, които да си взаимодействат така, че да възпроизведат нужния резултат. - Прочетете тази тема от форума.